注: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]}
$arr
0
この機能を使用する$arr
と、配列であるという事実がわかりにくくなります。そのため、人気のあるシェルコードリンターshellcheck.netが次の警告を発行します(この記事の執筆時点で)。
SC2128:インデックスなしで配列を拡張すると、最初の要素しか得られません。
余談ですが、この警告は役に立ちますが、必ずしも最初の要素を取得するとは限らないため、より正確になる可能性があります。具体的には、0
返されるのはインデックスの要素なので、最初の要素のインデックスが高い場合、 Bashでは可能です-空の文字列を取得します。試してください'a[1]='hi'; echo "$a"'
。
(これとは対照的に、zsh
これまで反乱は、確かにありませんそのインデックスのにかかわらず、最初の要素を返します)。
実用的に言えば、あなたは、そのあいまいにこの機能を避けることを選択するかもしれないが、それは予想どおりに動作して、あなたはめったに、もしこれまでに、アクセスする必要がインデックスしないだろう、他のよりも0
配列変数の${BASH_SOURCE[@]}
。
BASH_SOURCE
bash-3.0-alphaで追加されました。テスト体制によっては、それがない場合があります。初期のSolarisとOS Xの両方で欠落していることがわかりました。また、return: U&L.SEの関数またはソーススクリプトからのみ「return」できることも参照してください。