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ではありません 期待しています。