関数を含むファイルがあり、foo
次のフローがある場合、スクリプト
Aはをsources
含めてfoo
呼び出しますfoo
。
次に、foo
2番目のスクリプトも同じファイルをソースとして使用します。
2番目のスクリプトで条件付きでファイルをインポートする方法があるかどうか疑問に思います。それとも影響がなく、このアプローチは一般的ですか?
答え1
スクリプトAが別のものを実行している場合、プログラムは関数定義を継承しません。 Bashには、環境を介して関数をエクスポートするためのあいまいな機能があります。これは実装にバグが現れるまでほとんど知られていません。必要に応じてエクスポートされた関数を使用できますが、export -f
環境に存在する関数に依存するのではなく、使用したい関数のみを定義する方が良いでしょう。
答え2
RalfFriedlがすでに説明したように、これが影響するかどうかは、ソーススクリプト内で実際に実行される内容によって異なります。スクリプトの内容を教えてくれないので、これが影響するかどうかはわかりません。
とにかく、2番目のスクリプトでこの種のチェックをするのは悪いデザインだと思います。ソーススクリプトは、等価な方法で作成する必要があります。いかなる不利益もなく、できるだけ頻繁にスクリプトをソースとして使用できるようにする必要があります。
私たちが「一度だけ」起こることを望むことはほとんどありません。一般的な状況は、PATH
ieまたはにいくつかのコンテンツを追加することですLD_LIBRARY_PATH
。スクリプトを複数回インポートすると、パスが長くなります。これを防ぐには、ソーススクリプトではなくソーススクリプトで保護する必要があります。私がよく使うパターンは次のとおりです。
# Put /foo/bar on top of PATH
: ${_src_xyz_version:=1}
if [[ ${_SRC_XYZ:=0} != $_src_xyz_version ]]
then
export _SRC_XYZ=$_src_xyz_version
export PATH=/foo/bar:$PATH
fi
この場合、PATH が拡張されると、マイプロセスまたはサブプロセスでスクリプトを再実行しても PATH は再度変更されません。〜しない限りプロセスは次のようにして要求を明示的に変更します。
export _SRC_XYZ=0