web-dev-qa-db-ja.com

好みのBash shebangは何ですか?

ほとんどの用途において、他のものより客観的に優れたBash Shebangはありますか?

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

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

951
Kurtosis

移植性のために#!/usr/bin/env bashを使うべきです :different * nixes bashを別の場所に置くこと、そして/usr/bin/envを使うことはbashの最初のPATHを実行するための回避策です。そしてshbashではありません。

1281
l0b0

Shebangの行を使って適切なインタプリタを呼び出すのは、BASHだけではありません。 Shebangは、Perl、Python、PHP(CLI)など、システム上の任意のインタプリタ言語に使用できます。ところで、Shebang

#!/bin/sh -

(それは2つのダッシュ、すなわち--でも構いません)bashオプションを終了し、その後はファイル名と引数として扱われます。

envコマンドを使用すると、スクリプトを移植可能にして、スクリプトのカスタム環境を設定できるようになるため、移植可能なスクリプトでは次のものを使用する必要があります。

#!/usr/bin/env bash

あるいはPerlのようなどんな言語でも

#!/usr/bin/env Perl

manbashページを必ず見てください。

man bash

そしてenv

man env

注:UbuntuのようなDebianおよびDebianベースのシステムでは、shdashではなくbashにリンクされています。すべてのシステムスクリプトがshを使用しているので。 Debianによると、これによりbashを大きくし、システムを安定させることができます。

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

17

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

#!/bin/bash

100%ポータブルではありません(一部のシステムはbash/bin以外の場所に配置します)が、多くの既存のスクリプトが#!/bin/bashを使用するという事実により、さまざまなオペレーティングシステムに/bin/bash少なくともメインの場所へのシンボリックリンク。

の代替:

#!/usr/bin/env bash

推奨されていますが、envコマンドが/usr/binにあるという保証はありません(そして、そうでないシステムを使用しました)。さらに、このフォームは、現在のユーザー$PATHbashの最初のインスタンスを使用しますが、これはbashシェルの適切なバージョンではない可能性があります。

/bin/bashがないシステムでスクリプトを実行する必要がある場合は、スクリプトを修正して正しい場所を指すようにすることができます(明らかに不便です)。

私の答え から この質問 でトレードオフをより深く議論しました。

15
Keith Thompson

それは本当にあなたが自分のbashスクリプトをどのように書くかにかかっています。あなたの/bin/shがbashにシンボリックリンクされている場合、bashがshとして呼び出されたとき、 いくつかの機能は利用できません

Bash固有のPOSIX以外の機能が必要な場合は、#!/bin/bashを使用してください。

3
glenn jackman