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를 가리키는 5개의 비 std{in, out, err} 파일 설명자가 표시되고 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

tty를 가리키려면 왜 tcsh그렇게 많은 파일 설명자가 필요한가요? 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에 있는 것이 거의 확실합니다 . stdin, stdout, stderr를 리디렉션하는 항목을 찾으세요.~/.login~/.cshrc /etc/csh.*

내 시스템에서 이것을 실행 하면 다음 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/

관련 정보