スクリプトの実行に関連するファイルの参照


94

私が書いているbashスクリプトsourceでは、構成ファイルで定義された変数を含めるために使用しています。実行するスクリプトがあるact.shことにするスクリプトながら、sourcedがあるact.conf.shそうで、act.sh私は持っています:

source act.conf.sh

ただし、これは作業ディレクトリの下に配置されたファイルを参照するため、act.shそれを含むディレクトリで実行している場合にのみ機能act.conf.shします。呼び出すことなく、実行中のスクリプトに関連するファイルを参照させる解決策はありますcdか?ありがとう。

回答:


116

参照:BASH FAQエントリ#28:「スクリプトの場所を確認するにはどうすればよいですか?同じ場所からいくつかの設定ファイルを読みたいのです。」

どのようなソリューションでも、100%は機能しません。

一般的なケースでは、この問題には解決策がないことを認識することが重要です。あなたが聞いたことがあるかもしれないアプローチ、および以下で詳述されるアプローチはすべて欠陥があり、特定のケースでのみ機能します。何よりもまず、スクリプトの場所に依存しないようにして、問題を完全に回避してください。

非常に再利用可能なツールを作成する必要がある場合は、スクリプトへのパラメーターとして正しいパスを使用するのが最も信頼できる方法です。

スクリプトが特定のシェルからのみ実行され、少しの柔軟性が必要なだけであると想定すると、このパラノイアのいくつかを緩和できるでしょう。それでもあなたの選択肢を見るのは良いことです。人々が使用する一般的なパターンには、特に問題があります。

特に、FAQでは、非常に一般的に使用される$0変数を回避することを推奨しています。

それ自体が信頼できない$0ので、読むものは決して防弾にはなりません$0

代わりに、$BASH_SOURCE代わりに使用できます。このようなもの:

source "${BASH_SOURCE%/*}/act.conf.sh"

このソリューションにはいくつかの注意点もあります。FAQページをチェックして、さまざまなソリューション間のトレードオフを確認してください。適切に拡張できないと便利なエラー状態になるので、うまくいく場合cdと組み合わせて使用$BASH_SOURCEすることをお勧めします。


1
よろしくお願いしますreadlink。検索するキーワードを特定できなかったため、ここに質問を投稿しました...
Ryan Li

9
bashのFAQがダウンした場合に備えて、関連情報を回答に取り込むことはできますか?
Merlyn Morgan-Graham

3
Linkの推奨事項:cd "${BASH_SOURCE%/*}" || exit、またはread somevar < "${BASH_SOURCE%/*}/etc/somefile"、Linkは強く 推奨し$0ません「$ 0自体は信頼できないため、$ 0を読み取るものはすべて防弾にはなりません。」
ThorSummoner 2015

10
BASH_SOURCEの後の%/ *は何をしますか?
Silicomancer 2016


34

これを見てください:Bash:他のスクリプトをどのように_best_含めるか?

私は使用することをお勧めします:

source $(dirname $0)/act.conf.sh

8
これはあなたが求める答えではありません。$0本質的にバギーです。理由のトップ投票と承認された回答を参照するか、単にmywiki.wooledge.org/BashFAQ/028を読んでください -質問に対する短い回避策は次のようなものですsource "${BASH_SOURCE%/*}/act.conf.sh"
Merlyn Morgan-Graham

5

以下を試してください:

source ${BASH_SOURCE[0]/%act.sh/act.conf.sh}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.