whileループ内でソースコードが機能しません。

whileループ内でソースコードが機能しません。

これはおそらく本当に愚かなことですが、どこでも答えを見つけることができません。プロセスをより体系的にするために.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 ) 

関連情報