ほとんどの用途において、他のものより客観的に優れたBash
Shebangはありますか?
#!/usr/bin/env bash
#!/bin/bash
#!/bin/sh
#!/bin/sh -
ダッシュを最後に追加すると、誰かがあなたのスクリプトにコマンドを渡すのを妨げると聞いていたのですが、それについての詳細はわかりません。
移植性のために#!/usr/bin/env bash
を使うべきです :different * nixes bash
を別の場所に置くこと、そして/usr/bin/env
を使うことはbash
の最初のPATH
を実行するための回避策です。そしてsh
はbash
ではありません。
/bin/sh
は通常システムのデフォルトのシェルへのリンクです。シェルはしばしばbash
ですが、例えば、Debianシステムはより軽量のdash
です。どちらの方法でも、オリジナルのBourneシェルはsh
なので、スクリプトでbash
第2世代、 "Bourne Again sh")固有の機能([[ ]]
テスト、配列、さまざまな甘いものなど)を使用する場合は、より具体的になります。後で使ってください。このように、bashがインストールされていないシステムでは、あなたのスクリプトは実行されません。私はこの進化についてのエキサイティングな三部作の映画があるかもしれないことを理解しています...しかしそれは伝聞することができます。
また、sh
として呼び出された場合、bash
はある程度_(POSIX標準sh
として動作します(これについては GNU docs も参照))。
Shebangの行を使って適切なインタプリタを呼び出すのは、BASHだけではありません。 Shebangは、Perl、Python、PHP(CLI)など、システム上の任意のインタプリタ言語に使用できます。ところで、Shebang
#!/bin/sh -
(それは2つのダッシュ、すなわち--
でも構いません)bashオプションを終了し、その後はファイル名と引数として扱われます。
env
コマンドを使用すると、スクリプトを移植可能にして、スクリプトのカスタム環境を設定できるようになるため、移植可能なスクリプトでは次のものを使用する必要があります。
#!/usr/bin/env bash
あるいはPerlのようなどんな言語でも
#!/usr/bin/env Perl
man
のbash
ページを必ず見てください。
man bash
そしてenv
:
man env
注:UbuntuのようなDebianおよびDebianベースのシステムでは、sh
はdash
ではなくbash
にリンクされています。すべてのシステムスクリプトがsh
を使用しているので。 Debianによると、これによりbashを大きくし、システムを安定させることができます。
また、Windowsの場合のように実行可能ファイルの呼び出し時に拡張子を省略することはできないため、呼び出しを* nixのままにしておくと、Shebangで呼び出されるスクリプトでファイル拡張子は使用されません。 fileコマンドはそれをスクリプトとして識別できます。
使用することをお勧めします:
#!/bin/bash
100%ポータブルではありません(一部のシステムはbash
を/bin
以外の場所に配置します)が、多くの既存のスクリプトが#!/bin/bash
を使用するという事実により、さまざまなオペレーティングシステムに/bin/bash
少なくともメインの場所へのシンボリックリンク。
の代替:
#!/usr/bin/env bash
推奨されていますが、env
コマンドが/usr/bin
にあるという保証はありません(そして、そうでないシステムを使用しました)。さらに、このフォームは、現在のユーザー$PATH
のbash
の最初のインスタンスを使用しますが、これはbashシェルの適切なバージョンではない可能性があります。
/bin/bash
がないシステムでスクリプトを実行する必要がある場合は、スクリプトを修正して正しい場所を指すようにすることができます(明らかに不便です)。
それは本当にあなたが自分のbashスクリプトをどのように書くかにかかっています。あなたの/bin/sh
がbashにシンボリックリンクされている場合、bashがsh
として呼び出されたとき、 いくつかの機能は利用できません 。
Bash固有のPOSIX以外の機能が必要な場合は、#!/bin/bash
を使用してください。