我试图寻找一个与此类似的问题,这些问题可以为我解决,但找不到一个可以完全回答我的确切问题的
。我想在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获取结果状态代码,但是我一直无法确定方法。任何帮助表示赞赏!
答案 0 :(得分:3)
如果您实际上担心退出状态,请不要立即使用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