推奨されるBashシバンは何ですか?


1132

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

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

最後にダッシュを追加すると、誰かがスクリプトにコマンドを渡すことができなくなると聞いたが、詳細についてはわかりません。


4
そして/usr/local/bin/bashOpenBSDで。
jww 2016年

回答:


1536

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


9
ありがとう。追加するようにも見えます-$!/ usr / bin / env bashの最後に-シェバンの* nixによって許可される引数は1つだけであり、それは 'bash'によって使用されるため、何もしません。これは、スクリプトのシバンが引数のない他のスクリプトの1つである場合(/bin/sh、など)、悪意のある引数がコマンドラインでスクリプトに渡されるのを防ぐためにのみ役立つようです。
尖度

13
@Ray bash/binすべてのシステムに存在するわけではありません。
ptierno 2014年

12
私も同じです。エイリアスに追加したalias shebang='echo "#!/usr/bin/env bash"'だけです。ここで、ターミナルを開いて、shebangと入力するだけです。
Oylex

19
この答えは欺瞞的です。POSIXは、それenvがにあるとは述べていません/usr/bin/env/bin/envパス内にある限り、実際にはどこにでも存在できます。それはであることができ/dummy/envた場合/dummyですPATH。シバン自体はPOSIXでは定義されていないため#!stop toaster、USBコーヒーマシンを起動してPOSIXに準拠させることができます。したがって、#!/usr/bin/env bashは特にに比べて優れているわけではありません#!/bin/bash
darkfeline 2018年

19
@darkfeline移植性は絶対的なものではありません-すべてのプラットフォームで同じことを行うスクリプトを作成することは数学的に不可能です。2012年から2018年の時点では/usr/bin/env/bin/bashxorのどちらよりも多くのマシンに存在する/usr/bin/bashため、この行で始まるスクリプトは、可能な限り多くのマシンで期待どおりの動作をします。
l0b0

80

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

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


2
パブリックドメインKornシェル(pdksh)はOpenBSDのデフォルトです。
jww 2016年

マウントされる前にinitスクリプトを実行することがかなり難しくなるため、ほとんどのシステムはどこにリンク/bin/shません/usr/usr
aij 2018

@aijなぜそこに「多く」または「ほとんど」を置くのかわかりません-私はfedoraユーザーです。ここ/bin/sbin、何年もの間、デフォルトで、/usr/binおよびへのシンボリックリンク/usr/sbinになっているので、そのコンテキストで/bin/shbash、実際のディレクトリは/usr/binです。しかし、私は上記を修正します。
delicateLatticeworkFever

44

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

#!/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/bashbashis /data/data/com.termux/files/usr/bin/bash)がありませんが、サポートする特別な処理があり#!/bin/bashます。


3
2年後、これはまだここで最高のアドバイスです。単純な解決策が機能しない場合は、以前の決定を疑問視する必要があります。受け入れられ、最も賛成された答えは間違っていません、それはちょうど正しくありません:)
ソフトウェアエンジニア

27

シバン行を使用して適切なインタープリターを呼び出すことは、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などshdashnotにリンクされていbashます。すべてのシステムスクリプトがを使用するためsh。Debianによれば、これによりbashが成長し、システムが安定した状態を保つことができます。

また、Windowsのように実行可能ファイルの呼び出しで拡張子を省略できないため、shebangで呼び出されたスクリプトでファイル拡張子を使用しないように、* nixの呼び出しを維持します。fileコマンドは、それをスクリプトとして識別できます。


4

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

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


3
OpenBSDにはBashはインストールされていません。を介してインストールする場合pkg_add/usr/local/bin、にありますが、パス上にない場合があります。
jww 2016年

どの程度POSIX機能?
Nikolan Asad
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.