명령의 경우 -
를 인수로 사용하는 경우 파일 이름 대신 STDIN 또는 STDOUT을 의미합니다.
-
하지만이 예에서는
-
라는 이름의 파일을 만듭니다.echo hello > -
이 예에서
-
가 STDOUT을 의미하도록하려면 어떻게해야합니까? -
반대로
-
는 다음과 같은 예에서-
라는 파일을 의미하도록 어떻게 만들 수 있습니까?cat -
댓글
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
답변
-
echo hello > -
,echo hello > /dev/stdout
를 사용할 수 있습니다.“-“는이를 지원하려는 각 프로그램에서 구현해야하는 규칙이지만
/dev/stdin
,/dev/stdout
및/dev/stderr
는 OS에서 지원하는 경우 (최소한 Solaris, Linux 및 BSD는 지원함) , 응용 프로그램과 독립적이며 의도 한대로 작동합니다.
답변
camh 언급 , -
는 일부 프로그램에서 사용하는 명명 규칙입니다.파일 설명 자로 이러한 스트림을 참조하려는 경우 쉘이 인식 할 것입니다. jiliagre가 /dev/stdin
대신
또는 /dev/stdout
. 이러한 파일 이름은 일반 파일 이름이 작동하는 모든 위치에서 작동해야합니다.
-
즉, 첫 번째 예는 다소 어리 석습니다. 파일에 쓰기 위해 리디렉션 연산자에 의해 포착되는 모든 출력은 이미 표준 출력 ON 상태이므로 리디렉션하고 원래 위치로 다시 쓰는 것은 쓸모가 없습니다. 여기서 사용하는 동작은 리디렉션이 아닌 파이프입니다.
echo hello |
-
두 번째 예에서는 내부 별칭이 아닌 해당 이름의 리터럴 파일을 원한다는 표시. 다음과 같이 파일 경로를 지정하여 가장 쉽게 수행 할 수 있습니다.
cat ./-
Answer
1은 프로그램이 지원해야합니다. 임의로 사용할 수는 없습니다. 2의 경우 입력을 리디렉션합니다 (예 : cat < -
).
Answer
“-“접근 방식에는 많은 문제가 있습니다. 우선 “-“문자에 대한 해석이 필요하며 많은 프로그램에서 이러한 해석을 수행하지 않습니다. 또한 하이픈을 명령 줄 옵션의 끝을 표시하는 구분 기호로 해석하는 일부 프로그램이 있습니다. 프로그램은 파일 이름 인수와 함께 작동하도록 작성되었으며 “-“접근 방식은 훌륭하지만 약합니다.
가장 좋은 방법은 다음과 같습니다.
$ echo hello > /dev/fd/1
/dev/stdout
는 /dev/fd/1
댓글
- 리디렉션은 호출되는 프로그램이 아니라 쉘에서 해석됩니다.
답변
특수 문자는 대부분 두 가지 의미를가집니다 :
ASCII 숫자 차트.
스크립팅 또는 기호
단일 문자가 문자열을 나타내거나 문자열 역할을 할 수 있습니다. 내가 이해하는대로
C 언어 fopen()
함수는 첫 번째 파일 스트림과 파일이 열리는 두 번째 모드의 두 인수를받습니다. 모드는 문자열입니다. 단일 문자라도 마찬가지입니다.
cat > "-" 작동합니다.
2>&-
구성도 있습니다. 이는 " 닫기 설명자 2.