何をする
echo $?
bashプログラミングではどうですか?
これは、最後に実行されたコマンドの終了ステータスです。
たとえば、コマンドtrue
は常に0
のステータスを返し、false
は常に1
のステータスを返します。
true
echo $? # echoes 0
false
echo $? # echoes 1
マニュアルから:(シェルでman bash
を呼び出すことでアクセス可能)
$?
最後に実行されたフォアグラウンドパイプラインの終了ステータスに展開します。
慣例により、0
の終了ステータスは成功を意味し、ゼロ以外の戻りステータスは失敗を意味します。 終了ステータスの詳細ウィキペディア上 。
このオンラインマニュアルで見ることができるように、このような他の特別な変数があります: https://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
$?
は、最後に実行されたコマンドの終了値を返します。 echo $?
は、その値をコンソールに出力します。ゼロは実行の成功を意味し、ゼロ以外の値は失敗のさまざまな理由にマップされます。
したがって、スクリプト作成時。私は次の構文を使用する傾向があります
if [ $? -eq 0 ]; then
# do something
else
# do something else
fi
比較は、0
と等しいか、または0
と等しくないときに行われます。
コマンドの最後のステータスコード(終了値)があります。
echo $?-最後に実行されたコマンドの終了ステータスを提供します。この終了ステータスは、成功およびFailureを示すゼロ以外の値を意味するゼロを含む数値である可能性が高い
?-これは、bashの1つの特別なパラメーター/変数です。
$?-変数「?」に格納されている値を提供します。
BASHのいくつかの同様の特別なパラメーターは1,2、*、#です(通常echoコマンドでは$ 1、$ 2、$ *、$#などとして見られます)。
から http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
?
Expands to the exit status of the most recently executed foreground pipeline.
最後に実行されたUNIXコマンドの結果を出力します
0 implies true
1 implies false
最小限のPOSIX C終了ステータスの例
$?
を理解するには、最初にプロセス終了ステータスの概念を理解する必要があります。
Linuxの場合:
プロセスがexit
システムコールを呼び出すと、カーネルはプロセスが終了した後でもシステムコールに渡された値を保存します。
Exitシステムコールは、exit()
ANSI C関数によって呼び出され、return
からmain
を実行すると間接的に呼び出されます。
多くの場合fork
+ exec
で終了する子プロセス(Bash)を呼び出したプロセスは、wait
システムコールで子の終了ステータスを取得できます。
Bashコードを検討してください。
$ false
$ echo $?
1
Cの「同等」は次のとおりです。
false.c:
#include <stdlib.h> /* exit */
int main() {
exit(1);
}
bash.c:
#include <unistd.h> /* execl */
#include <stdlib.h> /* fork */
#include <sys/wait.h> /* wait, WEXITSTATUS */
#include <stdio.h> /* printf */
int main() {
if (fork() == 0) {
/* Call false. */
execl("./false", "./false", (char *)NULL);
}
int status;
/* Wait for a child to finish. */
wait(&status);
/* Status encodes multiple fields,
* we need WEXITSTATUS to get the exit status:
* http://stackoverflow.com/questions/3659616/returning-exit-code-from-child
**/
printf("$? = %d\n", WEXITSTATUS(status));
}
Bashでは、Enterキーを押すと、上記のようにfork + exec + waitが発生し、bashは$?
をforkされたプロセスの終了ステータスに設定します。
注:echo
などの組み込みコマンドの場合、プロセスを生成する必要はなく、Bashは$?
を0に設定するだけで外部プロセスをシミュレートします。
標準とドキュメント
POSIX 7 2.5.2 "特殊パラメーター" http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_05_02 :
?最新のパイプラインの10進終了ステータスに展開します(パイプラインを参照)。
man bash
「特別なパラメーター」:
シェルはいくつかのパラメーターを特別に扱います。これらのパラメーターは参照のみ可能です。それらへの割り当ては許可されていません。 [...]
?最後に実行されたフォアグラウンドパイプラインの終了ステータスに展開します。
ANSI CおよびPOSIXは、次のことを推奨します。
0
は、プログラムが成功したことを意味します
他の値:プログラムはなんとか失敗しました。
正確な値は、障害のタイプを示している可能性があります。
ANSI Cは値の意味を定義せず、POSIXは125より大きい値を指定します: 「POSIX」の意味は何ですか?
Bashはif
の終了ステータスを使用します
Bashでは、次のように、終了ステータス$?
を暗黙的に使用してif
ステートメントを制御します。
if true; then
:
fi
true
は、0を返すだけのプログラムです。
上記は次と同等です:
true
result=$?
if [ $result = 0 ]; then
:
fi
そして:
if [ 1 = 1 ]; then
:
fi
[
は奇妙な名前(およびそのように動作するBashビルトイン)を持つ単なるプログラムであり、1 = 1 ]
その引数も参照してください。 単一および二重の正方形の違いBashの括弧
.4.2特殊パラメーター の下の The Bash Manual を参照してください。
? -最後に実行されたフォアグラウンドパイプラインの終了ステータスに展開します。
$?
としてリストされていないため、見つけるのは少し困難です(変数名は「ちょうど」?
です)。もちろん exit status セクションも参照してください;-)
ハッピーコーディング。