¿Por qué tcsh constantemente tiene múltiples fd apuntando a /dev/tty?

¿Por qué tcsh constantemente tiene múltiples fd apuntando a /dev/tty?

Esto está en Ubuntu 16.04, con bash 4.3.42 y tcsh 6.19.

Si abro una consola virtual que X no está utilizando y ejecuto bash, veo stdin, stdout, stderr y un descriptor de archivo dedicado para tty (aparentemente).

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

Si estoy usando tcsh, veo cinco descriptores de archivos que no son std{in, out, err} que apuntan al tty y std{in, out, err} están todos asignados a /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

¿Por qué se tcshnecesitarían tantos descriptores de archivos que apunten todos al tty y cuál es el beneficio de asignar 0,1 y 2 a /dev/null? ¿No significaría eso simplemente que se necesita un poco más de contabilidad cuando tcshlos procesos se bifurcan para que escriban o lean desde la consola?

Respuesta1

tcshestá organizado de manera diferente a bash(no es de extrañar). Ambos son antiguos y están llenos de peculiaridades interesantes para el lector atento.

Esta diferencia se debe a la forma en que tcshgestiona los descriptores de archivos. A diferencia de bash, no proporciona al escritor del guión una forma de manipular descriptores de archivos numerados. Los desarrolladores encontraron conveniente organizar sus descriptores de archivos porMovienteel estándar se transmite a un área "guardada" (no utilizada por scripts reales) y, al ejecutar comandos,duplicadosaquellos a comandos (es decir, un subproceso), ycierracuando se completen los comandos.

En el código fuente,sh.htiene este trozolo que explica el uso de esos descriptores de archivos:

/*
 * 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 */

Para ambos shells, hay múltiples enlaces al mismo dispositivo "real" /dev/fd(al menos para Linux), porque así es como está organizado el controlador del pseudo-terminal.

Por cierto, obtendrás un resultado diferente si ejecutas tcshdesde otro shell. Pero si su shell predeterminado es tcsh, probablemente verá esos descriptores de archivos como se describe en la pregunta.

Respuesta2

Es casi seguro que esto sea algo en su tcshconfiguración (por ejemplo ~/.login, , ~/.cshrc /etc/csh.*): busque cualquier cosa que redirija stdin, stdout, stderr.

Cuando ejecuto tcshen mi sistema, obtengo:

$ 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/

información relacionada