看一下这个小脚本:
#!/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 $?
我尝试按照这里的建议去做(不要错过引入子shell的额外括号),但我没有单独执行函数(在我的情况下是
do_something
),而是与if表达式一起执行。现在,当我运行
if ! do_something
时,set -e
命令似乎没有效果。有人能向我解释一下吗?
-e
也会在if
内部中止,那么这将是适得其反的。请注意,if foo; then ....; else ....; fi
的语义是执行_then_部分,如果foo
返回零退出代码,则执行_else_部分,如果它返回非零退出代码。如果set -e
甚至在这样调用foo
时中止脚本,则else
部分永远没有机会被执行。 - user1934428