是否可以从子shell获取退出代码?

Geo*_*Geo 25 bash scripting exit-code

我们假设我有一个bash脚本,我称之为:

bash -c "some_command"
do something with code of some_command here
Run Code Online (Sandbox Code Playgroud)

是否有可能获得代码some_command?我不是some_command直接在运行脚本的shell中执行,因为我不想改变它的环境.

Mat*_*nen 29

$?将包含与some_command往常一样的返回代码.

当然它也可能包含来自bash的代码,万一在你的命令执行之前出现问题(错误的文件名,诸如此类).

  • 但请注意,“local var=$(command)”不会返回退出代码。相反,您需要执行“local var;” var=$(命令)` (4认同)
  • @TimPotapov “命令的退出状态被创建局部变量的退出状态覆盖”来自 [SC2155](https://www.shellcheck.net/wiki/SC2155#problematic-code-in-the-本地情况) (2认同)

Pau*_*ce. 26

以下是PaggasMatti$?提到的括号子壳的说明:

$ (exit a); echo $?
-bash: exit: a: numeric argument required
255
$ (exit 33); echo $?
33
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,代码是Bash错误,在第二种情况下,它是退出代码exit.

  • @ Evi1M4chine:在这种情况下,美元符号是提示符.这并不意味着打字.简单的括号设置了一个子shell,如我的答案中所述,允许您获取退出代码而不是实际退出主shell. (5认同)
  • 啊。仍然使事情变得混乱。尽管标准提示与变量指示符相同,但这不是您的错。:) (2认同)
  • @J0hnG4lt:您缺少一个美元符号(您所做的是创建一个由字符串“exit”和“33”组成的数组)。命令替换看起来像:“result=$(exit 33)”,但这仍然无法将代码保存在变量中。这就是你需要做的:`(exit 33); result=$?` 请注意,我使用了小写变量名称。最好不要使用全部大写的变量名,以避免与 shell 和环境变量发生冲突。 (2认同)

Pag*_*gas 7

您可以使用该$?变量,查看bash文档,它存储最后一个命令的退出状态.

此外,您可能想要查看bash(例如comm1 && (comm2 || comm3) && comm4)的括号样式命令块,它们总是在子shell中执行,因此不会改变当前环境,并且也更强大!

编辑:例如,当使用()样式块与bash -c'命令'相比时,您不必担心使用空格或任何其他特殊shell语法转义任何参数字符串.您直接使用shell语法,它是其余代码的正常部分.

  • 换句话说,`(some_command)`而不是`bash -c"some_command"` (3认同)