텍스트 편집기로 / dev / stdout을 읽을 수없는 이유는 무엇입니까?


9

방금 Linux에서 Everything is A File TM 을 배우는 방법을 배우기 시작했습니다 .

$ cat /dev/stdout 
^C
$ tail /dev/stdout 
^C

( ^C정지 된 후에 프로그램을 죽이고 있습니다).

로 시도 vim하면 생각할 수없는 메시지가 나타납니다. "/ dev / stdout"은 파일이 아닙니다. p!

그렇다면 이러한 "파일"을 읽으려고 할 때 왜 끊기 또는 오류 메시지가 표시됩니까?


1
vim이 파일을 고려하는 것과 * nix에서 "모든 것이 파일입니다"(관련된 상표 없음)의 의미는 동일하지 않습니다. 예를 들어 # 1# 2를 참조하십시오 .
goldilocks

답변:


11

왜 내가 끊지?

cat(1)및 에서 '전화 끊기'를받지 않고 tail(1)읽기를 차단하고 있습니다. cat(1)입력을 기다렸다가 완전한 줄을 보자 마자 인쇄합니다.

$ cat /dev/stdout
foo
foo
bar
bar

여기에 fooEnterbarEnterCTRL-를 입력했습니다 D.

tail(1)입력을 기다렸다가 감지 할 수있을 때만 인쇄합니다 EOF.

$ tail /dev/stdout
foo
bar
foo
bar

여기에 다시 입력 fooEnterbarEnterCTRL- D.

또는 오류 메시지

Vim은 유일한 오류입니다. 에 대해 실행 되기 때문에 비트 세트 가없는 것을 알 수 있습니다 .stat(2)/dev/stdoutS_IFREG

/dev/stdout파일이지만 일반 파일은 아닙니다 . 실제로 커널에는 파일 시스템에 항목을 제공하기 위해 약간의 춤이 있습니다. Linux에서 :

$ ls -l /dev/stdout
lrwxrwxrwx 1 root root 15 May  8 19:42 /dev/stdout -> /proc/self/fd/1

OpenBSD에서 :

$ ls -l /dev/stdout
crw-rw-rw-  1 root  wheel   22,   1 May  7 09:05:03 2015 /dev/stdout

FreeBSD에서 :

$ ls -l /dev/stdout
lrwxr-xr-x  1 root  wheel  4 May  8 21:35 /dev/stdout -> fd/1

$ ls -l /dev/fd/1
crw-rw-rw-  1 root  wheel  0x18 May  8 21:35 /dev/fd/1

5

(거의) 모든 것이 파일이지만 모든 것이 정규 파일 은 아닙니다 . 디렉토리, 네트워크 소켓, 직렬 포트 등과 같은 특수 파일 인 텍스트 편집기를 호출하는 것은 의미가 없습니다.

파일 /dev/stdout은 유닉스 변형에 따라 여러 가지 중 하나 일 수 있습니다.

  • "특별한"파일, 일반적으로 문자 장치;
  • 액세스하는 프로세스가이 디스크립터에서 연 파일을 가리키는 "마법"기호 링크;
  • 위의 하나에 대한 심볼릭 링크.

어쨌든, /dev/stdout파일을 열거 나 유사한 파일은 응용 프로그램이 파일 설명자 1에서 이미 연 것과 동일한 파일과 관련된 새 파일 설명자를 만듭니다. "표준 출력"은 파일 설명자 1을 의미하며이 파일 설명자가 사용되는 규칙 일뿐입니다. 출력 – 커널은 신경 쓰지 않습니다.

터미널에서 프로그램을 실행하면 터미널 장치에서 3 개의 표준 설명자 (0 = 표준 입력, 1 = 표준 출력, 2 = 표준 오류)가 모두 열립니다. 해당 장치에서 읽으면 사용자가 입력 한 문자가 반환되고 해당 장치에 쓰면 터미널 창에 텍스트가 표시됩니다. (터미널 장치에 따라 표시되는 출력을 읽거나 입력을 주입하는 표준 방법은 없습니다.)

당신이 실행하면 cat /dev/stdout, 그것은 정확히 같은 일을 cat /dev/stdin또는 cat /dev/stderr이 세 가지 파일 기술자가 동일한 파일에 연결되어 있기 때문에, : 그것은 말한다 cat터미널에서 읽을 수 있습니다. 그것은 cat논쟁이없는 것이기도합니다.

실행 cat /dev/stdout >foo한 경우 /dev/stdout파일을 참조합니다. foo해당 명령은와 동일합니다 cat foo >foo. cat구현 에 따라 오류가 발생하거나 (GNU 버전에서 "입력 파일이 출력 파일입니다"라고 불평 함) foo비어 있는 파일에서 읽었 기 때문에 아무것도하지 않을 수 있습니다 ( >foo단지 잘 렸습니다). 버전으로 cat경우에 그,이 특별한 경우를 감지하지 않습니다 foo비어 있지 않은 다음, cat /dev/stdout >>foo또는 이에 상응 cat foo >>foo무기한 자체에 파일의 내용을 추가한다.

를 실행 vim /dev/stdout하면 터미널을 편집하는 방법을 모르기 때문에 불평합니다 (단지 이해가되지 않습니다).


2

cat그리고 tail파일의 끝에 다음 옵션 내용을 찾고있다. /dev/stdout그래서, 열린 상태로 유지 cat하고 tail그냥 계속 찾고.

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