tcsh가 지속적으로 /dev/tty를 가리키는 여러 fd를 갖는 이유는 무엇입니까?

tcsh가 지속적으로 /dev/tty를 가리키는 여러 fd를 갖는 이유는 무엇입니까?

이것은 bash 4.3.42 및 tcsh 6.19와 함께 Ubuntu 16.04에 있습니다.

X에서 사용되지 않는 가상 콘솔을 열고 bash를 실행하면 stdin, stdout, stderr 및 tty에 대한 전용 파일 설명자가 보입니다(분명히).

$ cd /dev/fd
$ ls
0 1 2 255
$ ls -al .
... .
... ..
... 0 -> /dev/tty3
... 1 -> /dev/tty3
... 2 -> /dev/tty3
... 255 -> /dev/tty3

tcsh를 사용하는 경우 tty 및 std{in, out, err}를 가리키는 5개의 비 std{in, out, err} 파일 설명자가 모두 /dev/null.

% cd /dev/fd
% ls -al
... .
... ..
... 0 -> /dev/null
... 1 -> /dev/null
... 15 -> /dev/tty3
... 16 -> /dev/tty3
... 17 -> /dev/tty3
... 18 -> /dev/tty3
... 19 -> /dev/tty3
... 2 -> /dev/null

tcsh모두 tty를 가리키는 파일 설명자가 그렇게 많이 필요한 이유는 무엇 이며 0,1, 2를 에 매핑하면 어떤 이점이 있습니까 /dev/null? 이는 tcsh포크 프로세스가 콘솔에 쓰거나 콘솔에서 읽을 때 약간 더 많은 기록이 필요하다는 것을 의미하지 않습니까 ?

답변1

tcsh(놀랄 것도 없이) 다르게 구성되어 있습니다 bash. 둘 다 오래되었으며 주의 깊은 독자에게는 흥미로운 특징으로 가득 차 있습니다.

tcsh이 차이점은 파일 설명자를 관리하는 방식으로 인해 발생합니다 . 와 달리 bash스크립트 작성자에게 번호가 매겨진 파일 설명자를 조작하는 방법을 제공하지 않습니다. 개발자들은 파일 설명자를 다음과 같이 구성하는 것이 편리하다는 것을 알았습니다.움직이는표준은 "저장된" 영역(실제 스크립트에서는 사용되지 않음)으로 스트리밍되며, 명령을 실행할 때중복명령(즉, 하위 프로세스)에 대한 것닫는다명령이 완료되면 표시됩니다.

소스 코드에서는sh.h이 덩어리가 있어요해당 파일 설명자의 사용을 설명합니다.

/*
 * The shell moves std in/out/diag and the old std input away from units
 * 0, 1, and 2 so that it is easy to set up these standards for invoked
 * commands.
 */
#define FSAFE   5               /* We keep the first 5 descriptors untouched */
#define FSHTTY  15              /* /dev/tty when manip pgrps */
#define FSHIN   16              /* Preferred desc for shell input */
#define FSHOUT  17              /* ... shell output */
#define FSHDIAG 18              /* ... shell diagnostics */
#define FOLDSTD 19              /* ... old std input */

두 셸 모두 (적어도 Linux의 경우) 동일한 "실제" 장치에 대한 여러 링크가 있습니다 /dev/fd. 왜냐하면 그것이 의사 터미널 드라이버가 구성되는 방식이기 때문입니다.

그런데 tcsh다른 쉘에서 실행하면 다른 결과를 얻게 됩니다. 그러나 기본 쉘이 이면 tcsh질문에 설명된 대로 해당 파일 설명자를 볼 수 있습니다.

답변2

tcsh이는 구성(예 ~/.login: , ) 에 있는 것이 거의 확실합니다. ~/.cshrc /etc/csh.*stdin, stdout, stderr를 리디렉션하는 항목을 찾으세요.

내 시스템에서 실행하면 tcsh다음을 얻습니다.

$ tcsh
> ls -lF /dev/fd/
total 0
lrwx------ 1 cas cas 64 Jun 26 13:28 0 -> /dev/pts/29
lrwx------ 1 cas cas 64 Jun 26 13:28 1 -> /dev/pts/29
lrwx------ 1 cas cas 64 Jun 26 13:28 2 -> /dev/pts/29
lr-x------ 1 cas cas 64 Jun 26 13:28 3 -> /proc/16570/fd/

관련 정보