我有一个复杂的脚本,我通常在其中单独测试每个命令是否成功。但是,在某些情况下,我必须执行一系列简单的操作,并且我更愿意从整个序列中获取退出状态,而不必费心单独检查每个命令。
这是我的第一次尝试,使用了一些任意命令:
#!/bin/bash
if ! (
set -e
cd test
touch foo
chown root:root foo)
then
echo "subshell failed"
else
echo "subshell completed"
fi
其set -e
目的是确保在遇到第一次失败时子 shell 会失败退出,但这不起作用。在这种情况下,如果目录test
不存在,脚本只会foo
在当前目录中创建,然后在chown
.
这样做的正确方法是什么?换句话说,只有当所有 3 个命令都完成且没有错误时,才会 echo 'subshell Completed' 吗?
正确的方法是检查每个命令的退出状态,并在此时执行适当的清理操作。 (除了打印适当的错误消息之外,但工具本身可能已经这样做了。)例如,如果创建了文件,但无法正确设置权限,您是否想要将文件留在那里还是应该(尝试)删除它?
(当然,这个特殊情况有点出乎意料,但无论如何。)
如果您不想那么花哨,那么只需说您只想在前一个命令成功时才运行每个命令,即将它们加入
&&
:请注意,这将使脚本在新创建的目录中运行。这可能是也可能不是您想要执行的操作,具体取决于脚本接下来要执行的操作。当然,您仍然可以使用子 shell 来隔离以下效果
cd
:或者完全取消
cd
:(如果您认为自己会使用 zsh,请不要将其用作
path
变量名;它会爆笑。)无论如何,忘记吧
set -e
。它不会做你想要的事情,而且很混乱,可能比无用更糟糕。参见例如BashFAQ 105回复:https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
强调我的。