Bash

zsh 是否尊重 shebang bin/sh 所以可以使用破折號?

  • April 16, 2020

我有一個簡單的腳本,涉及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。

抱歉,如果這是一個基本問題,我確實搜尋了zshposixshebang 但沒有找到類似的問題。

只有直接執行腳本而不指定如何執行, shebang 才會產生影響;也就是說,使用類似./scratch.shor/path/to/scratch.sh或將其放在您的目錄中PATH並僅使用scratch.sh.

如果您使用其他命令執行它,則該命令將控制它的處理方式(覆蓋 shebang)。如果你使用bash scratch.sh,它會執行在bash;如果你使用zsh scratch.sh,它會執行zsh;如果您使用sh,它將sh在您系統上的任何內容中執行(dash在您的特定情況下)。

如果你使用source scratch.shor . scratch.sh,它會在目前的 shell中執行,不管它是什麼。.這就是andsource命令的全部目的。再一次,shebang 在這裡被忽略了。

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