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
。
eval
Bashのマニュアルに書かれている内容によれば、パラメータとして与えられるとバックティックを返したいと思います。127
nonsense
パラメータの終了ステータスを取得するにはeval
?
答え1
以下を行うとき -
`nonsense`
echo $?
基本的には、「不可能なコマンドの出力を取得しようとしたときに終了ステータスを教えてください」と尋ねられ、答えは「コマンドが見つかりません」または127です。
しかし、次のようにすると
eval `nonsense`
echo $?
eval
「空の文字列を評価するときにevalの終了状態を教えてください」(意味のないコマンドの出力)と尋ねることは、引数なしで実行するのと同じです。
eval
パラメータなしで実行すると問題はなく、終了ステータスは0になります。
答え2
実際にはそれ以上です。
$ `nonsense`
bash: nonsense: command not found
$ echo "$?"
127
これは驚くべきことです。
bash
stdout から 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
(どんなコマンドも実行しない限り)