参考网址:
shell中的set -x_sdgl的博客-CSDN博客
bash的set -e和set -o pipefail – 简书 (jianshu.com)
set -x
有时候我们需要跟踪shell执行的指令,来查看执行过程是怎样的。
这时,我们可以通过下面的命令,将每一个步骤都打印出来:
#/bin/bash set -x # 设置-x选项后,之后执行的每一条命令,都会显示的打印出来; # 在命令之前输出一个+号,并打印出替换变量后的命令内容; # 可以分析脚本中当前正在执行什么命令。 echo "脚本 start" echo "脚本 end"
执行的结果见下图
set -e
在”set -e”之后出现的代码,一旦出现了返回值非零,整个脚本就会立即退出。
这样可以避免执行代码出错后,还会继续执行后续代码的情况。
有时我们需要在bash中临时关闭这个特性,就可以使用代码set +e
来临时关闭这个特性。
set -o pipefail
前面set -e
的命令有一种例外,即:
#/bin/bash set -x # 设置-x选项后,之后执行的每一条命令,都会显示的打印出来; # 在命令之前输出一个+号,并打印出替换变量后的命令内容; # 可以分析脚本中当前正在执行什么命令。 echo "脚本 start" ls *.notexist | echo "hehe" echo "脚本 end"
即使ls *.notexist
执行失败了返回非零值,整个脚本并没有停止,而是继续往下执行,并最终返回成功(0)。有些场合这不是我们需要的。
原因是这里使用了pipeline,bash缺省使用pipeline的最后一个命令的返回值作为整条命令的返回值,这里最后一个命令是echo
,它的执行没错误,所以bash认为所有命令都执行成功了。
如果我们把echo 和ls换一个顺序:
#/bin/bash set -x # 设置-x选项后,之后执行的每一条命令,都会显示的打印出来; # 在命令之前输出一个+号,并打印出替换变量后的命令内容; # 可以分析脚本中当前正在执行什么命令。 echo "脚本 start" echo "hehe" | ls *.notexist echo "脚本 end"
此时就触发了命令返回值非零的条件。
命令set -o pipefail
就是用来解决这个问题,就是pipeline中的命令出错了,把这个非零返回值往后传递,作为整行命令的返回值。
#/bin/bash set -x set -o pipefail # 设置-x选项后,之后执行的每一条命令,都会显示的打印出来; # 在命令之前输出一个+号,并打印出替换变量后的命令内容; # 可以分析脚本中当前正在执行什么命令。 echo "脚本 start" ls *.notexist | echo "hehe" echo "脚本 end"
您必须登录才能发表评论。