注:POSIX準拠のソリューションについては、この回答を参照してください。
${BASH_SOURCE[0]}(または、より簡単に言えば、$BASH_SOURCE[1]
)には、すべての呼び出しシナリオで、含まれているスクリプトの(潜在的に相対)パスが含まれます。特に、スクリプトがソース化されている場合も同様です$0。これはには当てはまりません。
さらに、Charles Duffyが指摘するように、呼び出し元$0は任意の値に設定できます。
反対に、名前付きファイルが含まれていない場合は空にする$BASH_SOURCE ことができます。例えば:
echo 'echo "[$BASH_SOURCE]"' | bash
次の例はこれを示しています。
スクリプトfoo:
#!/bin/bash
echo "[$0] vs. [${BASH_SOURCE[0]}]"
$ bash ./foo
[./foo] vs. [./foo]
$ ./foo
[./foo] vs. [./foo]
$ . ./foo
[bash] vs. [./foo]
$0はPOSIXシェル仕様の一部ですBASH_SOURCEが、は名前が示すようにBash固有です。
[1] オプションの読み取り:${BASH_SOURCE[0]}対$BASH_SOURCE:
Bashでは0、スカラー表記を使用して配列変数の要素を参照できます。を書く代わりに、を書くことができます。つまり、変数をスカラーのように参照すると、インデックスに要素が取得されます。 ${arr[0]}$arr0
この機能を使用する$arrと、配列であるという事実がわかりにくくなります。そのため、人気のあるシェルコードリンターshellcheck.netが次の警告を発行します(この記事の執筆時点で)。
SC2128:インデックスなしで配列を拡張すると、最初の要素しか得られません。
余談ですが、この警告は役に立ちますが、必ずしも最初の要素を取得するとは限らないため、より正確になる可能性があります。具体的には、0返されるのはインデックスの要素なので、最初の要素のインデックスが高い場合、 Bashでは可能です-空の文字列を取得します。試してください'a[1]='hi'; echo "$a"'。
(これとは対照的に、zshこれまで反乱は、確かにありませんそのインデックスのにかかわらず、最初の要素を返します)。
実用的に言えば、あなたは、そのあいまいにこの機能を避けることを選択するかもしれないが、それは予想どおりに動作して、あなたはめったに、もしこれまでに、アクセスする必要がインデックスしないだろう、他のよりも0配列変数の${BASH_SOURCE[@]}。
BASH_SOURCEbash-3.0-alphaで追加されました。テスト体制によっては、それがない場合があります。初期のSolarisとOS Xの両方で欠落していることがわかりました。また、return: U&L.SEの関数またはソーススクリプトからのみ「return」できることも参照してください。