Bash
當您將數據傳輸到 bash 時,“$0”會發生什麼
假設我們有這樣的 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 給出。