tee가 포함된 한 명령의 출력을 표준 출력으로 가져오고 이를 다른 명령으로 파이프하려면 어떻게 해야 합니까?

tee가 포함된 한 명령의 출력을 표준 출력으로 가져오고 이를 다른 명령으로 파이프하려면 어떻게 해야 합니까?

중복일 수도 있고 아직 답변을 찾지 못했지만 하나의 명령을 여러 출력으로 파이프하려면 어떻게 해야 합니까(예: 파이프, 표준 출력 또는 명령 대체로 보내기)?

나는 다음 줄을 가지고 있습니다 :

$ command_with_output1 | tee >(command_with_output2) | command3

command_with_output1출력을 via 에서 stdoutvia 에서 via tee에서 via에서 via command_with_output2에서 >()via에서 command3via 로 보내고 싶습니다 |. 가능합니까? 이 목표를 달성하는 방법은 무엇입니까?

무의미한 예이지만, 제가 의미하는 바를 설명하기 위해 다음과 같을 수 있습니다.

  1. 배관 문제
    $ 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에서 로 전달 되지 않음 ). 아마도 파이프 없이 파일에서만 작동하기 때문입니다(여기서 틀렸다면 정정해 주십시오). .teestdinwhiletee

  1. 표준 출력 전달 문제
    cat <<< "abc" | tee >(xargs -I{} bash -c "for i in '{}'; do echo $i; done")
    

이 명령은 "after" 파이프를 사용하지 않지만 "abc"를 2번(다시 , now ) tee출력하고 싶지만 단 한 번만 출력하고 싶습니다.teefor 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

관련 정보