![「echo ${BASH_SOURCE[0]}」を含むスクリプトをインポートすると、ソーススクリプトのパス名が表示されます。](https://linux33.com/image/142061/%E3%80%8Cecho%20%24%7BBASH_SOURCE%5B0%5D%7D%E3%80%8D%E3%82%92%E5%90%AB%E3%82%80%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AE%E3%83%91%E3%82%B9%E5%90%8D%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82.png)
スクリプト自体のパス名を出力するbashスクリプトがあります。
$ cat f4.sh
#! /bin/bash
echo "${BASH_SOURCE[0]}"
別のスクリプト内にスクリプトをインポートして別のスクリプトを実行すると、他のスクリプトのパス名が出力されると思いました。これは、getスクリプトの内容をgetスクリプトにコピーしてgetスクリプトを実行するのと同じです。
しかし、私が間違っています。それでも元のスクリプトのパス名を出力します。
$ cat ff.sh
#! /bin/bash
source ../f4.sh
$ bash ff.sh
../f4.sh
なぜ?
他のスクリプトからパス名を直接出力するのではなく、f4.shを使用できるかどうか疑問に思います${BASH_SOURCE[0]}
。ありがとうございます。
答え1
この場合、メインスクリプトのパス名を取得するにはをBASH_SOURCE
使用する必要があります${BASH_SOURCE[1]}
。
各調達レベルに新しい要素が追加されます。スタート配列BASH_SOURCE
なので、${BASH_SOURCE[0]}
常に現在のソースファイルとその${BASH_SOURCE[1]}
ソースファイル(および${BASH_SOURCE[2]}
そのソースファイル)です。それソースの場合はソース)。基本的なスクリプトを理解するには、${BASH_SOURCE[-1]}
最後の要素を見てください。
スクリプトをインポートしても、スクリプトの内容はデフォルトのスクリプトに正確にコピーされません。これは良い通常のスクリプトを実行しますが、基本スクリプトと同じ環境で実行されます。関数の実行に似ています。