小编sto*_*ord的帖子

set -eo pipelinefail 在 ksh 和 bash 上有所不同

我想在发生任何故障(包括管道内部故障)时终止脚本。在bash中,你可以set -eo pipefail,但这在 ksh 中不起作用。

\n\n

例子:

\n\n
# x\nset -eo pipefail\nfalse | true\necho "done: $?" # reached in ksh, unexpected\nfalse\necho "done2" # not reached in either shell, as expected\n
Run Code Online (Sandbox Code Playgroud)\n\n
bash x        # prints nothing, as expected\nksh x         # done: 1\nksh --version # ... 93u+ 2012-08-01\n
Run Code Online (Sandbox Code Playgroud)\n\n

为什么 ksh 在这种情况下不会退出?

\n\n

编辑:添加另一个测试

\n\n

我将其与其他 shell 进行了比较,得到了不同的结果:

\n\n
-bash-5.0$ zsh -c \'set -eo pipefail; false | true; exit 2\' ; echo $?\n1\n-bash-5.0$ ksh -c \'set -eo pipefail; false …
Run Code Online (Sandbox Code Playgroud)

shell bash ksh pipe

5
推荐指数
1
解决办法
8805
查看次数

标签 统计

bash ×1

ksh ×1

pipe ×1

shell ×1