相关疑难解决方法(0)

为什么 set -e 在带有括号 () 后跟 OR 列表 || 的子shell 中不起作用?

我最近遇到了一些这样的脚本:

( set -e ; do-stuff; do-more-stuff; ) || echo failed
Run Code Online (Sandbox Code Playgroud)

这对我来说看起来不错,但它不起作用!将set -e不适用,当你添加的||。没有它,它工作正常:

$ ( set -e; false; echo passed; ); echo $?
1
Run Code Online (Sandbox Code Playgroud)

但是,如果我添加||set -e则忽略:

$ ( set -e; false; echo passed; ) || echo failed
passed
Run Code Online (Sandbox Code Playgroud)

使用真正的、单独的 shell 可以按预期工作:

$ sh -c 'set -e; false; echo passed;' || echo failed
failed
Run Code Online (Sandbox Code Playgroud)

我已经在多个不同的 shell(bash、dash、ksh93)中尝试过这个,并且都以相同的方式运行,所以这不是一个错误。有人可以解释一下吗?

shell shell-script

42
推荐指数
2
解决办法
9427
查看次数

在 shell 命令(不是脚本)中获得“确保”/“最终”功能?

我需要知道命令是成功还是失败,然后无条件地运行一些清理。

用于执行顺序命令的正常选项似乎都不适用于此处:

$ mycmd.sh && rm -rf temp_files/    # correct exit status, cleanup fails if mycmd fails
$ mycmd.sh ;  rm -rf temp_files/  # incorrect exit status, always cleans up
$ mycmd.sh || rm -rf temp_files/    # correct exit status, cleanup fails if mycmd succeeds
Run Code Online (Sandbox Code Playgroud)

如果我要在 shell 脚本中执行此操作,我会执行以下操作:

#!/usr/bin/env bash
mycmd.sh
RET=$?
rm -rf temp_files
exit $RET
Run Code Online (Sandbox Code Playgroud)

有没有比分号将所有这些命令链接在一起更惯用的方法来在命令行上完成它?

command-line bash exit exit-status

7
推荐指数
2
解决办法
6109
查看次数

标签 统计

bash ×1

command-line ×1

exit ×1

exit-status ×1

shell ×1

shell-script ×1