Bash
ほとんどの用途で他のものより客観的に優れているシバンはありますか?
#!/usr/bin/env bash
#!/bin/bash
#!/bin/sh
#!/bin/sh -
- 等
ずっと前に、最後にダッシュを追加すると、誰かがスクリプトにコマンドを渡すのを防ぐと聞いたのをぼんやりと思い出しますが、その詳細は見つかりません。
私は使用することをお勧めします:
#!/bin/bash
100%ポータブルではありませんが(一部のシステムbash
は以外の場所に配置されます/bin
)、既存のスクリプトの多くが#!/bin/bash
さまざまなオペレーティングシステムに圧力をかけて/bin/bash
、少なくともメインの場所へのシンボリックリンクを作成します。
の代替:
#!/usr/bin/env bash
提案されていますが、コマンドが含まれているという保証はありません(そして、env
コマンドが含まれ/usr/bin
ていないシステムを使用しました)。bash
さらに、このフォームは現在のユーザーの最初のインスタンスを使用しますが$PATH
、これはbashシェルの適切なバージョンではない可能性があります。
(ただし、システムが動作しているため、またはシステムが動作させるために何かを実行しているため/usr/bin/env
、適度に最新のシステムで動作するはずです。上記で参照したシステムはSunOS 4で、おそらく約25年間使用していません。)env
/usr/bin
がないシステムでスクリプトを実行する必要がある場合は/bin/bash
、正しい場所を指すようにスクリプトを変更できます(これは明らかに不便です)。
この質問への回答では、トレードオフについてさらに詳しく説明しました。
ややあいまいな更新:私が使用しているシステムの1つであるTermux/bin/bash
は、Androidで実行されるデスクトップLinuxのようなレイヤーであり、 (bash
is )はありませんが、/data/data/com.termux/files/usr/bin/bash
をサポートするための特別な処理があり#!/bin/bash
ます。
/bin/sh
通常、システムのデフォルトシェルへのリンクですが、多くの場合、これはbash
オンです。たとえば、Debianシステムの方が軽量dash
です。いずれにせよ、元のBourneシェルはですsh
。したがって、スクリプトbash
で特定の機能([[ ]]
テスト、配列、さまざまな甘いものなど)を使用する場合は、より具体的にして、後で使用する必要があります。 。このように、bashがインストールされていないシステムでは、スクリプトは実行されません。この進化についての映画のエキサイティングな三部作があるかもしれないことを私は理解します...しかし、それは伝聞かもしれません。
sh
また、として呼び出された場合、bash
ある程度はPOSIX標準として動作する ことに注意してsh
ください(これについてはGNUドキュメントも参照してください)。
シバンラインを使用して適切なインタプリタを呼び出すのは、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およびUbuntuなどのDebianベースのシステムでは、sh
にリンクされてdash
いませんbash
。すべてのシステムスクリプトがを使用するためsh
。Debianによると、これによりbashが成長し、システムが安定した状態を保つことができます。
また、Windowsの場合のように実行可能ファイルの呼び出しで拡張子を省略できないため、呼び出しを維持するために*nixをshebangで呼び出されたスクリプトでファイル拡張子を使用することはありません。fileコマンドは、それをスクリプトとして識別できます。
それは本当にbashスクリプトをどのように書くかに依存します。/bin/sh
がbashにシンボリックリンクされている場合、bashがとして呼び出されると、sh
一部の機能が使用できなくなります。
bash固有の非POSIX機能が必要な場合は、#!/bin/bash
#!/ usr / bin/envアプローチにもう1票追加します。私は仮想環境をよく使用します。私の場合は、virtualenvにインストールされているPythonを使用します。#!/ usr / bin / pythonを使用することは、私が望むpythonではないかもしれません。#!/ usr / bin /envpythonを使用して適切なpythonを取得します。
#!/bin/sh
ほとんどのスクリプトは特定のbash機能を必要とせず、sh用に作成する必要があるためです。
また、これにより、デフォルトでbashがないBSDでスクリプトが機能するようになります。