以下序列为我提供了第一个命令的返回值,而不是我预期的第二个命令(无论我是否在子 shell 中运行第一个命令):
sudo systemctl start x; sudo systemctl is-active --quiet x; echo $?;
(sudo systemctl start x); sudo systemctl is-active --quiet x; echo $?;
该服务x
已损坏,无法启动 - 所以他没有运行。以下独立运行的命令为我提供了正确的返回值3
:
sudo systemctl is-active --quiet x; echo $?;
那么,为什么我0
在运行时得到第一个命令()的返回值,command; command; echo $?
而不是第二个命令的返回值(3
)echo $?
?
我在GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
。我知道,如果我把它分成两行,它会起作用:
sudo systemctl start x;
sudo systemctl is-active --quiet x; echo $?;
但我需要将它作为一个单线,因为我将它放在 PHPshell_exec()
函数中。运行两次shell_exec()
与将命令放在一行中的结果相同。
当我遇到这样的问题时,我倾向于遵循福尔摩斯的口头禅,并考虑一旦消除了不可能,剩下的东西,无论多么难以置信。当然,对于计算机来说,没有什么是不可能的,但是有些事情太不可能了,我们一开始就可以忽略它们。(这在原标题中更有意义,“
command; command; echo $?
——返回值不正确,为什么?”)在这种情况下,如果
显示
$?
为 0,这意味着systemctl is-active
确实表明成功。单独systemctl is-active
显示该服务未激活的事实强烈表明该服务与输入命令的人类操作员之间存在竞争;基本上,服务确实启动,足以systemctl start
完成,并systemctl is-active
运行并发现服务处于活动状态,但随后服务失败,因此人工输入systemctl is-active
发现它处于非活动状态。systemctl start
在和之间添加一个短暂的延迟systemctl is-active
应该避免误报。Systemd 会在短时间内(
0.1
秒)启动服务,然后服务崩溃。3
按原样返回;少于
0.2
几秒钟,它会返回0
,因为它不应该是:另外,如果我这样做,
systemctl start x; ps -fA | grep -i x
我会看到服务。如果我ps
在那之后再跑,它就消失了。尝试这个:
将
&&
强制系统按顺序运行命令,并且仅在前一个命令成功完成的情况下。