${BASH_SOURCE[0]}
(または、より単純に、$BASH_SOURCE
[1] )をスクリプトがに供給されたときに、特にまた、に含むスクリプトの(潜在的相対)パスを全て呼び出しシナリオが含まれ、 $0
では正しくありません。 Charles Duffyが指摘するよう
はまた、$0
は、発信者が任意値に設定することができます。
裏側には、名前付きファイルがない場合は$BASH_SOURCE
が空になります。例えば:
echo 'echo "[$BASH_SOURCE]"' | bash
次の例では、このことを示す:
スクリプトfoo
:
#!/usr/bin/env bash
echo "[$0] vs. [${BASH_SOURCE[0]}]"
$ bash ./foo
[./foo] vs. [./foo]
$ . ./foo
[bash] vs. [./foo]
$0
はBASH_SOURCE
一方、POSIXシェル仕様の一部である、として名前が示唆しているのは、Bash固有です。
[1] オプション読み取り:${BASH_SOURCE[0]}
対$BASH_SOURCE
:
バッシュを使用すると、スカラー表記を使用して配列可変の要素0
を参照することができます代わり${arr[0]}
の書き込み、次のことができ書き込み$arr
;言い換えれば、変数をスカラのように参照するととなると、インデックス0
の要素が得られます。
SC2128:インデックスなしのアレイを拡張この機能を使用する
は$arr
は、以下の(これを書いている時点では)警告なぜ人気のシェルコードリンターshellcheck.net問題である配列、であるという事実をあいまい最初の要素のみを与えます。サイドノートでは
:この警告は役に立ちですが、あなたが必ずしも最初の要素を取得することはできませんので、それは、より正確かもしれない:それは、具体的返されたインデックス0
の要素である、そうならば最初の要素はより高いインデックスを持ちます。これはBashで可能です。空の文字列を取得します。試してください'a[1]='hi'; echo "$a"'
。これとは対照的に、zsh
、これまでには、は、は、そのインデックスに関係なく、最初の要素を返します。)
あなたは、そのあいまいにこの機能を避けることを選択するかもしれないが、それは実用的に言えば、予想通りに動作し、これまでならば、あなたはほとんど、配列変数${BASH_SOURCE[@]}
の0
以外他の指標にアクセスする必要がないでしょう。
* "...またはもっと単純に' $ BASH_SOURCE' ... "* - man、これはシェルチックネットをクリスマスツリーのように照らします。 '$ BASH_SOURCE'を避けてください。 – jww
"(または、もっと簡単に '$ BASH_SOURCE')"←**いいえ、しないでください。** '$ BASH_SOURCE'は配列全体です - *スカラーではありませんグローバル。前者を静かに後者に強制することは、共通のケースでは失敗することが保証されます。安全のために、*常に* $ BASH_SOURCEの特定の配列インデックスにアクセスします(例えば '$ {BASH_SOURCE [0]}')。 –
@CecilCurry:私が追加した脚注をご覧ください。私は、スカラーアクセスを使用して_obscure_を取得するが、私はそれが_fails_すべてのシナリオを認識していない。 – mklement0