bash サブシェル `sed` の出力をデフォルトのシェル環境変数に入れる方法 [重複]

bash サブシェル `sed` の出力をデフォルトのシェル環境変数に入れる方法 [重複]

sedbashサブシェル出力をデフォルト/ルートシェル環境変数に入れるには?

それは失敗するでしょう、

v=`echo NO |tee >(sed 's/^/&YES/' )`

実際の状況を解決するには?

答え1

動作します(Linux Mint 18.1、GNU bash、バージョン4.3.48)。

Paul--) unset v
Paul--) v=`echo NO |tee >(sed 's/^/&YES/' )`
Paul--) declare -p v
declare -- v="NO
YESNO"

あなたはそれが何をすることを期待していますか?問題は、プロセス代替構文である>(..)を使用していることです。

teeはNOをコピーしてsedを介して送信します。したがって、teeは生データをNO\n標準出力に出力しますが、sedは別々のプロセスとして実行され、標準出力に送信さNOYES\nれます。バックティックでのコマンド置換はv

sedは別のプロセスで実行され、過去にはbashが完了するのを待たない問題がありました。したがって、特に2番目のプロセスに時間がかかる場合、この構成では競合状態が発生する可能性があります。

関連情報