Bash cygwin 1.7.15“的处理;集合-e";在shell脚本中(子shell中的错误导致父脚本退出)

Bash cygwin 1.7.15“的处理;集合-e";在shell脚本中(子shell中的错误导致父脚本退出),bash,cygwin,Bash,Cygwin,我用的是: $ uname -a CYGWIN_NT-6.1 bassoon 1.7.15(0.260/5/3) 2012-05-09 10:25 i686 Cygwin $ bash --version GNU bash, version 4.1.10(4)-release (i686-pc-cygwin) $ cat myexpr.sh #!/bin/sh echo "In myexpr, Before expr" ac_optarg=`expr x--with-gnu-as : 'x[

我用的是:

$ uname -a
CYGWIN_NT-6.1 bassoon 1.7.15(0.260/5/3) 2012-05-09 10:25 i686 Cygwin
$ bash --version
GNU bash, version 4.1.10(4)-release (i686-pc-cygwin)
$ cat myexpr.sh
#!/bin/sh

echo "In myexpr, Before  expr"
ac_optarg=`expr x--with-gnu-as : 'x[^=]*=\(.*\)'`
echo "ac_optarg=$ac_optarg"
echo "In myexpr, After  expr"

$ cat myexpr2.sh
#!/bin/sh

set -e

echo "In myexpr, Before  expr"
ac_optarg=`expr x--with-gnu-as : 'x[^=]*=\(.*\)'`
echo "ac_optarg=$ac_optarg"
echo "In myexpr, After  expr"
这两个脚本之间的唯一区别是myexpr2.sh使用“set-e”

到目前为止,这是预期的行为

如果我在父shell(上面的PID 2880)中执行此操作:

父shell退出!这是pID 2880上面我做“set-e”的地方


这不是Linux或cygwin 1.5.12上的行为。这是cygwin中的bug还是cygwin上的BASH?

这不是bug,而是BASH环境的一个特性。如果未设置Bash shell环境变量execfail和/或shell环境变量errexit,则会发生这种情况

不同的Linux版本有不同的默认值。 您可以使用以下选项检查哪些已启用:

echo "SHELLOPTS=$SHELLOPTS"
echo "BASHOPTS=$BASHOPTS"
您可以通过以下方式查看所有这些内容:

set -o && echo -e "\n" && shopt -p 
因此,您需要通过以下方式启用您的:

shopt -s execfail
如果这不起作用,您可能还必须通过以下方式取消设置(关闭)$SHELLOPTS的errexit

set -o errexit
有关更多信息,请参阅:


PS.“set”使用的是反向逻辑,因此如果要使用“e”标志,必须使用“+”:
set+e

预期的行为是
ac\u optarg
具有空值?我认为您的
expr
命令有问题,这使得
set-e
中止第二个脚本。您好,是的,预期的行为是ac_optarg将为null,因为regexp将不会成功。异常的行为是当我在父shell中“set-e”时父shell退出。如果我在父shell中“set-e”并执行myexpr.sh(为了安全起见,我还在最后一行添加了出口0),则父shell将退出。仅适用于cygwin 1.7.15
set -o && echo -e "\n" && shopt -p 
shopt -s execfail
set -o errexit