回答:
移植性の#!/usr/bin/env bash
ために使用する必要があります。異なる場所に配置された異なる* nix を使用します。これは、で最初に見つかったものを実行するための回避策です。そして、そうではありません。bash
/usr/bin/env
bash
PATH
sh
bash
/bin/sh
、など)、悪意のある引数がコマンドラインでスクリプトに渡されるのを防ぐためにのみ役立つようです。
bash
は/bin
すべてのシステムに存在するわけではありません。
alias shebang='echo "#!/usr/bin/env bash"'
だけです。ここで、ターミナルを開いて、shebangと入力するだけです。
env
がにあるとは述べていません/usr/bin/env
。/bin/env
パス内にある限り、実際にはどこにでも存在できます。それはであることができ/dummy/env
た場合/dummy
ですPATH
。シバン自体はPOSIXでは定義されていないため#!stop toaster
、USBコーヒーマシンを起動してPOSIXに準拠させることができます。したがって、#!/usr/bin/env bash
は特にに比べて優れているわけではありません#!/bin/bash
。
/usr/bin/env
、/bin/bash
xorのどちらよりも多くのマシンに存在する/usr/bin/bash
ため、この行で始まるスクリプトは、可能な限り多くのマシンで期待どおりの動作をします。
/bin/sh
通常は、システムのデフォルトシェルへのリンクです。これは、多くの場合bash
、たとえば、Debianシステムの方が軽量dash
です。どちらの方法でも、元のBourneシェルはsh
なので、スクリプトで一部bash
(第2世代、「Bourne Again sh」)の特定の機能([[ ]]
テスト、配列、さまざまな甘いものなど)を使用する場合は、より具体的で、後で使用する必要があります。このように、bashがインストールされていないシステムでは、スクリプトは実行されません。私はこの進化について映画のエキサイティングな三部作があるかもしれないことを理解しています...しかしそれは伝聞かもしれません。
またsh
、として呼び出された場合、bash
ある程度はPOSIX標準として動作します sh
(これに関するGNUドキュメントも参照してください)。
/bin/sh
しません。/usr
/usr
/bin
で/sbin
、何年もの間、デフォルトで、/usr/bin
およびへのシンボリックリンク/usr/sbin
になっているので、そのコンテキストで/bin/sh
はbash
、実際のディレクトリは/usr/bin
です。しかし、私は上記を修正します。
私は以下を使用することをお勧めします:
#!/bin/bash
100%ポータブルではありません(一部のシステムはbash
以外の場所に配置されます/bin
)が、多くの既存のスクリプトが#!/bin/bash
さまざまなオペレーティングシステムに圧力をかけて/bin/bash
、少なくともメインの場所へのシンボリックリンクを作成します。
の代替:
#!/usr/bin/env bash
提案されています-しかし、env
コマンドが含まれている保証はありません/usr/bin
(そして、コマンドが含まれていないシステムを使用しました)。さらに、このフォームはbash
、現在のユーザーの最初のインスタンスを使用します$PATH
。これは、bashシェルの適切なバージョンではない可能性があります。
(ただし、/usr/bin/env
どちらかのために、あらゆる合理的に近代的なシステム上で動作するはずenv
である/usr/bin
か、システムがそれを動作させるために何かをするので。私はおそらく約25年の間に使用していないのSunOS 4を、だったに上記の言及のシステムを。)
がないシステムでスクリプトを実行する必要がある場合は/bin/bash
、正しい場所を指すようにスクリプトを変更できます(確かに不便です)。
私はでより深さのトレードオフを検討してきた私の答えにこの質問。
ややあいまいな更新:私が使用しているシステムの1つである、Androidで実行されるデスクトップLinuxのようなレイヤーであるTermuxには/bin/bash
(bash
is /data/data/com.termux/files/usr/bin/bash
)がありませんが、サポートする特別な処理があり#!/bin/bash
ます。
シバン行を使用して適切なインタープリターを呼び出すことは、BASHだけのものではありません。シバンは、Perl、Python、PHP(CLI)など、システム上の任意の解釈言語に使用できます。ちなみにシバン
#!/bin/sh -
(2つのダッシュ、つまり--
)は、bashオプションをファイル名と引数として扱うすべての後に終了します。
env
コマンドを使用すると、スクリプトが移植可能になり、スクリプトのカスタム環境をセットアップできるため、移植可能なスクリプトで使用する必要があります
#!/usr/bin/env bash
または、Perlのような言語なら何でも
#!/usr/bin/env perl
必ずman
ページをご覧くださいbash
。
man bash
とenv
:
man env
注:DebianおよびDebianベースのシステムでは、Ubuntuなどsh
がdash
notにリンクされていbash
ます。すべてのシステムスクリプトがを使用するためsh
。Debianによれば、これによりbashが成長し、システムが安定した状態を保つことができます。
また、Windowsのように実行可能ファイルの呼び出しで拡張子を省略できないため、shebangで呼び出されたスクリプトでファイル拡張子を使用しないように、* nixの呼び出しを維持します。fileコマンドは、それをスクリプトとして識別できます。
それは本当にbashスクリプトの書き方に依存します。/bin/sh
がbashにシンボリックリンクされている場合、bashがとして呼び出されるとsh
、一部の機能が使用できなくなります。
bash固有の非POSIX機能が必要な場合は、 #!/bin/bash
pkg_add
は/usr/local/bin
、にありますが、パス上にない場合があります。
POSIX
機能?
/usr/local/bin/bash
OpenBSDで。