![bash 하위 쉘 `sed`의 출력을 기본 쉘 환경 변수에 넣는 방법 [중복]](https://linux55.com/image/178608/bash%20%ED%95%98%EC%9C%84%20%EC%89%98%20%60sed%60%EC%9D%98%20%EC%B6%9C%EB%A0%A5%EC%9D%84%20%EA%B8%B0%EB%B3%B8%20%EC%89%98%20%ED%99%98%EA%B2%BD%20%EB%B3%80%EC%88%98%EC%97%90%20%EB%84%A3%EB%8A%94%20%EB%B0%A9%EB%B2%95%20%5B%EC%A4%91%EB%B3%B5%5D.png)
sed
bash 하위 쉘 출력을 기본/루트 쉘 환경 변수에 넣는 방법은 무엇입니까 ?
그것은 실패할 것이다,
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가 완료될 때까지 기다리지 않는 문제가 있었습니다. 따라서 특히 두 번째 프로세스에 시간이 걸리는 경우 이 구성에서 경쟁 조건이 발생할 수 있습니다.