関数のパイプラインを介してリダイレクトエコーを実行すると環境変数が設定されない

関数のパイプラインを介してリダイレクトエコーを実行すると環境変数が設定されない

このコマンド:

echo '18' | source meta-cmf-raspberrypi/setup-environment

環境変数を設定せずに、代わりに単純に次のようにします。

source meta-cmf-raspberrypi/setup-environment

入力に「18」と入力します。
リンク先の質問:関数がパイプラインで呼び出されたときに環境変数が設定されない

試してみたが問題は解決しなかった:

echo '18' > >(source meta-cmf-raspberrypi/setup-environment)

成功しませんでした。どうすれば問題を解決できますか?

答え1

パイプラインでは、スクリプトは別の環境でソース化されています。プロセス置換の例も同様です。つまり、スクリプトで設定された変数は、呼び出しシェルの子環境で設定されます。子環境での変更は、親環境に伝播されることはありません。

この問題は、別の環境でスクリプトをソースすることを避けて、2 つの方法で解決できます。

最初の方法は、「here-strings」を理解するシェルで機能します。

source meta-cmf-raspberrypi/setup-environment <<<18

2 番目の方法は、標準のヒアドキュメントを使用することです。

source meta-cmf-raspberrypi/setup-environment <<END_INPUT
18
END_INPUT

どちらのバリエーションでも、スクリプトは現在の環境でソース化され、その入力は here-string/here-document からリダイレクトされます。

関連情報