tar를 파이프로 전송하지만 STDERR에서 -v 자세한 출력을 분리합니다.

tar를 파이프로 전송하지만 STDERR에서 -v 자세한 출력을 분리합니다.

일반적인 tar 명령

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

3개의 출력 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에 기록합니다.

-vKorn 셸을 사용하면 아카이브를 다른 명령으로 스트리밍하지만 여전히 오류 메시지와 별도로 출력을 캡처하는 명령을 작성하는 방법이 있습니까 ?

답변1

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

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

kshAT&T에서 (또는 bash) 을 구현 하려면 zsh다음을 사용할 수 있습니다.프로세스 교체:

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

이는 기본적으로 동일한 작업을 수행하지만 이번에는 쉘이 사용할 파일 설명자 3(보통 9 이상)를 결정합니다. 또 다른 차이점은 이번에 tar는 대신 종료 상태를 얻는다는 것입니다 squish. 지원되지 않는 시스템에서 /dev/fd/n일부 쉘은 이 기능을 달성하기 위해 명명된 파이프에 의존할 수 있습니다.

시스템이 이를 지원하지 않거나 /dev/fd/n쉘이 프로세스 대체를 위해 명명된 파이프를 사용할 수 없는 경우 다음을 수행해야 합니다.명명된 파이프를 수동으로 처리.

답변2

이렇게 하려면 명명된 파이프를 사용해야 합니다.

먼저 폴더에 하나를 만듭니다.

mkfifo foo.pipe

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

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

알아채다:- section 은 이제 파이프에서 읽을 수 있는 무엇이든 cat될 수 있습니다 .gzip

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

설명하다:

출력은 명명된 파이프( foo.pipe)에 기록되고 다른 프로세스( cat, gzip, netcat)는 여기에서 읽습니다. 따라서 stdout/stderr 정보 채널이 손실되지 않습니다.

답변3

GNU 타르--index-file옵션좋은 결과:

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

관련 정보