내가 아는 한, 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
.cmd2
cmd3
… | ??? cmd1 cmd2 cmd3
다음과 같아야 합니다.
… | cmd1 &
… | cmd2 &
… | cmd3 &
하지만 …
한 번만 실행됩니다.
이를 수행하는 방법에는 두 가지가 있습니다.
Ksh93, bash 및 zsh 지원프로세스 교체. 이는 명령에 대한 인수가 파일이 되도록 허용하고 쓰기 시 데이터를 명령에 대한 입력으로 전달하는 파이프의 일반화입니다(읽을 때 명령의 데이터 출력을 가져오는 입력 변형도 있습니다). . 그건,
echo hello | tee >(cmd1)
hello
표준 출력으로 인쇄 하고 추가로 입력 cmd1
으로 실행합니다 hello
.
예를 들어, 입력을 복사하여 and somecommand
에 전달 하려면 다음을 사용할 수 있습니다.cmd1
cmd2
somecommand | tee >(cmd1) | cmd2
쉘이 프로세스 대체를 지원하지 않는 경우 명명된 파이프를 사용할 수 있습니다. 바라보다알체고의 대답어떻게 작동하는지 알아보세요. 명명된 파이프는 프로세스를 생성하고 삭제해야 할 뿐만 아니라 프로세스를 수동으로 시작하고 동기화해야 하기 때문에 프로세스 교체보다 덜 편리합니다. 완전히 이식 가능하다는 장점이 있지만 모든 쉘이 프로세스 대체를 지원하는 것은 아닙니다. 프로세스 교체 이외의 시나리오에서도 사용할 수 있습니다.
일부 시스템에서는 프로세스 교체가 내부적으로 명명된 파이프를 사용합니다. 그러나 대부분의 시스템에서는 다음 사항에 의존합니다.파일 설명자를 나타내는 명명된 파일.
답변3
답변4
pee
아무도 moreutils의 명령을 언급하지 않았다는 사실에 놀랐습니다 (https://joeyh.name/code/moreutils).