【发布时间】:2020-05-19 00:22:53
【问题描述】:
看看这个小脚本:
#!/bin/bash
function do_something() {(
set -e
mkdir "/opt/some_folder" # <== returns 1 -> abort?
echo "mkdir returned $?" # <== sets $0 to 0 again
rsync $( readlink -f "${BASH_SOURCE[0]}" ) /opt/some_folder/ # <== returns 23 -> abort?
echo "rsync returned $?" # <== sets $0 to 0 again
)}
# here every command inside `do_something` will be executed - regardless of errors
echo "run do_something in if-context.."
if ! do_something ; then
echo "running do_something did not work"
fi
# here `do_something` aborts on first error
echo "run do_something standalone.."
do_something
echo $?
我正在尝试执行 here 的建议(不要错过引入子 shell 的额外括号),但我没有单独执行函数(在我的情况下为 do_something),而是与 if 一起执行-表达式。
现在当我运行if ! do_something 时,set -e 命令似乎没有效果。
谁能给我解释一下?
【问题讨论】:
-
除了以这种方式记录它(正如 Simon Doppler 解释的那样)之外,如果
-e也会在if中中止,那将适得其反。请注意,if foo; then ....; else ....; fi的语义是执行 then 部分,如果foo返回零退出代码,则执行 else 部分,如果它返回非零退出代码。如果set -e会在调用foo时中止脚本,则else部分永远不会有机会被执行。
标签: bash if-statement subshell