看一下这个小脚本:
#!/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-expression一起)单独执行该函数。
现在,当我运行if ! do_something
该set -e
命令时似乎没有任何效果。
谁可以给我解释一下这个?
这是Bash参考手册中所预期和描述的。
-e
[...]如果失败的命令是紧接在
while
oruntil
关键字之后的命令列表的一部分,则该外壳程序不会退出,这是if
语句[...]中测试的一部分。[...]
如果复合命令或Shell函数在
-e
忽略的上下文中执行-e
,则即使-e
已设置并且命令返回失败状态,复合命令或函数体内执行的所有命令都不会受到该设置的影响。如果-e
在-e
忽略上下文的情况下执行时设置了复合命令或shell函数,则该设置在复合命令或包含函数调用的命令完成之前不会生效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句