방금 Linux에서 Everything is A File TM 을 배우는 방법을 배우기 시작했습니다 .
$ cat /dev/stdout
^C
$ tail /dev/stdout
^C
( ^C
정지 된 후에 프로그램을 죽이고 있습니다).
로 시도 vim
하면 생각할 수없는 메시지가 나타납니다. "/ dev / stdout"은 파일이 아닙니다. p!
그렇다면 이러한 "파일"을 읽으려고 할 때 왜 끊기 또는 오류 메시지가 표시됩니까?
방금 Linux에서 Everything is A File TM 을 배우는 방법을 배우기 시작했습니다 .
$ cat /dev/stdout
^C
$ tail /dev/stdout
^C
( ^C
정지 된 후에 프로그램을 죽이고 있습니다).
로 시도 vim
하면 생각할 수없는 메시지가 나타납니다. "/ dev / stdout"은 파일이 아닙니다. p!
그렇다면 이러한 "파일"을 읽으려고 할 때 왜 끊기 또는 오류 메시지가 표시됩니까?
답변:
왜 내가 끊지?
cat(1)
및 에서 '전화 끊기'를받지 않고 tail(1)
읽기를 차단하고 있습니다. cat(1)
입력을 기다렸다가 완전한 줄을 보자 마자 인쇄합니다.
$ cat /dev/stdout
foo
foo
bar
bar
여기에 foo
Enterbar
EnterCTRL-를 입력했습니다 D.
tail(1)
입력을 기다렸다가 감지 할 수있을 때만 인쇄합니다 EOF
.
$ tail /dev/stdout
foo
bar
foo
bar
여기에 다시 입력 foo
Enterbar
EnterCTRL- D.
또는 오류 메시지
Vim은 유일한 오류입니다. 에 대해 실행 되기 때문에 비트 세트 가없는 것을 알 수 있습니다 .stat(2)
/dev/stdout
S_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
(거의) 모든 것이 파일이지만 모든 것이 정규 파일 은 아닙니다 . 디렉토리, 네트워크 소켓, 직렬 포트 등과 같은 특수 파일 인 텍스트 편집기를 호출하는 것은 의미가 없습니다.
파일 /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
하면 터미널을 편집하는 방법을 모르기 때문에 불평합니다 (단지 이해가되지 않습니다).