1. ホーム
  2. bash

[解決済み] スクリプトの実行に関連したファイルの参照

2022-08-12 09:24:05

質問

私が書いているbashスクリプトで、私は source を使って、設定ファイルに定義された変数をインクルードしています。実行されるスクリプトは act.sh であるのに対し、実行されるスクリプトは source d は act.conf.sh であるため act.sh を持っています。

source act.conf.sh

しかし、これは act.sh を含むディレクトリで実行したときだけです。 act.conf.sh は、作業ディレクトリの下に置かれたファイルを参照しているからです。を呼び出すことなく、実行中のスクリプトからの相対的なファイルを参照するようにする解決策はありますか? cd ? ありがとうございます。

どのように解決するのですか?

参照してください。 BASH FAQ entry #28: "スクリプトの場所を決めるにはどうしたらいいですか?同じ場所からいくつかの設定ファイルを読み込みたいのですが、"

どのような解決策も100%うまくいくわけではありません。

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

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

スクリプトが特定のシェルからのみ実行され、少しの柔軟性が必要であると仮定すると、おそらくこの偏執狂をいくらか緩和することができます。それでも、オプションを検討するのは良いことです。人々が使用する、特に問題のある一般的なパターンがあります。

特に、FAQ では、非常によく使われる $0 変数を避けることを推奨しています。

を読み取るものはありません。 $0 は決して防弾にはならないでしょう。 $0 自体が信頼できないからです。

代替案として $BASH_SOURCE を使うこともできます。このようなものです。

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

この解決策にもいくつかの注意点があります。FAQのページで、異なるソリューション間のトレードオフを確認してみてください。彼らは cd と組み合わせて $BASH_SOURCE を組み合わせると、正しく展開できなかったときに便利なエラーコンディションが得られるので、うまくいく場合があります。