【发布时间】:2015-10-14 21:34:44
【问题描述】:
编辑这篇文章,原文在底部的“谢谢!”下面
command='a.out arg1 arg2 &'
eval ${command}
if [ $? -ne 0 ]; then
printf "Command \'${command}\' failed\n"
exit 1
fi
wait
这是一个演示问题的测试脚本,我把它简化了
在原帖中。注意第 2 行中的 & 和 wait 命令。
这些更忠实地代表了我的剧本。以防万一,与号
有时存在有时不存在,它的存在由用户决定-
指定的标志,指示是否将长算术作为背景
计算。而且,如果这很重要,我实际上是在为许多人提供背景
(十二) 个进程,即${command[0..11]}。如果有的话,我希望脚本死掉
失败。我使用'wait'来同步所有进程的成功返回。
很高兴(有点)使用另一种方法,但这几乎有效。
& 符号(用于背景)似乎导致了问题。
当${command} 省略与号时,脚本将按预期运行:
未找到可执行文件 a.out,发出有关此内容的投诉,
和美元?非零,因此主机脚本退出。当${command} 包括
& 号,发出同样的投诉,但 $?是零,所以
脚本继续执行。我希望脚本在
a.out 失败,但我如何从 a 获取非零返回值
后台进程?
谢谢!
(原帖):
我有一个使用表单命令的 bash 脚本
eval ${command}
if [ $? -ne 0 ]; then
printf "Command ${command} failed"
exit 1
fi
其中 ${command} 是一串单词,例如“a.out arg1 ... argn”。
问题是 eval 的返回码(即$?)总是
即使${command} 失败,也为零。从上面删除“eval”
sn-p 允许返回正确的返回码 ($?),因此
停止脚本。我需要将命令字符串保存在变量中
(${command}) 以便在其他地方操作它,并简单地运行
${command} 没有 eval 由于其他原因无法正常工作。我如何赶上
使用 eval 时返回码正确吗?
谢谢! 查理
【问题讨论】:
-
请创建一个minimal reproducible example 来演示该问题。对
eval true和eval false的快速检查显示$?的行为符合预期。 -
另外,我质疑
eval的必要性。你能准确地说明你为什么需要它吗?可能有一种方法可以在没有它的情况下做同样的事情。 -
(1)
eval确实返回命令的退出代码。如果您真的没有看到,您需要告诉我们${command}中的内容。 (2) 好的 bash 代码几乎从不使用eval。如果你认为你需要eval,你可能想解释一下原因,看看这里的人是否可以提供更好的方法。 -
eval的 Bash 手册说:eval [arguments]将参数连接在一起形成一个命令,然后读取并执行该命令,其退出状态作为 eval 的退出状态返回.如果没有参数或只有空参数,则返回状态为零。 因此,您所看到的与手册所说的内容背道而驰。