shell控制操作

更新时间 🔔🕙 2023年9月12日

参考网址:

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"
转载请备注引用地址:编程记忆 » shell控制操作