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

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

  1. 하지만이 예에서는 -라는 이름의 파일을 만듭니다.

    echo hello > - 

    이 예에서 -가 STDOUT을 의미하도록하려면 어떻게해야합니까?

  2. 반대로 -는 다음과 같은 예에서 -라는 파일을 의미하도록 어떻게 만들 수 있습니까?

    cat - 

댓글

  • 직접 댓글을 달려면 50 개의 평판이 있어야하므로 .. / dev / stdin / dev / stdout 주석에서, 합법적 인 UNIX 파생물 인 AIX에는 이러한 의사 장치가 없습니다. 그리고 추가 설명으로 LINUX는 어떤 경우에도 UNIX 파생 제품이 아닙니다. POSIX 호환 작업과 유사하며 현재로서는 UNIX 용 OS ' 중 가장 인기가 있지만 실수하지 마십시오. 이것은 UNIX가 아닙니다. 그러나 여기에있는 답변의 요지는 정확합니다. "-" 표기법은 셸에서 특수한 것으로 해석되지 않으므로 ARG로 각 개별 애플리케이션에 직접 전달됩니다. 애플리케이션이 인식하지 못하는 경우
  • 2>&- 구성도 있습니다. 이는 " 닫기 설명자 2

    .

  • @ user95873, 제가 말하고 싶은 것은 다음과 같습니다. Linux는 Unix와 비슷하지만 모든 Unix와 비슷한 (또는 진정한 UNIX) 리눅스 . Linux가 ' 진정한 UNIX (즉, 단일 UNIX 사양을 준수)인지 여부는 ' / dev /와 관련이 없습니다. std {in, out, err} 문제. / dev / std {in, out, err}은 누락 된 기능이 아니라 추가 된 기능이므로

Answer

-를 파일 이름으로 사용하여 stdin / stdout을 의미하는 것은 많은 프로그램에서 사용하는 규칙입니다. 파일 이름의 특수한 속성이 아닙니다. 커널은 -를 특수한 것으로 인식하지 않으므로 -를 파일 이름으로 참조하는 모든 시스템 호출은 - 말 그대로 파일 이름입니다.

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

cat에서 - 문자열을 파일 이름으로 볼 때 stdin의 동의어로 취급합니다. 이 문제를 해결하려면 cat가 여전히 -라는 파일을 참조하는 방식으로 표시되는 문자열을 변경해야합니다. 이를 수행하는 일반적인 방법은 파일 이름 앞에 경로 (./- 또는 /home/Tim/-)를 접두사로 붙이는 것입니다. 이 기술은 또한 명령 줄 옵션이 파일 이름과 충돌하는 유사한 문제를 해결하는 데 사용되므로 ./-e라는 파일이 -e 명령 줄 옵션입니다.

댓글

  • It ' s 추가 할 가치가있는 것은 /dev/stdin/dev/stdout가 보편적으로 사용 가능하며 - 규칙.
  • @jmtd : / dev / std {in, out}은 보편적으로 사용할 수 없습니다. 모든 유닉스에이 기능이있는 것은 아닙니다.
  • 흥미롭게도 POSIX의 일부라고 생각했습니다 (그러나 ' 확인할 수 없음). 그들은 ' 적어도 Linux, BSD 및 Solaris에 존재합니다. 이러한 기능이없는 최신 UNIX의 예를들 수 있습니까?
  • @camh 알림을 받았는지 확실하지 않습니다. 이것은 매우 오래된 주제입니다. 저는 ' 당신이 할 수 있는지 잘 모르겠지만 ' '의 질문이 있습니까? 🙂
  • @jmtd 질문에 대한 임시 답변을 찾은 것 같습니다. unix.stackexchange.com/a/278368/31669

답변

  1. echo hello > -, echo hello > /dev/stdout를 사용할 수 있습니다.

    “-“는이를 지원하려는 각 프로그램에서 구현해야하는 규칙이지만 /dev/stdin, /dev/stdout/dev/stderr는 OS에서 지원하는 경우 (최소한 Solaris, Linux 및 BSD는 지원함) , 응용 프로그램과 독립적이며 의도 한대로 작동합니다.

답변

camh 언급 , -는 일부 프로그램에서 사용하는 명명 규칙입니다.파일 설명 자로 이러한 스트림을 참조하려는 경우 쉘이 인식 할 것입니다. jiliagre가 /dev/stdin 대신

또는 /dev/stdout. 이러한 파일 이름은 일반 파일 이름이 작동하는 모든 위치에서 작동해야합니다.

  1. 즉, 첫 번째 예는 다소 어리 석습니다. 파일에 쓰기 위해 리디렉션 연산자에 의해 포착되는 모든 출력은 이미 표준 출력 ON 상태이므로 리디렉션하고 원래 위치로 다시 쓰는 것은 쓸모가 없습니다. 여기서 사용하는 동작은 리디렉션이 아닌 파이프입니다.

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

    cat ./- 

Answer

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

Answer

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

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

$ echo hello > /dev/fd/1 

/dev/stdout/dev/fd/1

댓글

  • 리디렉션은 호출되는 프로그램이 아니라 쉘에서 해석됩니다.

답변

특수 문자는 대부분 두 가지 의미를가집니다 :

ASCII 숫자 차트.

스크립팅 또는 기호

단일 문자가 문자열을 나타내거나 문자열 역할을 할 수 있습니다. 내가 이해하는대로

C 언어 fopen() 함수는 첫 번째 파일 스트림과 파일이 열리는 두 번째 모드의 두 인수를받습니다. 모드는 문자열입니다. 단일 문자라도 마찬가지입니다.

cat > "-" 작동합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다