繁体   English   中英

bash:&&运算符行为

[英]bash: && operator behaviour

我正在练习bash脚本,并对&&运算符有疑问

根据O'reily bash cookbook,如果&&运算符之前的命令失败,那么它之前的命令应该停止执行

见下面的代码

-bash-4.2$ pwd
/home/postgres
-bash-4.2$ mkdir testdir
-bash-4.2$ dir=testdir1
-bash-4.2$ cd $dir1 && rm -rf *
-bash-4.2$ echo $?
0
-bash-4.2$ ls

我希望rm -rf命令失败,因为命令cd testdir1失败,但是rm -rf执行并清理。 行为更像是“;” 运营商。

请有人解释一下,我错过了什么

该问题与退出代码有关。

如果第一个命令指示它成功,则&&运算符将执行第二个命令。

考虑以下:

gmc@linux-ihon:/tmp> rm -rf nonexistant
gmc@linux-ihon:/tmp> echo $?     # Note that there is no error message and the exit status is 0 (success).
0
gmc@linux-ihon:/tmp> rm -r nonexistant
rm: cannot remove 'nonexistant': No such file or directory
gmc@linux-ihon:/tmp> echo $?     # Note that there was an error message and the exit status is 1 (unsuccessful)
1
gmc@linux-ihon:/tmp> 

所以现在考虑以下内容:

gmc@linux-ihon:/tmp> rm -rf nonexistant && echo "rm success"
rm success
gmc@linux-ihon:/tmp> rm -r nonexistant && echo "rm success"
rm: cannot remove 'nonexistant': No such file or directory
gmc@linux-ihon:/tmp> 

在这种情况下,因为非耐用目录的rm -rf被认为是成功的,所以执行下一个命令。 而同一目录的rm -r被视为失败,因此不执行下一个命令。

我不确定为什么当目录不存在时rm -f会返回成功,有一种想法是,如果目录不存在,那么你已经实现了rm命令的预期结果,因此成功! 而没有-f选项,你明确要求rm删除一些东西,如果它不存在,请告诉我!

BTW。 您发布的代码中可能存在错误。

您将“坏”目录分配给变量dir dir=testdir1 但你cd $dir1 ,这相当于没有参数的cd (因为变量dir1不存在)。 因此,它将cd回到您的主目录(返回值:成功)。 从那里运行rm -rf *可能不是最好的主意。

命令失败意味着退出代码与0不同。

如果命令应该失败,因为未定义变量,则可以使用set -o nounsetset -u

set -u
cd "$dir1"
echo "$?"

set +u   # disable nounset
cd "$dir1"
echo "$?"

检查文档或实现中的退出代码。

来自man bash / cd

cd [-L | [-P [-e]] [ - @]] [dir]

将当前目录更改为dir。 如果未提供dir,则HOME shell变量的值是默认值 dir之后的任何其他参数都将被忽略。 变量CDPATH

定义包含dir的目录的搜索路径:在CDPATH中搜索dir的每个目录名称。 CDPATH中的备用目录名用冒号(:)分隔。 CDPATH中的空目录名与当前目录相同,即“。” 如果dir以斜杠(/)开头,则不使用CDPATH。 -P选项使cd使用物理目录结构

在遍历dir时和在dir中处理..的实例之前解析符号链接(另请参阅set builtin命令的-P选项); -L选项强制遵循符号链接

通过在处理dir中的实例后解析链接。 如果..出现在目录中,则通过从dir中删除前一个路径名组件,返回斜杠或者来处理它

dir的开头。 如果-e选项与-P一起提供,并且在成功更改目录后无法成功确定当前工作目录,则cd将返回不成功

状态。 在支持它的系统上, - @选项将与文件关联的扩展属性显示为目录。 在目录更改之前, - 的参数将转换为$ OLDPWD

尝试。 如果使用CDPATH中的非空目录名,或者 - 是第一个参数,并且目录更改成功,则写入新工作目录的绝对路径名

到标准输出。 如果目录已成功更改,则返回值为true; 否则是假的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM