타르와 핵심 문자 : 버그입니까, 아니면 기능입니까?


18

이 두 명령의 차이점을 묻고 싶었습니다 (즉, 옵션의 순서 만 다릅니다).

  1. tar -zxvf foo.tar.gz
  2. tar -zfxv foo.tar.gz

첫 번째는 완벽하게 실행되었지만 두 번째는 완벽하게 실행되었습니다.

tar: You must specify one of the `-Acdtrux' or `--test-label'  options
Try `tar --help' or `tar --usage' for more information.

그리고와 타르 --test-label와는 -zfxv말했다 :

tar (child): xv: Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now

그런 다음 tar 설명서를 살펴보고 모든 예제가 -f결국 스위치 를 사용하고 있음을 깨달았습니다 !

AFAICT이 제한이 필요하지 않습니까? 내보기에는 스위치를 주문해야하기 때문입니다.


2
@schily 명령 줄에 대한 "수정"은 실제로 입력 한 명령을 모호하게했습니다. 선행 대시는 다른 인수 파서를 사용하도록 GNU tar의 동작을 변경합니다. 대시 (따라서 전통적인 인수 파서)를 사용하지 않으면 두 번째 명령이 작동했을 것입니다.
Random832

웹 시스템의 델타 인쇄물은 귀하 또는 다른 사람이-를 추가하기 전에 나에게 알려 주었으므로 시스템이 OP에서 말한 것과 일치하도록 다시 제거했습니다. 그러나에 맞다면 gtar option parsinggtar를 사용하지 않는 또 다른 이유를 발견 했습니다 .
schily

1
-f파일 이름을 따를 것으로 예상합니다. 두 번째 버전에서는을 지정 -fxv했습니다. tar의 경우 파일 이름이 "xv"임을 의미합니다.
Rolf

1
의무적 인 XKCD .
Pavel

답변:


11

오류 메시지를 보면 사용 tar하지 않고 오히려 사용하고 있음이 분명합니다 gtar.

일반적으로 이것은 이해하는 데 도움이 될 수 있습니다.

  • tar일반적으로 항상 파일 인수가 필요합니다. 누락 된 경우 시스템의 기본 실제 테이프 장치에서 읽거나 씁니다. star기본적으로 stdin / stdout을 사용하도록 1982 년에이를 변경했으며 최근에 다른 tar 구현 (예 : gtar)이이 예를 따랐습니다.

  • tartar 명령의 경우 -호출 key letters되는 옵션에 대한 선행 을 구현하지 않습니다 . 일부 구현은 나중에 -사용자 편의를 위해 키없는 문자로 추가 되었지만이를 신뢰할 수는 없습니다.

  • tar인수 (특히 아카이브 파일 인수)를 구문 분석 하는 방법 은 매우 위험합니다. 관련 파일 인수가 tar 아카이브 파일로 사용 되었기 때문에 아카이브에 있어야하는 파일 중 하나를 파괴하는 많은 tar 아카이브가 있습니다. star이러한 이유로 (기본적으로로 호출되는 경우 star) "f"를 다른 옵션과 연결할 수 없습니다. star호출 되면 이 tar명령은와의 명령 행 호환성을 구현 tar하지만 여전히 "f"키 문자의 인수를 다르게 처리합니다. 인수는 실제 디바이스 파일을 참조하거나 파일이 아직 존재하지 않는 경우에만 허용됩니다. .

위험한 원래 tar 명령 줄을 피하고 최신의보다 안전한 명령 줄 구문을 사용하는 것이 좋습니다 star.

의 명령 행 구문에 문제가 있기 때문에 1990 년대 초에 tar소위 호출 tar wars되었습니다. 그 결과, 프로그램 pax(타르 전쟁에서 "평화"를위한 라틴어)이 만들어지고 표준화되었습니다. pax그러나 구문이 덜 위험하지만 tar 구문보다 직관적이지 않기 때문에 인기를 얻지 못했습니다. 또 다른 문제는 gpax다소 유지되지 않은 것일 수 있습니다 .


3
타르 전쟁이 끝났습니다. 건타 원.
Joshua

2
만약 당신이 옳다면, 왜 모든 tar 구현이 기능을 복사 star합니까?
schily

1
BTW : 타르 전쟁 사이의 전쟁이었다 tarcpio.
schily

2
보인다, 그래서 OK, star-f"$file"(뿐만 아니라도 ind) 파일 이름으로 시작하는 문제 =. 그래서 하나의 요구는 하나 쓰기 -f="$file"또는 -f "$file". 나는 당신의 별 옵션 구문 분석을 더 안전 하거나 현대적 이라고 확신하지 않습니다 .
Stéphane Chazelas

3
-long스타일 긴 옵션은 압축 된 -xyz짧은 옵션 또는 과 호환되지 않습니다 -xarg. 그렇기 때문에 X11 스타일의 긴 옵션에는 짧은 옵션이 분리되어 있어야하고 ( -x -y, not -xy) 옵션 인수가 별도의 인수에 있어야합니다 ( xterm -n foo, not xterm -nfoo). 그렇기 때문에 GNU 긴 옵션에 여분의 대시가 있고 짧은 옵션과의 혼동을 제거하고 GNU 스타일의 긴 옵션이 더 나은 디자인 인 이유입니다. 겹침을 피하기 위해 매우 신중한 경우에만 -foo공존 할 수 있습니다 -x -y -xy.
Stéphane Chazelas

55

스위치의 순서는 비어 있지만 읽기 / 쓰기 할 -f파일 인 필수 인수가 tar있습니다.

넌 할 수있어

tar -zf foo.tar.gz -xv

작동하며 비 특정 스위치 순서에 대한 요구 사항이 있습니다.

인수가있는 옵션이있는 모든 명령이 작동하는 방식입니다.


5
Tar은 "ar"명령과 이전 (POS 이전) "ps"명령에서 사용되는 것과 훨씬 다른 이전 명령 줄 구문 분석기를 사용하므로 다른 명령처럼 작동하지 않습니다.
schily

1
선택한 답변은 철저하면서도 실제로 문제가 무엇인지 알 수 없었습니다. 돌이켜 보면 tar가 'xv'파일을 읽으려고한다는 오류 메시지에서 명백한 것 같습니다
Josh Rumbut

1
나는 그것을 선언 할 수 있다고 믿습니다. -f=./myfile즉, f는 값을 취하고 플래그가 아니며 입력입니다.
ThorSummoner

14

전통적으로 tar의 옵션 다소 "순서가 없습니다"( fb옵션 의 순서는 둘 다 지정되면 중요합니다). 그러나 선행 대시를 사용하면 GNU tar가 다른 명령과보다 일관성있는 것으로 간주되는 방식으로 옵션을 구문 분석합니다. 여기서 파일 이름과 같은 인수가 필요한 옵션을 지정 f하면 나머지 "단어"가 즉시 소비됩니다. 임의의 인수로 (전통적 타르가 사용하는 경우에 다음의 파일명 / 블록 사이즈로 단어 때 f또는 b지정된). 귀하의 경우, "xv"를 파일 이름으로 사용했습니다.

그러나이 동작은 이식성에 의존 할 수 없습니다. 이식성을 극대화하려면 대시 사용을 피하고 항상 f마지막에 배치 f하고 파일 이름과 파일 사이에 공백을 두어야합니다 . 그러나 이것은 b옵션 이 필요한 경우 또는 일반적으로 인수가 필요한 옵션 C이외의 다른 옵션 (예 :)으로 분류되는 단순화입니다 f.

이 내용은 Tar 매뉴얼 섹션 "세 가지 옵션 스타일"에 설명되어 있습니다. 다른 구현 (예 : FreeBSD)은 이전 스타일 옵션을 "번들 옵션 단어"라고합니다. 물론 일부 구현 에서는 이 유형의 옵션 지원할 수 있으며 포함 된 경우 대시를 무시하거나 무시하지 않을 수 있습니다. 이것은 단일 유닉스 사양에 지정된 유일한 호출 형식이므로 거의 모든 시스템에서 작동합니다.


2
일부 구현에서는 인수가있는 다른 옵션을 지원합니다 ( CBSD 또는 GNU tar에서 와 같이) . schily tar는 -C로 지원하지만 C는 지원하지 않으며 모두 -C로 지원합니다.
Stéphane Chazelas

0

tar에서 - 스위치는 수년 전에 더 이상 사용되지 않으며 더 이상 필요하지 않습니다. 타르는 실제로 그 사실을 말했지만 더 이상은 아닙니다.

ie:
tar zxvf foo.tar.gz
tar zfxv foo.tar.gz

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