2016-01-26 11 views
31

の間で選択します。

BASH_SOURCE 

An array variable whose members are the source filenames where the 
corresponding shell function names in the FUNCNAME array variable are 
defined. The shell function ${FUNCNAME[$i]} is defined in the file 
${BASH_SOURCE[$i]} and called from ${BASH_SOURCE[$i+1]} 

答えて

45

${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] 

$0BASH_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以外他の指標にアクセスする必要がないでしょう。

+1

* "...またはもっと単純に' $ BASH_SOURCE' ... "* - man、これはシェルチックネットをクリスマスツリーのように照らします。 '$ BASH_SOURCE'を避けてください。 – jww

+4

"(または、もっと簡単に '$ BASH_SOURCE')"←**いいえ、しないでください。** '$ BASH_SOURCE'は配列全体です - *スカラーではありませんグローバル。前者を静かに後者に強制することは、共通のケースでは失敗することが保証されます。安全のために、*常に* $ BASH_SOURCEの特定の配列インデックスにアクセスします(例えば '$ {BASH_SOURCE [0]}')。 –

+1

@CecilCurry:私が追加した脚注をご覧ください。私は、スカラーアクセスを使用して_obscure_を取得するが、私はそれが_fails_すべてのシナリオを認識していない。 – mklement0

関連する問題

 関連する問題