我的导出功能如下:
foo()
{
( set -e; false; echo foo is running; )
}
在以下命令
上foo && do_other_stuff
打印了“foo正在运行”并且do_other_stuff意外执行。
作为比较,命令
foo; echo $?
正常执行。
我的bash版本是4.3.33。所以这是一个错误?
答案 0 :(得分:0)
好的,我理解你问题的后半部分。
foo() { ( set -e; false; echo foo is running; ) }
foo; echo $? # just print 1
foo && echo bar # shows "foo is running" and "bar"
来自man:
如果失败的命令是紧跟在 while 或直到关键字之后的命令列表的一部分,则shell不会退出,之后的部分测试if 或 elif 保留字,是&& 或││列表中执行的任何命令的一部分,但以下命令除外最后的&& 或││,管道中的任何命令,但是最后一个命令,或者命令的返回值是否被反转!
这确实很难理解:^)
由于foo
之后是&&
,我知道shell不会立即退出。
做的时候:
foo() { ( set -e; false; echo foo is running; ); false; }
foo && echo bar # will only print "foo is running"
因为没有执行“set -e”。
我想你想做:
foo() {
( # facultative
return 1; # abort here with a non-zero status
echo foo is running
) # ...
}
foo && echo bar; echo $? # print "1"