回答:
移植性の#!/usr/bin/env bashために使用する必要があります。異なる場所に配置された異なる* nix を使用します。これは、で最初に見つかったものを実行するための回避策です。そして、そうではありません。bash/usr/bin/envbashPATHshbash
/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/bashxorのどちらよりも多くのマシンに存在する/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(bashis /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がdashnotにリンクされてい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/bashOpenBSDで。