파일 이름 대신 대시 (-) 사용


110

명령의 경우 -파일 이름 대신 인수로 사용하면 STDIN 또는 STDOUT을 의미합니다.

  1. 그러나이 예에서는 이름이 -다음 과 같은 파일을 만듭니다 .

    echo hello > -

    내가 할 수있는 방법 -이 예제에서는 STDOUT을 의미?

  2. 반대로, 어떻게 다음과 같은 예제에서 -이름이 지정된 파일을 만들 수 있습니까?-

    cat -

3
분명히 직접적으로 댓글을 달려면 50 개의 평판을 가져야하므로 ... / dev / stdin / dev / stdout 주석에서 합법적 인 UNIX 파생 인 AIX에는 이러한 의사 장치가 없습니다. 그리고 추가 설명으로, LINUX는 어떠한 경우에도 UNIX 파생물이 아닙니다. POSIX 호환 작업 방식이며 현재 유닉스 운영체제 중 가장 많이 사용되지만 실수는 없습니다. 이것은 UNIX가 아닙니다. 그러나 여기의 대답의 요지는 정확합니다. "-"표기법은 쉘에서 특수한 것으로 해석되지 않으므로 ARG로 각 개별 응용 프로그램에 직접 전달됩니다. 응용 프로그램이 인식되지 않는 경우

2>&-"가까운 설명자 2"를 의미하는 구성 도 있습니다 .
user3132194

@ user95873, 당신이 말하고 싶었던 것은 : Linux는 Unix와 비슷하지만 모든 Unix와 같은 (또는 진정한 UNIX) Linux는 아닙니다 . Linux가 참인지 아닌지에 관한 문제 UNIX (즉, 단일 UNIX 사양 준수)는 / dev / std {in, out, err} 문제와 관련이 없습니다. / dev / std {in, out, err} 기능 이 추가 되었으므로 누락 되지 않았습니다 .
sasha

답변:


156

-stdin / stdout을 의미하기 위해 파일 이름으로 사용 하는 것은 많은 프로그램에서 사용하는 규칙입니다. 파일 이름의 특별한 속성이 아닙니다. 커널은 -특별한 것으로 인식하지 않으므로 -파일 이름으로 언급되는 모든 시스템 호출 은 -문자 그대로 파일 이름으로 사용 됩니다.

bash 리디렉션을 사용하면 -특수 파일 이름으로 인식되지 않으므로 bash는 해당 파일 이름을 리터럴 파일 이름으로 사용합니다.

cat문자열 -을 파일 이름으로 볼 때 stdin의 동의어로 취급합니다. 이 문제를 해결하려면 cat이라는 파일을 참조하는 방식으로 보이는 문자열을 변경해야합니다 -. 이 일의 일반적인 방법은 경로와 파일 이름을 접두사이다 - ./-, 또는 /home/Tim/-. 이 기술은 명령 줄 옵션이 파일 이름과 충돌하는 유사한 문제를 해결하는 데에도 사용됩니다 . 예를 들어, 파일은 프로그램 ./-e-e명령 줄 옵션으로 표시되지 않습니다 .


37
그것은 그 추가 가치 /dev/stdin/dev/stdout보편적으로 사용할 수 있으며 대신 사용할 수 있습니다 -규칙.
jmtd

또한이 cat경우 인수를 나열하는 대신 리디렉션을 사용하면 도움이 될 수 있습니다. cat <-; 그러나 한 번에 두 개 이상의 파일을 연결하여이를 혼합하고 일치시키기는 어렵습니다.
jmtd

10
@jmtd : / dev / std {in, out}은 보편적으로 사용할 수 없습니다. 모든 유닉스에있는 것은 아닙니다.
camh

2
흥미롭게도 나는 그들이 POSIX의 일부라고 생각했지만 (확인할 수는 없습니다). 그들은 적어도 Linux, BSD 및 Solaris에 있습니다. 현대 유닉스가 부족한 예를 들어 줄 수 있습니까?
jmtd

1
@camh 알림을 받았는지 잘 모르겠습니다. 매우 오래된 주제입니다. 당신이 할 수 있는지 확실하지 않지만, jmtd의 질문에 대한 답을 알고 있다면 매우 궁금합니다 . :)
스위블

18
  1. 대신을 echo hello > -사용할 수 있습니다 echo hello > /dev/stdout.

    반면 '-'를 지원하고자하는 각 프로그램에 의해 구현 될 수있는 규칙이다 /dev/stdin, /dev/stdout하고 /dev/stderr있다가, 운영 체제 (적어도 솔라리스, 리눅스, BSD의 할)에서 지원하는 경우, 다음 응용 프로그램의 독립과는 같이 작동합니다 의도합니다.


9

으로 언급 camh , -단지 일부 프로그램에 의해 사용되는 명명 규칙입니다. 쉘이 인식 할 파일 디스크립터로 이러한 스트림을 참조하려면 jiliagre가 이름을 사용 /dev/stdin하거나 /dev/stdout대신 사용하는 것이 정확 합니다. 이러한 파일 이름은 정상적인 파일 이름이 작동하는 모든 장소에서 작동해야합니다.

  1. 즉, 첫 번째 예는 어리석은 것입니다. 경로 재 지정 연산자가 파일에 쓰기 위해 포착 한 출력은 이미 표준 출력이므로 ON으로 경로 재지 정하고 원래 위치로 다시 쓰는 것은 쓸모가 없습니다. 파이프를 사용하는 동작은 리디렉션이 아니라 파이프입니다.

    echo hello |
  2. 두 번째 예에서는 내부 별칭이 아닌 해당 이름의 문자 파일을 원한다는 표시 만하면됩니다. 다음과 같이 파일 경로를 지정하여 가장 쉽게 수행 할 수 있습니다.

    cat ./-

6

1은 프로그램이이를 지원해야합니다. 임의로 사용할 수는 없습니다. 2의 경우 (예 :)에서 입력을 리디렉션하십시오 cat < -.


1

'-'접근 방식에는 많은 문제가 있습니다. 우선 '-'문자의 해석이 필요하며 많은 프로그램이 그러한 해석을 수행하지 않습니다. 또한 명령 줄 옵션의 끝을 표시하는 구분 기호로 하이픈을 해석하는 일부 프로그램이 있습니다. 프로그램은 파일 이름 인수와 함께 작동하도록 작성되었으며 '-'접근법은 훌륭하지만 약합니다.

가장 좋은 방법은 다음과 같습니다.

$ echo hello > /dev/fd/1

/dev/stdout 의 심볼릭 링크입니다 /dev/fd/1


재 지정은 호출되는 프로그램이 아니라 쉘에 의해 해석됩니다.
sherrellbc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.