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
。根據 bash 手冊中的內容,我希望在將反引號作為參數時
eval
返回。127``nonsense
如何獲取參數的退出狀態
eval
?
當您執行以下操作時 -
`nonsense` echo $?
您基本上是在問“當我嘗試獲取無意義命令的輸出時告訴我退出狀態”,答案是“找不到命令”或 127
但是當您執行以下操作時
eval `nonsense` echo $?
你在問“當我評估一個空字元串時告訴我 eval 的退出狀態”(命令廢話的輸出),這等於
eval
不帶參數執行。
eval
不帶參數執行沒有問題,退出狀態變為0
其實更多的是:
$ `nonsense` bash: nonsense: command not found $ echo "$?" 127
這在這裡令人驚訝。
我們要求
bash
在nonsense
. 由於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
不執行任何命令)