Questions tagged «shell-script»

有关shell脚本,由shell解释的可执行文件(bash,zsh等)的问题。


4
关闭前执行命令
我想在计算机关闭之前执行一个简单的命令(定时不是必不可少的)。 对于启动,我可以使用/etc/rc.local; 是否有类似的关机方法? 请注意,我仍然想使用菜单中的集成关机按钮。即我不想每次通过终端关闭时都使用自定义脚本-它需要是自动的。

14
查找未使用的本地端口的最简单方法是什么?
查找未使用的本地端口的最简单方法是什么? 目前,我正在使用与此类似的东西: port=$RANDOM quit=0 while [ "$quit" -ne 1 ]; do netstat -a | grep $port >> /dev/null if [ $? -gt 0 ]; then quit=1 else port=`expr $port + 1` fi done 感觉到处都是回旋处,所以我想知道是否有更简单的路径,例如我所错过的内建路径。

5
确定文件是硬链接还是符号链接?
我正在创建一个shell脚本,该脚本将使用文件名/文件路径并确定文件是符号链接还是硬链接。 唯一的是,我不知道如何查看它们是否是硬链接。我创建了2个文件,一个是硬链接,另一个是符号链接,用作测试文件。但是,如何确定文件是Shell脚本中的硬链接还是符号文件? 另外,如何找到符号链接的目标分区?因此,假设我有一个链接到其他分区的文件,我如何找到该原始文件的路径?

4
我应该照顾不必要的猫吗?
许多命令行实用程序可以从管道或文件名参数中获取输入。对于长Shell脚本,我发现以a开头的链cat使其更具可读性,尤其是在第一个命令需要多行参数的情况下。 相比 sed s/bla/blaha/ data \ | grep blah \ | grep -n babla 和 cat data \ | sed s/bla/blaha/ \ | grep blah \ | grep -n babla 后一种方法效率较低吗?如果是这样,差异是否足以关心脚本是否运行(例如每秒运行一次)?可读性差异不大。

5
如何在条件语句中退出脚本?
我正在编写一个bash脚本,如果用户不是root用户,我想在其中退出。有条件的工作正常,但脚本不会退出。 [[ `id -u` == 0 ]] || (echo "Must be root to run script"; exit) 我尝试使用&&代替,;但是都没有用。


4
如何从数组中完全删除元素?
unset array[0]删除元素,但是如果我仍然echo ${array[0]}得到null值,还有其他方法可以执行此操作,但是如果数组的元素包含如下所示的空格 array[0]='james young' array[1]='mary' array[2]='randy orton' 但是这些也做不到 array=${array[@]:1} #removed the 1st element 现在我希望新数组像 array[0]='mary' array[1]='randy orton' 分配后,空格会引起麻烦,实际数组变得像替换一样。 array=(mary randy orton)

2
在bash脚本中抑制stderr消息
考虑以下(略微愚蠢的)脚本名称“ test1.sh”: #/bin/bash # sleep 10 & echo sleep pid = $! pkill sleep 运行它时,不仅得到回声的输出,而且还得到bash关于stderr睡眠死亡的报告: $ ./test1.sh sleep pid = 3551 ./test1.sh: line 5: 3551 Terminated sleep 10 在这种情况下,我想将打印输出抑制为stderr。我知道我可以在命令行中做到这一点,如下所示: $ ./test1.sh 2> /dev/null ......但有没有办法从抑制其内的脚本?(我知道我可以将其包装在第二个脚本中,并让包装器将其重定向,但是必须有一些更简单的方法...)


4
为什么(退出1)不退出脚本?
我有一个脚本,当我想要它时不会退出。 具有相同错误的示例脚本是: #!/bin/bash function bla() { return 1 } bla || ( echo '1' ; exit 1 ) echo '2' 我假设看到输出: :~$ ./test.sh 1 :~$ 但我实际上看到了: :~$ ./test.sh 1 2 :~$ ()命令链是否以某种方式创建作用域?什么是exit退出了,如果不是脚本?

7
将来更改时,如何加固bash脚本以免造成损害?
因此,我删除了我的主文件夹(或更确切地说,是我拥有写权限的所有文件)。发生的是我有 build="build" ... rm -rf "${build}/"* ... <do other things with $build> 在bash脚本中,并在不再需要$build时删除了声明及其所有用法-而是rm。Bash高兴地扩展到rm -rf /*。是的 我感到很愚蠢,安装了备份,重新进行了丢失的工作。试图摆脱耻辱。 现在,我想知道:什么是编写bash脚本以使此类错误不会发生或者至少不太可能发生的技术?例如,我写过吗 FileUtils.rm_rf("#{build}/*") 在Ruby脚本中,解释器会抱怨build没有声明,因此该语言可以保护我。 我在bash中考虑过的内容,除了合计rm(相关问题中的许多答案都提到了,这并非没有问题): rm -rf "./${build}/"* 那会杀死我目前的工作(一个Git回购),但没有别的。 rm在当前目录之外执行操作时,需要进行交互的变体/参数化。(找不到任何内容。)类似的效果。 是这样吗,或者还有其他方法可以编写这种意义上的“健壮” bash脚本吗?
46 bash  shell-script  rm 


3
在多个平台上找到正确的tmp目录
我有一个脚本,需要为其工作创建临时文件,然后自行清理。我的问题是关于为临时文件找到正确的基本目录。 该脚本需要在多个平台上工作:Git Bash(Windows),Solaris,Linux,OSX。在每个平台上,首选的temp目录均以不同的方式表示: Windows :(%TMP%可能还有%TEMP%) OSX: $TMPDIR Linux,UNIX:应该是,$TMPDIR但在我尝试的多个系统上似乎未设置 因此,在我的脚本中,我添加了以下样板: if test -d "$TMPDIR"; then : elif test -d "$TMP"; then TMPDIR=$TMP elif test -d /var/tmp; then TMPDIR=/var/tmp else TMPDIR=/tmp fi 这似乎太乏味了。有没有更好的办法?

8
为什么POSIX强制性实用程序未内置在Shell中?
这个问题的目的是回答好奇心,而不是解决特定的计算问题。问题是:为什么POSIX强制实用程序通常不内置在Shell实现中? 例如,我有一个脚本,该脚本基本上读取一些小的文本文件并检查它们的格式是否正确,但是由于大量的字符串操作,在我的计算机上运行该脚本需要27秒。通过调用各种实用程序,此字符串操作使成千上万的新进程变慢了。我非常相信,如果一些工具,建于,即grep,sed,cut,tr,和expr,那么脚本会在第二或更小(根据我用C的经验)。 似乎在许多情况下,构建这些实用程序都会使Shell脚本中的解决方案是否具有可接受的性能产生差异。 显然,有一个选择不内置这些实用程序的原因。也许在系统级别使用一个实用程序版本可以避免各种外壳使用该实用程序的多个不相等版本。我真的想不出很多其他原因来保持创建这么多新流程的开销,并且POSIX对实用程序进行了足够的定义,只要它们各自是POSIX,那么使用不同的实现就似乎不是什么大问题符合。至少没有这么多流程的低效率那样大的问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.