これはおそらく本当に愚かなことですが、どこでも答えを見つけることができません。プロセスをより体系的にするために.bashrc.d
ソースコードをインポートするスクリプトを含むディレクトリを設定してみました。.bashrc
のすべてのスクリプトを手動でインポートするのではなく、.bashrc.d
次の方法でインポートします。
if [ -d "$HOME/.bashrc.d" ]; then
find "$HOME/.bashrc.d/" -type f -name "*.sh" | sort | \
while read -r f; do
source "$f"
done
fi
しかし、source "$f"
コマンドが実際にファイルをインポートしないため、サブシェル内で実行されているようです。の出力からわかるようにこれを実行しますset -x
が、たとえば、変数のエクスポートは元の反復シェルに渡されません。また.bashrc
、ファイルを手動でソーシングすることが実際に機能するため(問題は解決されませんが)でソーシングするのではなく、whileループ内でソーシングするのに問題があることも知っています。正確に何が起こり、この問題を解決するには?
答え1
あなたは正しいです。あなたはsource
サブシェルで実行しています。この問題を解決するには、 find の出力をパイピングせずにファイルを繰り返すだけです。
for script in "$HOME"/.bashrc.d/*.sh
do
if [ -r "$script" ]
then
. "$script"
fi
done
答え2
while
コマンドはサブシェルで実行されるのではなくパイプされます。このlastpipe
オプションを設定すると、ジョブ制御を含む対話型シェルには役立ちません。 「プロセスの交換」を試してください(あなたのbash
バージョンで提供されている場合)。
while read -r f; do source "$f"; done < <( find "$HOME/.bashrc.d/" -type f -name "*.sh" | sort )