bash - 如何从 eval 中运行的子 shell 获取错误代码
问题描述
我曾尝试寻找与此类似的问题来为我提供解决方案,但我找不到能完全回答我的确切问题的问题。
我想在 eval 调用中的子shell 中运行命令,并获取子shell 中调用的函数返回的状态代码。
例如,我调用这样的命令:
eval "$(some_command)"
if [ "${?}" -ne 0 ]
then
# do stuff if `some_command` returned status code not equal to zero
fi
此some_command
函数返回一个环境变量列表及其分配,如下所示:
$ some_command # Execute some_command in a standard fashion without eval or subshell
some_env_variable='some_value'
another_env_variable='another value'
目标是运行这个单一命令将这些环境变量添加到当前环境中。做到这一点的唯一方法是some_command
在子外壳中调用,并让 eval 评估结果输出。如果我在没有子外壳的情况下执行此操作,则 eval 将简单地运行some_command
,但不会评估其输出以将环境变量添加到当前环境。
这有效:
$ eval "some_command"
-bash: some_command: command not found
$ echo $?
127
这有效:
$ $(some_command)
-bash: some_command: command not found
$ echo $?
127
但这不起作用:
$ eval "$(some_command)"
-bash: some_command: command not found
$ echo $?
0
必须有某种方法可以从 some_command 获取结果状态码,但我无法确定如何。任何帮助表示赞赏!
解决方案
如果您真的关心退出状态,请不要eval
立即使用。
if envvars=$(some_command); then
eval "$envvars"
else
# do something else
fi
如果您需要确切的错误代码,而不仅仅是区分 0 和非零:
envvars=$(some_command)
rv=$? # save it for later if necessary
case $rv in
0) eval "$envvars" ;;
1) ... ;;
2) ... ;;
# etc
*) printf 'Some other error %d\n' "$rv" >&2 ;;
esac
推荐阅读
- python - Python中的倒排索引+用于查询的发布列表-我需要帮助才能使我的代码正常工作
- python - 检查数字是否在给定范围内?
- python - 如何在 django 中存储基于特定用户的图像?
- apache - 在 Apache Web 服务器中设置内容安全策略
- python - `concurrent.futures` 中的 `with` 函数
- android-studio - 重新加载片段后视图模型不返回任何数据
- python - ARM Thumb BL 指令循环到自身
- python - 当它是类的属性时,格式化硒定位器的正确方法是什么?
- css - 我应该对我的汉堡包进行什么轮换?
- javascript - 我可以通过鼠标点击在 Jekyll 主题之间切换吗?