evalの戻り値

evalの戻り値

Bashのマニュアルには次のように記載されています。

eval [arg ...]

          The  args  are read and concatenated together into a single com-
          mand.  This command is then read and executed by the shell,  and
          its  exit status is returned as the value of eval. If there are
          no args, or only null arguments, eval returns 0.

頑張る

eval `nonsense`
echo $?

明らかになる0

そして、バックティックコマンドを単独で実行すると、次のようになります。

`nonsense`
echo $?

明らかになる127

evalBashのマニュアルに書かれている内容によれば、パラメータとして与えられるとバックティックを返したいと思います。127nonsense

パラメータの終了ステータスを取得するにはeval

答え1

以下を行うとき -

`nonsense`
echo $?

基本的には、「不可能なコマンドの出力を取得しようとしたときに終了ステータスを教えてください」と尋ねられ、答えは「コマンドが見つかりません」または127です。

しかし、次のようにすると

eval `nonsense`
echo $?

eval「空の文字列を評価するときにevalの終了状態を教えてください」(意味のないコマンドの出力)と尋ねることは、引数なしで実行するのと同じです。

evalパラメータなしで実行すると問題はなく、終了ステータスは0になります。

答え2

実際にはそれ以上です。

$ `nonsense`
bash: nonsense: command not found
$ echo "$?"
127

これは驚くべきことです。

bashstdout から Split+glob 演算子の結果コマンドを実行する要求を受け取りますnonsense。出力が生成されないため、nonsenseコマンドを実行しないため、終了状態がゼロでなければならないと考えることができます。

ただし、実際には単純なコマンドラインに引数がなく、割り当てまたはリダイレクトのみがある場合、終了ステータスは実行の割り当てとプレーンワード(リダイレクトの対象ではない)に置き換えられた最後のコマンドの終了ステータスです(リダイレクトはありますが)。 failed 終了状態にも影響します)。

これは特に宿題に便利です。

存在する:

output=$(grep pattern file)
status=$?

grepその非コマンドの終了状態であれば、得られない出力と終了状態を得ることができます。$?

存在する:

output=$(cmd1) cmd2

つまり、割り当て単語とパラメータ単語の両方がある場合、終了ステータスはcmd1無視されます。$?含める終了ステータスですcmd2

そして only$outputに設定されますcmd2。例外はcmd2特殊な組み込み関数の場合です。

evalそんな特殊内蔵

$ a=0; a=1 eval; echo "$a"
1

bashほとんどの最新のPOSIXシェルにあります。

a=`exit 5` eval; echo "$?"

または

eval `exit 5`; echo "$?"

eval引数なしで実行した結果なので、0を出力します。特別な組み込みコマンドの終了ステータスを取得できるBourneシェルまたはksh88ではそうではありませんexit 5

このシェル内では、以下も見つけることができます。

$ a=`exit 3` set x; echo "$?"
3

set他の特殊な組み込み機能も同様です。

.もう一つの特別な組み込み機能です。 Bourneシェルとksh88から:

$ . /some/file `exit 4`; echo "$?"
4

/some/file(どんなコマンドも実行しない限り)

関連情報