일반적인 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에 기록합니다.
-v
Korn 셸을 사용하면 아카이브를 다른 명령으로 스트리밍하지만 여전히 오류 메시지와 별도로 출력을 캡처하는 명령을 작성하는 방법이 있습니까 ?
답변1
시스템이 다음을 지원하는 경우 /dev/fd/n
:
tar cvf /dev/fd/3 ./foo 3>&1 > foo.out 2>foo.err | squish > foo.tar.S
ksh
AT&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