首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash:&&运营商行为

bash:&&运营商行为
EN

Stack Overflow用户
提问于 2019-05-14 10:09:16
回答 2查看 238关注 0票数 3

我正在练习bash脚本,并有一个关于&&操作符的问题。

根据O‘食谱,如果前面的命令&&操作符失败了,那么它之前的命令应该停止执行

见下面的代码

代码语言:javascript
复制
-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执行并清理。这种行为更像是";“操作者。

有人能解释一下我错过了什么吗

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-14 10:24:27

这个问题与出口代码有关。

如果第一个命令表示成功,&&操作符将执行第二个命令。

考虑以下几点:

代码语言:javascript
复制
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> 

因此,现在考虑以下几点:

代码语言:javascript
复制
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删除某些内容,如果它不存在,请告诉我!

顺便说一下。您发布的代码中可能有错误。

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

票数 1
EN

Stack Overflow用户

发布于 2019-05-14 10:30:51

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

如果由于未定义变量而导致命令失败,则可以使用set -o nounsetset -u

代码语言:javascript
复制
set -u
cd "$dir1"
echo "$?"

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

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

来自man bash / cd

cd -L|[-P [-e]] [-@] 将当前目录更改为dir。如果不提供,则主shell变量的值是默认的。在dir之后的任何附加参数都将被忽略。可变CDPATH 定义包含dir的目录的搜索路径:搜索CDPATH中的每个目录名以查找dir。CDPATH中的替代目录名由冒号(:)分隔。 CDPATH中的null目录名与当前目录相同,即.''。如果dir以斜杠(/)开头,则不使用CDPATH。-P选项使cd使用物理目录结构 在遍历dir和处理..的实例之前解析符号链接。在dir中(还请参阅set builtin命令的-P选项);-L选项强制遵循符号链接。 通过处理..的实例后解析链接。在迪尔。如果..。出现在dir中,则通过从dir中移除前一个路径名组件(返回到斜杠或 开始的时候。如果-e选项与-P一起提供,并且在成功的目录更改后无法成功地确定当前的工作目录,cd将返回不成功的 状态。在支持它的系统上,-@选项将与文件关联的扩展属性显示为一个目录。目录更改之前,将-参数转换为$OLDPWD。 企图。如果使用CDPATH中的非空目录名,或者If -是第一个参数,并且目录更改成功,则将写入新工作目录的绝对路径名。 到标准输出。如果目录已成功更改,则返回值为;否则为false。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56127954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档