일반적인 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