如何从 eval 中的子 shell 运行 获取错误代码
How to get error code from a subshell run within eval
我曾尝试寻找与此类似的问题来解决我的问题,但 none 我可以找到完全回答我的确切问题的答案。
我想 运行 在 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
函数 returns 环境变量列表及其赋值如下:
$ 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
我曾尝试寻找与此类似的问题来解决我的问题,但 none 我可以找到完全回答我的确切问题的答案。
我想 运行 在 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
函数 returns 环境变量列表及其赋值如下:
$ 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