Bash

eval 的返回值

  • January 8, 2018

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

根據 bash 手冊中的內容,我希望在將反引號作為參數時eval返回。127``nonsense

如何獲取參數的退出狀態eval

當您執行以下操作時 -

`nonsense`
echo $?

您基本上是在問“當我嘗試獲取無意義命令的輸出時告訴我退出狀態”,答案是“找不到命令”或 127

但是當您執行以下操作時

eval `nonsense`
echo $?

你在問“當我評估一個空字元串時告訴我 eval 的退出狀態”(命令廢話的輸出),這等於eval不帶參數執行。

eval不帶參數執行沒有問題,退出狀態變為0

其實更多的是:

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

這在這裡令人驚訝。

我們要求bashnonsense. 由於nonsense不產生任何輸出,因此它不執行任何命令,因此您可能認為退出狀態應該為 0。

但實際上,當一個簡單的命令行沒有參數,只有賦值或重定向時,退出狀態是最後一個命令替換在賦值和執行的正常單詞(不在重定向目標中)的狀態(儘管重定向失敗也會影響退出狀態)。

這對分配特別有用。

在:

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

您可以獲得 的輸出和退出狀態,如果是該非命令的退出狀態grep,您將無法做到這一點。$?

在:

output=$(cmd1) cmd2

那就是同時存在賦值詞和參數詞的地方,cmd1忽略退出狀態。$?將包含 的退出狀態cmd2

而且,也$output只會設置為cmd2而已。例外情況是 whencmd2是一個特殊的內置函式。

eval是這樣一個特殊的內置

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

bash和大多數現代 POSIX shell 中。

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

或者

eval `exit 5`; echo "$?"

將輸出 0,因為它是eval不帶參數執行的結果。但在 Bourne shell 或 ksh88 中並非如此,對於特殊的內置命令,您將獲得那裡的退出狀態exit 5

在這些 shell 中,您還會發現:

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

就像set另一個特殊的內置函式一樣。

.是另一個特殊的內置函式。在 Bourne shell 和 ksh88 中:

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

(只要/some/file不執行任何命令)

引用自:https://unix.stackexchange.com/questions/414740