繁体   English   中英

如何从在eval中运行的子shell获取错误代码

[英]How to get error code from a subshell run within eval

我曾尝试寻找与此类似的问题,这些问题可以为我解决,但我找不到一个可以完全回答我的确切问题的方法。

我想在eval调用的子外壳内运行命令,并获取由子外壳内调用的函数返回的状态代码。

例如,我调用如下命令:

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'

目标是运行此命令以将这些环境变量添加到当前环境中。 唯一的方法是在子shell中调用some_command ,并让eval评估结果输出。 如果我没有子shell来执行此操作,则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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM