「$?」とは何ですか?変数ですか?


23

質問はかなり単純です。を使用して、前のコマンドの終了コードを取得できます$?。しかし、それは正確に何ですか?

変数の名前に以外の特殊文字を使用することはできないため、変数とは思わない_

foo?foo=10

エラーになります: foo?foo=10: command not found

それが変数でない場合、それは何ですか?それに似た人はいますか?


回答:


23

それは何ですか?

$? コマンド、関数、またはスクリプト自体の終了ステータスを格納する組み込み変数です。

$?最後に実行されたコマンドの終了ステータスを読み取ります。関数が戻った後、関数で$?実行された最後のコマンドの終了ステータスを提供します。これは、関数に「戻り値」を与えるBashの方法です。0成功した場合に返され1 - 255、エラーの場合は範囲内の整数を返します。

それに似た人もいますか?

はい、bashにはこのような組み込み変数がいくつかあります。ここでリストを見ることができます。参照:http : //www.tldp.org/LDP/abs/html/exit-status.html


1
それはbashシェルでのみ利用可能ですか?
-daltonfury42

4
@ daltonfury42はありません、試みがBourneシェルといくつかの互換性を持っていることを任意のシェルがそれをサポートします(含むdashkshzsh、とりわけ)。
ムル

2
cshと魚$statusは同じ目的で使用
グレンジャックマン

22

$?は変数ですが、特別なものです。そのため、特殊文字を使用できます。 ($?)最後に実行されたフォアグラウンドパイプラインの終了ステータスに展開します。

それだけではなく、シェルはいくつかのパラメーターを特別に扱います。これらのパラメーターは参照のみ可能です。それらへの割り当ては許可されていません。

Variable    Meaning
$0          Filename of script
$1          Positional parameter #1
$2 - $9     Positional parameters #2 - #9
${10}       Positional parameter #10
$#          Number of positional parameters
"$*"        All the positional parameters (as a single word) *
"$@"        All the positional parameters (as separate strings)
${#*}       Number of positional parameters
${#@}       Number of positional parameters
$?          Return value
$$          Process ID (PID) of script
$-          Flags passed to script (using set)
$_          Last argument of previous command
$!          Process ID (PID) of last job run in background

* Must be quoted, otherwise it defaults to $@.

ソース:


2
"$*"単一の単語としてのすべての位置パラメータだけでなく、単一の単語としての最初の文字で区切られたすべての位置パラメータIFSです。$@引用符で囲まれていない場合、結果はフィールド分割の対象となるため、引用符で囲まれていない場合に使用される場合と同じ効果があります。
ムル

1
確かに、引用符で囲まれていない$ @と$ *は、どちらも単語分割の対象であるため同じです。引用符で囲まれた「$ @」は、個々のパラメーターにIFSの文字が含まれている場合でも、位置パラメーターの単語分割を保持します。
小次郎

1
それがシェルに使用されるときからの参照はありますか?Perlはそれらをシェルスクリプトから取ったのだろうか。
シンバク

これは、Perlよりも数十年前(または少なくとも数年前)に先行しています。Perl構文の多くは、シェル構文の影響を受けました。(Perlのは、1987年に生まれ、この構文の多くは、元のBourneシェル(1977年から来た)私は$ _が導入された100%ではないんだけど、それは1987年前にもほぼ確実だった。
ポップアップ

6

$?ある特殊なシェルパラメータ(変数)。

一般に、すべてのユーザー定義変数は、文字クラス([:alnum:]つまり[a-zA-Z0-9_]、で始まることはできません[0-9])の文字のみを使用して名前を付ける必要があります。

簡単に言えば、$?は、前のコマンドの終了コード(成功または失敗)を提供するシェル自体の内部機能と見なすことができる特別な変数(およびこれらのかなりの数があります)です。

これ読んで、変数に関するより多くのアイデアを得ることができます。


4

$?最後に実行されたコマンドのリターン/終了コードを常に保持するbashの特別な変数です。

を実行すると、ターミナルで表示できますecho $?

リターンコードの範囲は[0; 255]。通常、
戻りコード0はすべてが正常であることを意味します。
他の値はエラーを示します。ほとんどのアプリケーションは1、カスタム値を返します。コマンドが見つからなかった場合、変数には通常127

この変数を特定の値に設定する場合は、これを簡単に実行しbash -c "exit 5"て、たとえば戻りコードを返すことができます5


シェル関数は、必ずしもフォークすることなく終了ステータスを設定するPOSIX準拠の方法です。setstatus() { return 5; }
小次郎
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.