次のシーケンスは、予想された2番目のコマンドの戻り値の代わりに、最初のコマンドの戻り値を提供します(サブシェルで最初のコマンドを実行したかどうかにかかわらず)。
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
それでは、実行時に2番目のコマンド()の戻り値の代わりに最初のコマンド()の戻り値を取得するのはなぜですか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 $?;
しかし、PHP関数に入れるので、1行で必要ですshell_exec()
。 2回実行すると、shell_exec()
コマンドを1行に入力するのと同じ結果が表示されます。
答え1
こういう問題に直面した時、私はシャーロック・ホームズの真言に従い、いくら信じられないことでも不可能を取り除いた後、何が残るか考える傾向があります。もちろん、コンピュータには不可能なものはありませんが、当初は無視できるほど不可能なものもあります。 (これは元のタイトルである「command; command; echo $?
——戻り値が正しくありません。なぜですか?」よりも意味があります。)
この場合、
sudo systemctl start x; sudo systemctl is-active --quiet x; echo $?;
$?
成功を示すゼロで表されますsystemctl is-active
。サービス自体systemctl is-active
がアクティブではないという事実は、サービスとコマンドを入力するオペレータとの間に競争があることを強く示唆しています。デフォルトでは、サービスはsystemctl start
完了、systemctl is-active
実行、およびサービスがアクティブであることを検出するのに十分に開始されます。サービスが失敗し、人の入力がsystemctl is-active
見つかりました。非アクティブ状態です。
systemctl start
との間に短い遅延を追加すると、systemctl is-active
偽の肯定を防ぐことができます。
答え2
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
消えます。
答え3
この試み:
sudo systemctl start x && sudo systemctl is-active --quiet x; echo $?;
&&
システムは、前のコマンドが正常に完了した場合にのみコマンドを順次実行するように強制されます。