GNU/Linux >> Linux の 問題 >  >> Linux

パスに依存しないShebangs?

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

関連:ssh $ host$FOOおよびssh$host“ sudo su user -c $ FOO”タイプのコンストラクトを引用しますか?
Linux
  1. Bashスクリプトをデバッグする方法は?

  2. シェルスクリプトでタイムアウトしますか?

  3. ソースシェルスクリプトへのパスを決定しますか?

  1. スクリプトが実行されていることを確認しますか?

  2. Bashスクリプト内からフルパスを取得しますか?

  3. Zshスタックのバックスペース?

  1. ZSH の PATH 変数に新しいエントリを追加する

  2. UbuntuのPATH変数はどこに設定されていますか?

  3. 絶対パス経由でbashスクリプトを実行するには?