“tar xzf-”에서 하이픈“-”은 무엇을 의미합니까?


23

커맨드 라인에서 dropbox를 설치하려고 할 때 명령을 읽습니다.

cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -

-여기서 무엇을 의미합니까? 이전 디렉토리입니까?


9
약간의 pedantry : 당신이 요구하는 옵션은입니다 f -. 이렇게하면 매뉴얼 페이지에서 답을 찾는 것이 조금 더 쉬워 질 수 있습니다.
studog

4
당신이 무엇을 설명 할 수 있다면 정말 도움이 될 것입니다 정확하게 의 문서에 대한 당신 불분명 wget하고 tar. 이렇게하면 각 개발자가 문서를 개선하여 향후 사용자가 다시 같은 문제를 겪지 않게 할 수 있습니다. 다시 말해, 영웅이되어 세상을 더 나은 곳으로 만드십시오!
Jörg W Mittag

2
tar가 stdin을 사용하는 것이 좋은 기본값이지만, 유산으로 테이프로 작업하는 것은 그렇게하지 않았습니다. 대신 파일 작업 방법 (f 옵션 사용)을 익힌 다음 stdin의 파일 이름 대신에 규칙을 따릅니다 (
만약 eXtract

1
@eckes GNU tar의 경우 , 설정되지 않은 경우 stdin 기본값 $TAPE입니다.
chrylis

답변:


42

일부 명령 -은 파일 이름 대신 다음 중 하나를 허용 합니다.

  • 명명 된 파일 대신 표준 출력에 기록 합니다. 이것이 후에 -전달 된 논쟁 이하는 일입니다.wget-O
  • 명명 된 파일 대신 표준 입력 에서 읽습니다 . 이것은 -인수가 tar이후에 전달 된 것 xzf입니다.

표시 한 명령은로 아카이브 파일을 다운로드 wget하고 압축을 풉니 다 tar. 이를 위해 출력 wget된다 파이프 ( |의 입력) tar. 그렇기 때문에 wget파일 대신 표준 출력에 쓰고 파일 tar대신 표준 입력에서 읽습니다.


"일부 명령"이 아니라 "대부분의 명령"이라고 말하고 싶습니다. POSIX 옵션 구문 사양의 일부라고 생각합니다.
Barmar

2
@Barmar 예 및 아니오 : 가이드 라인 13 : 피연산자를 사용하여 읽기 또는 쓰기를 위해 열 파일을 나타내는 유틸리티의 경우 '-'피연산자는 표준 입력 (또는 문맥에서 명확하지 않은 경우 표준 출력)만을 의미해야합니다. 출력 파일이 지정됨) 또는이라는 파일 -입니다. . 그래서 경우는 - 에 "파일 옵션"에 대한 피연산자입니다 는 특별한 의미를 가지고, 다음 은 표준 입력 / 표준 출력의이어야합니다. 이 프로그램은 특별한 경우로 취급되지 않고 파일을 찾기 만하면됩니다-
Bakuriu

(그리고 일반적으로 옵션을 생략하는 경우는을 사용하는 것과 같습니다 -)
Bakuriu

@Bakuriu 나는 그것이 내가 말한 것을 반박하는 방법을 보지 못합니다. 대부분의 명령은 파일 이름 인수를 사용한다고 생각하므로 해당 지침을 따라야합니다. 그러나 아마도 "파일에서 작동하는 대부분의 명령"으로 규정했을 것입니다.
Barmar

1
지침을 따라하는 한 가지 방법 @Barmar하는 것입니다 감소 치료하는 -문자 그대로의 이름으로 치료, 전혀 특별. 가이드 라인에 반하는 유일한 방법은 -특별히 취급 하지만 가이드 라인이 제안하는 것 이외의 다른 의미 로 처리 하는 것입니다.
엘리아 케이건

12

그것은 많은 유닉스 프로그램이 "파일을 실제로 열지 않고 읽 stdin거나 쓰는 것 "으로 해석하는 파일 이름 일뿐 stdout입니다.

즉, 프로그램으로 스트리밍되는 입력에서 읽습니다. 귀하의 경우 wget의 출력입니다.


6
그래도 실제로 파일 이름 입니까?
Eric Duminil

7
@EricDuminil 프로그램이 파일 이름 만 받아들이는 곳에서는 프로그램이 파일을 받아들이는 점에서 파일 이름이지만 실제로는 일부 디렉토리에있는 파일의 실제 이름이 아니라는 것이 옳습니다.
JoL

5
@EricDuminil : 특히이 규칙을 따르는 프로그램의 ./-경우 실제로 라는 파일을 열려면 사용해야 합니다 -.
Jörg W Mittag

4
@EricDuminil 사실 : 예! 그것은 이름 파일을 ; 유닉스 의미에서 stdin파일 디스크립터이며 -이를 사용하기 위해 제공 한 이름입니다. 그러나 OS의 관점에서 파일 이름은 아닙니다. 사용자 관점에서만.
마커스 ül 러

3
@rexkogitans no. /dev/stdin일부 커널 기능에서 제공하는 편리한 파일 이름입니다. stdin을 사용하도록 선택한 프로그램을 작성할 때 일반적으로 어디서나 발생 하지 않습니다 fopen("/dev/stdin", "r") . 그냥 가서 extern FILE* stdinlibc 헤더가 제공 한 것을 사용하십시오. 그건 그렇고, 그것은 정수 파일 디스크립터 0입니다.
마커스 ül 러

5

-에 인수 tar아카이브에서 읽을되도록 지정 stdin파일 대신. 로부터 GNU 타르 설명서 :

당신이 사용하는 경우 -int로서 아카이브 이름 , tar(목록 또는 파일을 추출 할 때) 표준 입력에서 아카이브를 읽고

다른 명령은 동작이 동일하며 POSIX.1-2017 표준에 의해 지정됩니다 .

지침 13 :

피연산자를 사용하여 읽기 또는 쓰기를 위해 열 파일을 나타내는 유틸리티의 경우, ' -'피연산자는 표준 입력 (또는 출력 파일이 지정되고 있음을 명확하지 않은 경우 표준 출력) 또는 파일 만 의미해야합니다. 이름이 -.

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