web-dev-qa-db-ja.com

$の意味?シェルスクリプトで

何をする

echo $?

bashプログラミングではどうですか?

129

これは、最後に実行されたコマンドの終了ステータスです。

たとえば、コマンド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

155
Arnaud Le Blanc

$?は、最後に実行されたコマンドの終了値を返します。 echo $?は、その値をコンソールに出力します。ゼロは実行の成功を意味し、ゼロ以外の値は失敗のさまざまな理由にマップされます。

したがって、スクリプト作成時。私は次の構文を使用する傾向があります

if [ $? -eq 0 ]; then
 # do something
else
 # do something else
fi

比較は、0と等しいか、または0と等しくないときに行われます。

14
Saurabh Ariyan

コマンドの最後のステータスコード(終了値)があります。

6
Ned Batchelder

echo $?-最後に実行されたコマンドの終了ステータスを提供します。この終了ステータスは、成功およびFailureを示すゼロ以外の値を意味するゼロを含む数値である可能性が高い

-これは、bashの1つの特別なパラメーター/変数です。

$?-変数「?」に格納されている値を提供します。

BASHのいくつかの同様の特別なパラメーターは1,2、*、#です(通常echoコマンドでは$ 1、$ 2、$ *、$#などとして見られます)。

5
Arun Karthik

から http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters

?
Expands to the exit status of the most recently executed foreground pipeline. 
2
evil otto

最後に実行されたUNIXコマンドの結果を出力します

0 implies true
1 implies false
1
Sojourner

最小限の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 セクションも参照してください;-)

ハッピーコーディング。

1
user166390