2台のコンピュータで実行できるスクリプトがあります。どちらのマシンも同じgitリポジトリからスクリプトのコピーを取得します。スクリプトは正しいインタプリタ(例えばzsh
。
残念ながら、両方 env
zsh
ローカルコンピュータとリモートコンピュータの異なる場所にあります。
リモートマシン
$ which env
/bin/env
$ which zsh
/some/long/path/to/the/right/zsh
ローカルマシン
$ which env
/usr/bin/env
$which zsh
/usr/local/bin/zsh
/path/to/script.sh
常に利用可能なスクリプトを使用してZsh
スクリプトを実行するようにshebangを設定するにはどうすればよいですかPATH
?
ベストアンサー1
shebangは純粋に静的であるため、shebangを介してこの問題を直接解決することはできません。あなたができることは、シェルの観点からいくつかの「最小共通乗数」をshebangに追加し、正しいシェルを使用してスクリプトを再実行することです(LCMがzshではない場合)。つまり、すべてのシステムにあるシェルでスクリプトを実行し、機能のみをzsh
テストします。テストがfalseの場合をexec
使用してスクリプトを実行すると、テストはzsh
成功し、続行されます。
zsh
たとえば、独自の特徴は$ZSH_VERSION
変数があるということです。
#!/bin/sh -
[ -z "$ZSH_VERSION" ] && exec zsh - "$0" ${1+"$@"}
# zsh-specific stuff following here
echo "$ZSH_VERSION"
この簡単な例では、スクリプトは最初に実行されます/bin/sh
(すべての80年代以降、UnixシリーズシステムはBourneまたはPOSIXを理解して#!
保持します/bin/sh
が、構文は両方と互換性があります)。の$ZSH_VERSION
場合いいえ設定に応じてスクリプトexec
自体が渡されますzsh
。設定されている場合$ZSH_VERSION
(またはスクリプトがすでに実行されている場合zsh
)、テストをスキップします。望むより。
zsh
これはまったく存在しない場合にのみ失敗します$PATH
。
編集する:一般的な場所exec
にしかないことを確認するには、次のものを使用できます。zsh
for sh in /bin/zsh \
/usr/bin/zsh \
/usr/local/bin/zsh; do
[ -x "$sh" ] && exec "$sh" - "$0" ${1+"$@"}
done
これにより、予期しないことがexec
偶然に発生するのを防ぐことができます。$PATH
zsh