중복일 수도 있고 아직 답변을 찾지 못했지만 하나의 명령을 여러 출력으로 파이프하려면 어떻게 해야 합니까(예: 파이프, 표준 출력 또는 명령 대체로 보내기)?
나는 다음 줄을 가지고 있습니다 :
$ command_with_output1 | tee >(command_with_output2) | command3
command_with_output1
출력을 via 에서 stdout
via 에서 via tee
에서 via에서 via command_with_output2
에서 >()
via에서 command3
via 로 보내고 싶습니다 |
. 가능합니까? 이 목표를 달성하는 방법은 무엇입니까?
무의미한 예이지만, 제가 의미하는 바를 설명하기 위해 다음과 같을 수 있습니다.
- 배관 문제
$ cat <<< "abc" | tee >( > /dev/null) | while read i; do echo "$i"; done
이 명령은 "abc"를 2번(1. - tee
, 2. - while read...
) 인쇄해야 하지만 실제로는 한 번만 인쇄합니다.
user@host:~$ cat <<< "abc"| tee >( > /dev/null) | while read i; do echo $i; done
abc #only one, I would expect one more
따라서 두 번째 손실된 출력은 파이프 다음에서 "손실"될 것이라고 생각합니다(파이프 는 stdout
에서 로 전달 되지 않음 ). 아마도 파이프 없이 파일에서만 작동하기 때문입니다(여기서 틀렸다면 정정해 주십시오). .tee
stdin
while
tee
- 표준 출력 전달 문제
cat <<< "abc" | tee >(xargs -I{} bash -c "for i in '{}'; do echo $i; done")
이 명령은 "after" 파이프를 사용하지 않지만 "abc"를 2번(다시 , now ) tee
출력하고 싶지만 단 한 번만 출력하고 싶습니다.tee
for i in ...
user@Host:~$ cat <<< "abc" | tee >(xargs -I{} bash -c "for i in '{}'; do echo $i; done")
abc #only one, I would expect one more
설명하자면, 첫 번째 명령에서 제가 맞습니까? tee
파이프(그러나 파일)에는 출력이 없습니다. 두 번째 명령 설명의 경우 왜 2번 출력되지 않는지, xargs
명령이 출력을 '{}'
다음으로 전달하지 않는 이유는 무엇입니까?bash
답변1
당신의 설명배관 문제:
더 작은 덩어리로 나누어 보겠습니다.
$cat<<<"abc"--> 이 명령은 문자열 "abc"를 왼쪽 명령의 표준 입력에 전달합니다.고양이.
|티>( > /dev/null)--> 의티명령은 명령에서 입력을 받습니다.고양이표준 입력을 읽고 파일 출력을 /dev/null로 파이프한 다음 문자열 "abc"를 표준 출력에 씁니다.
|나를 읽을 때 echo "$i";--> 의읽다명령은 표준 입력에서 문자열 "abc"를 읽고 문자열 "abc"를 변수에 저장합니다.나그런 다음 루프가 내용을 인쇄합니다.나이것은 문자열 "abc"이며 단 한 번만 나타납니다.
이것티출력이 파이프로 연결되므로 이 명령은 터미널에 아무것도 인쇄하지 않습니다.읽다주문하다.
표준 출력을 파일에 작성해 볼 수 있습니다.
user@host:~$ cat <<< "abc"| tee file_name.txt | while read i; do echo $i >> file_name.txt; done; cat file_name.txt