2台のマシンで実行できるようにしたいスクリプトがあります。これらの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
を使用します PATH
で利用可能 ?
承認された回答:
シバンは純粋に静的であるため、シバンを介してこれを直接解決することはできません。このLCMがzshでない場合は、シバンに「最小公倍数」(シェルの観点から)を含め、適切なシェルを使用してスクリプトを再実行することができます。言い換えると、すべてのシステムで見つかったシェルでスクリプトを実行し、zsh
をテストします。 -機能のみで、テストがfalseであることが判明した場合は、スクリプトexec
を使用します。 zsh
を使用 、テストが成功し、続行するだけです。
zsh
の1つのユニークな機能 たとえば、$ZSH_VERSION
の存在です。 変数:
#!/bin/sh -
[ -z "$ZSH_VERSION" ] && exec zsh - "$0" ${1+"[email protected]"}
# zsh-specific stuff following here
echo "$ZSH_VERSION"
この単純なケースでは、スクリプトは最初に/bin/sh
によって実行されます。 (80年代以降のすべてのUnixライクなシステムは#!
を理解します /bin/sh
があります 、BourneまたはPOSIXのいずれかですが、構文は両方と互換性があります)。 $ZSH_VERSION
の場合 ではありません セット、スクリプトexec
zsh
を介してそれ自体 。 $ZSH_VERSION
の場合 が設定されています(または、スクリプトはすでにzsh
を介して実行されています )、テストは単にスキップされます。 Voilà。
これは、zsh
の場合にのみ失敗します $PATH
にありません まったく。
編集: 念のため、exec
のみを実行してください zsh
通常の場所では、次のようなものを使用できます
for sh in /bin/zsh
/usr/bin/zsh
/usr/local/bin/zsh; do
[ -x "$sh" ] && exec "$sh" - "$0" ${1+"[email protected]"}
done
これにより、誤ってexec
を回避できます。 $PATH
で何かをしている これはzsh
ではありません 期待しています。