한 명령의 출력을 여러 명령으로 리디렉션할 수 있습니까?

한 명령의 출력을 여러 명령으로 리디렉션할 수 있습니까?

내가 아는 한, tee 명령을 사용하여 표준 출력을 화면과 다른 파일로 분할할 수 있습니다.

command -option1 -option2 argument | tee file1 file2 file3 

이론적으로 일련의 명령을 생성할 수 있도록 tee를 사용하여 출력을 파일 대신 명령으로 리디렉션할 수 있습니까?

답변1

명명된 파이프(http://linux.die.net/man/1/mkfifo) 명령줄에서 tee명명된 파이프의 명령을 읽습니다.

mkfifo /tmp/data0 /tmp/data1 /tmp/data2
cmd0 < /tmp/data0 & cmd1 < /tmp/data1 & cmd2 < /tmp/data2 &
command -option1 -option2 argument | tee /tmp/data0 /tmp/data1 /tmp/data2

완료되면 command명명 tee된 파이프가 닫히고 각 파이프에 EOF(0바이트 읽기) 신호가 발생하며 /tmp/dataN일반적으로 cmdN프로세스가 종료됩니다. 실제 예:

$ mkfifo /tmp/data0 /tmp/data1 /tmp/data2
$ wc -l < /tmp/data0 & wc -w < /tmp/data1 & wc -c < /tmp/data2 &
$ tee /tmp/data0 /tmp/data1 /tmp/data2 < /etc/passwd >/dev/null
$ 61
1974
37

백그라운드 프로세스로 인해 쉘은 프로그램이 출력되기 전에 프롬프트를 반환합니다. 세 인스턴스 모두 wc정상적으로 종료되었습니다.

답변2

내가 올바르게 이해했다면, 당신은 동등한 것을 찾고 있지만 tee file1 file2 file3동일한 데이터를 세 개의 파일 및 에 쓰는 대신 file1동일한 file2데이터 를 세 개의 명령 으로 file3파이프하려는 것 입니다 cmd1.cmd2cmd3

… | ??? cmd1 cmd2 cmd3

다음과 같아야 합니다.

… | cmd1 &
… | cmd2 &
… | cmd3 &

하지만 한 번만 실행됩니다.

이를 수행하는 방법에는 두 가지가 있습니다.

Ksh93, bash 및 zsh 지원프로세스 교체. 이는 명령에 대한 인수가 파일이 되도록 허용하고 쓰기 시 데이터를 명령에 대한 입력으로 전달하는 파이프의 일반화입니다(읽을 때 명령의 데이터 출력을 가져오는 입력 변형도 있습니다). . 그건,

echo hello | tee >(cmd1)

hello표준 출력으로 인쇄 하고 추가로 입력 cmd1으로 실행합니다 hello.

예를 들어, 입력을 복사하여 and somecommand에 전달 하려면 다음을 사용할 수 있습니다.cmd1cmd2

somecommand | tee >(cmd1) | cmd2

쉘이 프로세스 대체를 지원하지 않는 경우 명명된 파이프를 사용할 수 있습니다. 바라보다알체고의 대답어떻게 작동하는지 알아보세요. 명명된 파이프는 프로세스를 생성하고 삭제해야 할 뿐만 아니라 프로세스를 수동으로 시작하고 동기화해야 하기 때문에 프로세스 교체보다 덜 편리합니다. 완전히 이식 가능하다는 장점이 있지만 모든 쉘이 프로세스 대체를 지원하는 것은 아닙니다. 프로세스 교체 이외의 시나리오에서도 사용할 수 있습니다.

일부 시스템에서는 프로세스 교체가 내부적으로 명명된 파이프를 사용합니다. 그러나 대부분의 시스템에서는 다음 사항에 의존합니다.파일 설명자를 나타내는 명명된 파일.

답변3

적어도 안으로mkfifo프로세스 대체를 사용하여 다음을 건너뛸 수 있습니다 .

command -option1 -option2 argument | tee >(cmd1) >(cmd2) >(cmd3)

또는 채택아르케의 예

tee >(wc -l) >(wc -w) >(wc -c) < /etc/passwd >/dev/null

답변4

pee아무도 moreutils의 명령을 언급하지 않았다는 사실에 놀랐습니다 (https://joeyh.name/code/moreutils).

관련 정보