Bash

當您將數據傳輸到 bash 時,“$0”會發生什麼

  • June 28, 2017

假設我們有這樣的 bash 文件:

cd $(dirname "$0");

不是直接執行文件,而是當我們讀取文件然後通過 bash 管道傳輸它時會發生什麼?如何解釋“$ 0”?

echo "$(cat <file>)" | bash

我問的原因是因為似乎不清楚 $ 0 would mean since the file is no longer necessarily running where it once was located. Perhaps somehow bash remembers where it was located and the $ 0 還是指原始文件位置?似乎極不可能。

$0然後將是呼叫 bash 的名稱:

$ printf '%s\n' 'echo $0' | bash
bash
$ printf '%s\n' 'echo $0' | ARGV0=sh bash
sh
$ printf '%s\n' 'echo $0' | ARGV0='blah blah' bash
blah blah

第二個和第三個命令在 zsh 中執行,它允許您使用特殊變數設置第 0 個參數ARGV0。但是您可以通過使用符號連結來模擬它:

$ ln -s "$(command -v bash)" foo
$ printf '%s\n' 'echo $0' | ./foo
./foo

bash 手冊

($0) 擴展為 shell 或 shell 腳本的名稱。這是在 shell 初始化時設置的。如果使用命令文件(請參閱 Shell 腳本)呼叫 Bash,$0則將其設置為該文件的名稱。如果 Bash 以-c選項啟動(請參閱Invoking Bash),則$0設置為要執行的字元串之後的第一個參數(如果存在)。否則,它被設置為用於呼叫 Bash 的文件名,由參數 0 給出。

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