【问题标题】:Is it possible to get the exit code from a subshell?是否可以从子外壳中获取退出代码?
【发布时间】:2011-02-03 02:35:33
【问题描述】:

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

bash -c "some_command"
do something with code of some_command here

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

【问题讨论】:

  • 我不确定您间接执行的原因 - 子shell 确实从调用脚本继承了环境。试试export FOO="foo"; bash -c 'echo $FOO'(单引号,这样在子shell运行它之前它不会被扩展)。
  • 它确实继承了环境,但不会修改当前shell的环境。它将对环境进行的任何修改。 vars 死后会消失。
  • 如果你想在不破坏父 shell 的情况下运行某些东西,那么我会使用子 shell,tldp.org/LDP/abs/html/subshells.html

标签: bash scripting exit-code


【解决方案1】:

$? 将像往常一样包含some_command 的返回码。

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

【讨论】:

  • 请注意,local var=$(command) 不会返回退出代码。相反,你需要做local var; var=$(command)
【解决方案2】:

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

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

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

【讨论】:

  • 换句话说,(some_command) 而不是bash -c "some_command"
【解决方案3】:

这是$?PaggasMatti 提到的括号子shell 的图示:

$ (exit a); echo $?
-bash: exit: a: numeric argument required
255
$ (exit 33); echo $?
33

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

【讨论】:

  • 你的意思是$(…),而不是$ (…)?后者不仅无效,而且非常混乱。
  • @Evi1M4chine:在这种情况下,美元符号是提示符。它不是用来打字的。如我的回答中所述,裸括号设置了一个子shell,并允许您获取退出代码而不是实际退出主shell。
  • 啊。仍然使事情变得混乱。尽管标准提示与变量指示器相同,但这不是您的错。 :)
  • 在我的情况下,我正在寻找分配中使用的子shell的退出代码,它隐藏了子shell代码:RESULT=(exit 33); echo $?; echo $RESULT 返回:0exit
  • @J0hnG4lt:您缺少一个美元符号(您所做的是创建一个由字符串“exit”和“33”组成的数组)。命令替换看起来像:result=$(exit 33),但这仍然无法将代码保存在变量中。这是您需要做的:(exit 33); result=$? 请注意,我使用了小写的变量名。最好不要使用全大写的变量名,以避免可能与 shell 和环境变量发生冲突。
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 2010-12-18
  • 2021-03-17
  • 2011-03-29
  • 2022-12-01
  • 2021-04-26
  • 2012-02-19
  • 1970-01-01
相关资源
最近更新 更多