파이프에 tar하지만 -v verbose 출력을 STDERR과 별도로 유지


12

일반적인 tar 명령

tar cvf foo.tar ./foo >foo.out 2>foo.err

세 개의 출력 IO 스트림이 있습니다

  • foo.tar에 데이터 아카이브
  • STDOUT에 파일 이름 목록 (foo.out으로 리디렉션 됨)
  • STDERR에 대한 오류 메시지 (foo.err로 경로 재 지정)

그런 다음 파일 이름 목록을 읽을 필요없이 foo.err에서 오류 메시지를 검사 할 수 있습니다.

아카이브 데이터로 무언가를하고 싶다면 (netcat 또는 특수 압축 프로그램을 통해 파이프하십시오) tar -f -옵션을 사용할 수 있습니다

tar cvf - ./foo 2>foo.err | squish > foo.tar.S

그러나 tar의 -v출력이 분명히 STDOUT (아카이브 데이터가 흐르는 곳)으로 갈 수 없기 때문에 tar 는 파일을 STDERR에 영리하게 씁니다.

Korn 쉘을 사용하면 아카이브 스트림을 다른 명령으로 파이프하지만 여전히 -v오류 메시지와 별도로 출력을 캡처하는 명령을 구성하는 방법이 있습니다 .


익숙 tee하십니까? 이것은 꽤 유효한 유스 케이스처럼 보입니다.
HalosGhost

답변:


9

시스템이 다음을 지원하는 경우 /dev/fd/n:

tar cvf /dev/fd/3 ./foo 3>&1 > foo.out 2>foo.err | squish > foo.tar.S

ksh(또는 bash또는 zsh) 의 AT & T 구현으로 프로세스 대체를 사용하여 작성할 수 있습니다 .

tar cvf >(squish > foo.tar.S) ./foo > foo.out 2>foo.err

이번에는 쉘이 3(일반적으로 9 이상) 대신 사용할 파일 설명자를 결정한다는 점을 제외하고는 똑같은 일을하고 있습니다. 또 다른 차이점은 이번에는의 tar대신 종료 상태를 얻는다는 것입니다 squish. 를 지원하지 않는 시스템 /dev/fd/n에서 일부 쉘은 해당 기능에 대해 명명 된 파이프를 사용할 수 있습니다.

시스템이 지원하지 않거나 /dev/fd/n쉘이 프로세스 대체를 위해 명명 된 파이프를 사용할 수없는 경우, 여기서 명명 된 파이프를 직접 처리 해야합니다 .


6

이를 위해 명명 된 파이프를 사용해야합니다.

먼저 폴더에 하나를 만드십시오.

mkfifo foo.pipe

그런 다음 해당 명령을 사용하십시오.

tar cvf foo.pipe ./foo >foo.out 2>foo.err & cat foo.pipe >foo.tar

주의 사항 :cat part의는, 이제 할 수 있습니다 gzip또는 파이프에서 읽을 수 무엇 :

tar cvf foo.pipe ./foo >foo.out 2>foo.err & gzip -c foo.pipe >foo.tar

설명:

출력은 이름 관 (기록되는 foo.pipe다른 였는지를 ()는, cat, gzip, netcat)로부터 판독한다. 따라서 정보를 위해 stdout / stderr 채널을 풀지 마십시오.


1
명명 된 파이프 사용의 의미에 주목할 가치가 있습니다 . 1) 가장 좋은 방법은 umask 077다른 프로세스가 읽거나 쓰는 것을 방지하기 위해 (또는 개인 임시 디렉토리를 사용하는 것) 설정하는 것입니다 (많은 시스템에서 다른 파일과 같이 명명 된 파이프는 기본적으로 세계에서 읽을 수 있도록 만들어집니다), 2) 확인해야합니다 명명 된 파이프는 스크립트의 각 인스턴스에서만 사용됩니다 (일회성 개인 임시 디렉토리 도움말). 3) 나중에 또는 중단 된 경우 정리해야합니다.
Stéphane Chazelas

1
+1-이 답변이 마음에 듭니다. 불행히도 내 (오래된) 시스템의 명명 된 파이프에는 이상한 점이있어서 시도 할 때 신뢰할 수 없습니다.
RedGrittyBrick

1
@ StéphaneChazelas-때때로 다음과 같이 정리하는 것이 더 쉬울 수 있다고 생각합니다.p="/tmp/pipe$$"; mkfifo "$p"; (read na; cmd[s]...) <>"$p" & (echo;rm "$p"; cmd[s]...) >"$p"
mikeserv

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.