使用`set -e`的Bash脚本不会停止在`... && ...`命令中

Modified on: Sat, 30 Jun 2018 04:22:30 +0800

我使用set -e第一个错误时停止bash脚本

除非我使用&&

的命令,否则一切正常

$ cat script
set -e
cd not_existing_dir && echo 123
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
I'm running! =P
$

与之相比:

$ cat script
set -e
cd not_existing_dir
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
$

第一个例子仍然回应I'm running!,但第二个例子没有。他们为什么表现不同?

UPD。类似的问题:https://stackoverflow.com/questions/6930295/set-e-and-short -tests

作者:Community,907th

最佳答案

这是记录在案的行为。
bash(1)手册页说明了set -e 强>,

  

如果失败的命令,shell不会退出
  是命令列表的一部分
  紧跟whileuntil关键字,
  ifelif保留字之后的部分测试,
  &&||列表中执行的任何命令的一部分
  除了最后的&&||之后的命令,
  管道中的任何命令,但最后一个,
  或者如果使用!反转命令的返回值
  [强调补充。]

POSIX Shell命令语言规范
确认这是正确的行为:

  

-e设置应被忽略
  执行复合列表时
  跟随whileuntilifelif保留字,
  以!保留字开头的管道,
  或者除了最后一个之外的AND-OR列表的任何命令。

第2.9.3节列表 < / a>该文件定义

  

AND-OR列表是一个或多个管道的序列
  由运算符“&amp;&amp;”和“||”分隔。

作者:G-Man

相关问答

添加新评论