下面的序列给出了第一个命令的返回值,而不是我所期望的第二个命令的返回值(无论我在子subshell中运行第一个命令):
sudo systemctl start x; sudo systemctl is-active --quiet x; echo $?;
(sudo systemctl start x); sudo systemctl is-active --quiet x; echo $?;服务x坏了,无法启动,因此他没有运行。下面的命令ran of为我提供了一个正确的3返回值:
sudo systemctl is-active --quiet x; echo $?;那么,为什么我在运行command; command; echo $?时获得第一个命令(D5)的返回值,而不是使用echo $?获得第二个命令的返回值(3)?
我上GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)了。我知道,如果我把它分成两行,就行了:
sudo systemctl start x;
sudo systemctl is-active --quiet x; echo $?;但是我需要把它作为一个一行程序,就像我把它放在PHP函数中一样。运行两次shell_exec()与将命令放在一行中具有相同的结果。
发布于 2018-04-27 13:46:27
当我遇到这样的问题,我倾向于遵循夏洛克福尔摩斯的咒语,并考虑什么是不可信的,一旦不可能被消除。当然,对于电脑,没有什么是不可能的,但是有些事情是不太可能的,我们一开始就可以忽略它们。(这与原来的标题“command; command; echo $?-返回值不正确,为什么?”)更有意义。
在这种情况下,如果
sudo systemctl start x; sudo systemctl is-active --quiet x; echo $?;显示$?为0,这意味着systemctl is-active确实表示成功。一个单独的systemctl is-active显示服务不是活动的这一事实强烈地表明,在服务和输入命令的人工操作符之间存在竞争;基本上,服务确实启动,足以使systemctl start完成,systemctl is-active运行并找到服务活动,但随后服务失败,因此人工输入的systemctl is-active发现它不活动。
在systemctl start和systemctl is-active之间增加一个较短的延迟应避免出现假阳性。
发布于 2018-04-27 11:30:28
Systemd使服务在短时间内启动(0.1秒),然后服务崩溃。
返回应该是3的;
sudo systemctl start x; sleep 0.2; sudo systemctl is-active --quiet x; echo $?;与0.2秒相比,它返回的0不应该是这样的:
sudo systemctl start x; sleep 0.1; sudo systemctl is-active --quiet x; echo $?;而且,如果我做了systemctl start x; ps -fA | grep -i x,我会看到服务。如果我在那之后再运行ps,它就消失了。
发布于 2019-02-12 16:58:16
试试这个:
sudo systemctl start x && sudo systemctl is-active --quiet x; echo $?;只有当前面的命令成功完成时,&&才会强制系统按顺序运行这些命令。
https://unix.stackexchange.com/questions/440390
复制相似问题