パス独立したshebang

パス独立したshebang

2台のコンピュータで実行できるスクリプトがあります。どちらのマシンも同じgitリポジトリからスクリプトのコピーを取得します。スクリプトは正しいインタプリタ(例えばzsh

残念ながら、両方 envzshローカルコンピュータとリモートコンピュータの異なる場所にあります。

リモートマシン

$ 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偶然に発生するのを防ぐことができます。$PATHzsh

おすすめ記事