次のシーケンスは、予想された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
偽の肯定を防ぐことができます。