Linux文書化プロジェクト説明する:
ファイルをインポートすると(コマンドラインにソースファイル名または.filenameと入力して)、ファイルのコード行がコマンドラインに印刷されているかのように実行されます。これは、ファイルに保存してファイルをインポートしてインポートできる複雑なプロンプトに特に役立ちます。
test.sh
、test2.sh
との3つのスクリプトがありますcommon.sh
。現在のスクリプトのデフォルト名を含む変数をcommon.sh
設定します(使用)。呼び出されて表示されます。呼び出され、表示される内容。$me
${BASH_SOURCE[0]}
test.sh
source
common.sh
$me
test2.sh
eval
common.sh
$me
==> common.sh <==
#!/bin/bash
realpath=$(realpath "${BASH_SOURCE[0]}")
me=$(basename "${realpath}")
==> test.sh <==
#!/bin/bash
source common.sh
echo "me: $me"
==> test2.sh <==
#!/bin/bash
common=$(cat common.sh)
eval "$common"
echo "me: $me"
実行すると、./test2.sh
出力はですme: test2.sh
。
実行すると、./test.sh
出力はですme: common.sh
。なぜですか?
編集する
sourcing
Jeff Schallerの答えは、他のスクリプトがスクリプト名を配列に「取り消す」という点で正確です$BASH_SOURCE
。眺めるだけで私が欲しいものを成し遂げることができた最後値については$BASH_SOURCE
下記をご覧ください。
#!/bin/bash
declare -p BASH_SOURCE
bash_source_size="${#BASH_SOURCE[*]}"
realpath=$(realpath "${BASH_SOURCE[$bash_source_size-1]}")
me=$(basename "${realpath}")
答え1
test.sh
呼び出されると、source
bashはcommon.sh
現在のスクリプトを明示的に取得してBASH_SOURCE
変数を更新します。test2.sh
コマンドの置き換え(何でも可能)および後続のコマンドを実行するとeval
明示的なことはsourcing
発生しないため、BASH_SOURCEは影響を受けません。
シェルスクリプトの検出
declare -p BASH_SOURCE
違いを確認する行:
$ ./test.sh
declare -a BASH_SOURCE='([0]="common.sh" [1]="./test.sh")'
declare -a BASH_SOURCE='([0]="./test.sh")'
me: common.sh
比較:
$ ./test2.sh
declare -a BASH_SOURCE='([0]="./test2.sh")'
declare -a BASH_SOURCE='([0]="./test2.sh")'
me: test2.sh
bashが知る限りでは、test2.sh
任意のコマンド、つまり$(echo ls)
。