내가 아는 한, tee 명령을 사용하여 표준 출력을 화면과 추가 파일로 분할 할 수 있습니다.
command -option1 -option2 argument | tee file1 file2 file3
이론적으로 일련의 명령을 만들 수 있도록 tee를 사용하여 파일 대신 명령으로 출력을 리디렉션 할 수 있습니까?
내가 아는 한, tee 명령을 사용하여 표준 출력을 화면과 추가 파일로 분할 할 수 있습니다.
command -option1 -option2 argument | tee file1 file2 file3
이론적으로 일련의 명령을 만들 수 있도록 tee를 사용하여 파일 대신 명령으로 출력을 리디렉션 할 수 있습니까?
답변:
명령 행에서 명명 된 파이프 ( 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
명명 된 파이프가 닫히고, /tmp/dataN
일반적으로 cmdN
프로세스를 종료 할 각각의 EOF (읽기 0 바이트) 신호를 보냅니다 . 실제 예 :
$ 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
정상적으로 종료되었습니다.
/tmp/data/{0,1,2}
. 그런 다음 bash에서 프로세스 대체를 사용 하고 mkfifo
완전히 건너 뛸 수 있습니다.
내가 제대로 이해한다면, 당신은 동등한 찾는 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
입력으로.
당신의 입력을 복제 할 경우에 따라서 예를 들어, somecommand
모두에 전달 cmd1
하고 cmd2
, 당신은 사용할 수 있습니다
somecommand | tee >(cmd1) | cmd2
쉘이 프로세스 대체를 지원하지 않으면 대신 명명 된 파이프를 사용할 수 있습니다. 작동 방식에 대해서는 Arcege의 답변 을 참조하십시오 . 명명 된 파이프는 파이프를 생성 및 삭제하고 수동으로 프로세스를 시작 및 동기화해야하기 때문에 프로세스 대체보다 편리하지 않습니다. 모든 쉘이 프로세스 대체를 지원하지는 않지만 완전히 이식 가능하다는 장점이 있습니다. 또한 프로세스 대체가 아닌 다른 시나리오에서도 사용할 수 있습니다.
일부 시스템에서 프로세스 대체는 내부적으로 명명 된 파이프를 사용합니다. 그러나 대부분의 시스템에서 파일 디스크립터를 나타내는 명명 된 파일에 의존 합니다 .
pee
에서 moreutils
.
아무도 pee
moreutils ( https://joeyh.name/code/moreutils ) 의 명령을 언급하지 않은 것에 놀랐습니다 .