Bash為什麼
為什麼 exec -a
不能按我預期的方式工作?
我正在閱讀
exec
以及如何使用該-a
標誌。SS64文件似乎準確;他們說:執行:
執行命令
句法:
exec [-cl] [-a name] [command [arguments]]
選項:
-c Causes command to be executed with an empty environment. -l Place a dash at the beginning of the zeroth arg passed to command. (This is what the login program does.) -a The shell passes name as the zeroth argument to command.
為了測試這一點,我編寫了兩個腳本,一個名為
foo/baz
,一個名為foo/buzz
:#!/usr/bin/env bash # foo/baz exec -a blah ./foo/bar 1 2
#!/usr/bin/env bash # foo/buzz exec ./foo/bar 1 2
這些腳本中的每一個都執行相同的子腳本 ,
foo/bar
它執行以下操作:#!/usr/bin/env bash echo "Hello world" echo "0: $0" echo "1: $1" echo "2: $2"
我的目標是看看
-a
對第 0 次和隨後的論點有什麼影響。如果-a
導致第 0 個參數更改為您傳遞給-a
標誌的參數,那麼當我執行時我希望第 0 個參數foo/baz
是blah
,因為這就是我傳遞給-a
. 但是,當我執行腳本時,兩種情況下的輸出都是相同的:~/Workspace/OpenSource (master) $ ./foo/baz Hello world 0: /Users/richiethomas/Workspace/OpenSource/foo/bar 1: 1 2: 2 ~/Workspace/OpenSource (master) $ ./foo/buzz Hello world 0: /Users/richiethomas/Workspace/OpenSource/foo/bar 1: 1 2: 2
難道我做錯了什麼?還是我的期望不正確?
此外,一個相關的問題 - 覆蓋第 0 個參數的案例是什麼,而不是僅通過訪問任何傳入的參數 $ 1, $ 2、3美元等?
覆蓋第 0 個參數的案例是什麼……?
一些程序會根據呼叫方式改變它們的行為。例如,
busybox
是一個以這種方式執行的多呼叫二進製文件。根據第零個參數的值,使用exec -a
我們會得到不同的行為:$ bash -c 'exec -a date /usr/sbin/busybox' Sat Sep 17 20:22:14 EDT 2022 $ bash -c 'exec -a uptime /usr/sbin/busybox' 20:22:17 up 23:48, load average: 0.10, 0.20, 0.15
這也表明其
exec -a <something>
行為與記錄的一樣。難道我做錯了什麼?還是我的期望不正確?
這裡的問題是您正在使用 shell 腳本。當您
./foo/baz
在命令行上輸入時,您實際上並沒有執行名為 的命令./foo/baz
:您正在執行類似/bin/bash /path/to/foo/baz
. 雖然exec -a
影響傳遞給外殼的第零個參數……外殼不在乎,它在設置對外殼腳本可見的變數時使用自己的邏輯,包括$0
(包含腳本名稱)和位置參數$1
,$2
…(其中包含腳本的參數)。(這並不特定於 shell 腳本——幾乎任何解釋程式碼都是如此。)