표준 출력 및 프로세스로 "티"하는 가장 좋은 방법

표준 출력 및 프로세스로 "티"하는 가장 좋은 방법

나는 이런 일을하고 싶다 :

echo 'foo' | tee /dev/stdout > >(cat)

여기서 stdout은 echo터미널과 cat 프로세스로 전송됩니다. 이 작업을 수행하는 더 쉬운 방법이 있나요?

내가 이것을 실행할 때 :

 echo 'foo' | tee >(echo 'bar')

어떤 이유에서인지 "foo"는 에코되지 않고 "bar"만 에코됩니다. 이유는 무엇입니까?

답변1

보여드린 대로 정확하게 수행합니다.

somecommand | tee >(othercommand)

출력은 입력 및 표준 출력 somecommand에 기록됩니다 .othercommand

프로세스 교체의 문제점 은 에서 입력을 echo 'bar'신경 쓰지 않으므로 최대한 빨리 출력하고 종료한다는 것입니다 . 그런 다음 유틸리티는 이에 쓰려고 시도하지만 실패하고 표준 출력에 문자열을 쓰기 전에 신호 수신에서 종료됩니다. 또는 데이터가 프로세스 교체에 기록될 시간이 있을 수 있습니다. 이 경우 ` 및 `가 모두 표준 출력에 인쇄되므로 결정적이지 않습니다.teeecho 'foo'barteePIPEteebarfoo

프로세스 교체의 명령이 실제로 전송된 데이터를 읽는지 확인해야 합니다(그렇지 않으면 데이터를 전송하는 이유가 무엇입니까?). Billy 삼촌이 댓글에서 제안한 것처럼, 이는 프로세스 대체를 사용하여 예제에서 쉽게 정리할 수 있습니다 cat >/dev/null( 의 데이터에 관심이 없다고 가정 tee).

echo 'foo' | tee >(cat >/dev/null; echo 'bar')

또는

echo 'foo' | tee >(echo 'bar'; cat >/dev/null)

(두 변형은 두 문자열의 최종 출력 순서만 다릅니다)

답변2

결과가 로 파이프되어 /dev/null파이프가 유효한지 여부를 가리기 때문에 허용된 답변이 나에게 명확하지 않습니다.

값이 전달되었는지 확인하는 연습을 하려면 다음과 같이 파이프된 값을 cat사용하거나 사용할 수 있습니다 tr.

% echo foo | tee >(tr -d '\n') ; echo bar
foo
foobar

답변3

echo 'foo' | tee /dev/tty |other-program

관련 정보