파이프에 tar하지만 -v verbose 출력을 STDERR과 별도로 유지 압축 프로그램을 통해 파이프하십시오) tar -f -옵션을

일반적인 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오류 메시지와 별도로 출력을 캡처하는 명령을 구성하는 방법이 있습니다 .



답변

시스템이 다음을 지원하는 경우 /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쉘이 프로세스 대체를 위해 명명 된 파이프를 사용할 수없는 경우, 여기서 명명 된 파이프를 직접 처리 해야합니다 .


답변

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

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

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 채널을 풀지 마십시오.


답변

GNU tar의 --index-file옵션 은 잘 작동합니다 :

tar cvf - ./foo 2>foo.err --index-file=foo.out | squish > foo.tar.S


답변