Bash

為什麼 exec -a 不能按我預期的方式工作?

  • September 18, 2022

我正在閱讀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/bazblah,因為這就是我傳遞給-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 腳本——幾乎任何解釋程式碼都是如此。)

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