1346

Bashほとんどの用途で他のものより客観的に優れているシバンはありますか?

  • #!/usr/bin/env bash
  • #!/bin/bash
  • #!/bin/sh
  • #!/bin/sh -

ずっと前に、最後にダッシュを追加すると、誰かがスクリプトにコマンドを渡すのを防ぐと聞いたのをぼんやりと思い出しますが、その詳細は見つかりません。

4

7 に答える 7

1797

移植性#!/usr/bin/env bashのために使用する必要があります:さまざまな* nixをさまざまな場所に配置し、を使用すると、で最初に見つかったものを実行するための回避策になります。そしてではありませんbash/usr/bin/envbashPATHshbash

于 2012-04-30T12:14:50.937 に答える
125

私は使用することをお勧めします:

#!/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のようなレイヤーであり、 (bashis )はありませんが、/data/data/com.termux/files/usr/bin/bashをサポートするための特別な処理があり#!/bin/bashます。

于 2018-10-17T17:49:37.440 に答える
88

/bin/sh通常、システムのデフォルトシェルへのリンクですが、多くの場合、これはbashオンです。たとえば、Debianシステムの方が軽量dashです。いずれにせよ、元のBourneシェルはですsh。したがって、スクリプトbashで特定の機能([[ ]]テスト、配列、さまざまな甘いものなど)を使用する場合は、より具体的にして、後で使用する必要があります。 。このように、bashがインストールされていないシステムでは、スクリプトは実行されません。この進化についての映画のエキサイティングな三部作があるかもしれないことを私は理解します...しかし、それは伝聞かもしれません。

shまた、として呼び出された場合、bashある程度はPOSIX標準として動作する ことに注意してshください(これについてはGNUドキュメントも参照してください)。

于 2012-04-29T21:39:45.507 に答える
33

シバンラインを使用して適切なインタプリタを呼び出すのは、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コマンドは、それをスクリプトとして識別できます。

于 2016-10-26T19:55:26.357 に答える
6

それは本当にbashスクリプトをどのように書くかに依存します。/bin/shがbashにシンボリックリンクされている場合、bashがとして呼び出されると、sh一部の機能が使用できなくなります。

bash固有の非POSIX機能が必要な場合は、#!/bin/bash

于 2012-04-29T22:36:34.793 に答える
2

#!/ usr / bin/envアプローチにもう1票追加します。私は仮想環境をよく使用します。私の場合は、virtualenvにインストールされているPythonを使用します。#!/ usr / bin / pythonを使用することは、私が望むpythonではないかもしれません。#!/ usr / bin /envpythonを使用して適切なpythonを取得します。

于 2021-08-27T16:52:51.710 に答える
0

#!/bin/sh

ほとんどのスクリプトは特定のbash機能を必要とせず、sh用に作成する必要があるためです。

また、これにより、デフォルトでbashがないBSDでスクリプトが機能するようになります。

于 2021-02-09T07:05:10.290 に答える