zsh 是否尊重 shebang bin/sh 所以可以使用破折號?
我有一個簡單的腳本,涉及
for
來自 bash 的循環,我試圖在 zsh 中工作。我曾假設 shebang 將確保使用符合 POSIX 的 shell(在我的系統上/bin/sh -> dash*
),所以不會有任何問題。MWE 腳本
ITEMS
實際上是列出包的命令的輸出,例如ITEMS=$(pip freeze)
:#!/bin/sh # ITEMS=$(pip freeze) # Example of useful command ITEMS="Item1 Item2 Item3" # Dummy variable for testing for ITEM in $ITEMS; do echo $ITEM echo Complete done
這是我嘗試在以下位置執行腳本時的輸出
zsh
:$ source scratch.sh Item1 Item2 Item3 Complete # Undesired $ . ./scratch.sh Item1 Item2 Item3 Complete # Undesired $ bash scratch.sh Item1 Complete Item2 Complete Item3 Complete # Desired $ sh scratch.sh Item1 Complete Item2 Complete Item3 Complete # Desired
當我在 bash 終端中執行它時,它工作正常。我想我誤解了 shebang 是如何解釋的
zsh
?有人可以向我解釋一下應該如何使用它,以便在我執行時source scratch.sh
或者. ./scratch.sh
我有與執行時相同的輸出sh scratch.sh
嗎?我知道我可以修改我的 for 循環腳本以使其符合本zsh
機標準bash
,但我想使用/bin/sh -> dash
所以我總是使用符合 posix 的 shell,不必擔心 bashism 或 zshism。抱歉,如果這是一個基本問題,我確實搜尋了
zsh
和posix
shebang 但沒有找到類似的問題。
只有直接執行腳本而不指定如何執行, shebang 才會產生影響;也就是說,使用類似
./scratch.sh
or/path/to/scratch.sh
或將其放在您的目錄中PATH
並僅使用scratch.sh
.如果您使用其他命令執行它,則該命令將控制它的處理方式(覆蓋 shebang)。如果你使用
bash scratch.sh
,它會執行在bash
;如果你使用zsh scratch.sh
,它會執行zsh
;如果您使用sh
,它將sh
在您系統上的任何內容中執行(dash
在您的特定情況下)。如果你使用
source scratch.sh
or. scratch.sh
,它會在目前的 shell中執行,不管它是什麼。.
這就是andsource
命令的全部目的。再一次,shebang 在這裡被忽略了。