为什么运行`systemctl start 时退出状态不同;systemctl is-active` 和 `systemctl is-active` 分别是?

man*_*tor 8 command-line bash exit-status

以下序列为我提供了第一个命令的返回值,而不是我预期的第二个(无论我是否在子 shell 中运行第一个命令):

sudo systemctl start x; sudo systemctl is-active --quiet x; echo $?;
(sudo systemctl start x); sudo systemctl is-active --quiet x; echo $?;
Run Code Online (Sandbox Code Playgroud)

该服务x已损坏且无法启动 - 所以他没有运行。以下独立运行的命令为我提供了正确的返回值,3因为它应该是:

sudo systemctl is-active --quiet x; echo $?;
Run Code Online (Sandbox Code Playgroud)

那么,为什么我0在运行时得到第一个命令 ( )command; command; echo $?的返回值而不是第二个命令的返回值 ( 3)echo $?呢?

我在GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)。我知道,如果我将它分成 2 行,它会起作用:

sudo systemctl start x;
sudo systemctl is-active --quiet x; echo $?;
Run Code Online (Sandbox Code Playgroud)

但是我需要将它作为单行,因为我将它放在 PHPshell_exec()函数中。运行两次shell_exec()与将命令放在一行中的结果相同。

Ste*_*itt 14

当我遇到这样的问题时,我倾向于遵循福尔摩斯的口头禅,并考虑一旦消除了不可能的事情,剩下的事情,无论多么难以置信。当然,对于计算机来说,没有什么是不可能的,但是有些事情是不可能的,我们一开始可以忽略它们。(这对原标题更有意义,“ command; command; echo $?——返回值不正确,为什么?”)

在这种情况下,如果

sudo systemctl start x; sudo systemctl is-active --quiet x; echo $?;
Run Code Online (Sandbox Code Playgroud)

显示$?为 0,这意味着systemctl is-active确实表明成功。单独systemctl is-active显示该服务未处于活动状态的事实强烈表明该服务与键入命令的人工操作员之间存在竞争;基本上,服务确实启动了,足以systemctl start完成,systemctl is-active运行并发现服务处于活动状态,但随后服务失败,因此人工输入systemctl is-active发现它处于非活动状态。

systemctl start和之间添加一个短暂的延迟systemctl is-active应该可以避免误报。