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 tcsh
necesitarí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 tcsh
los procesos se bifurcan para que escriban o lean desde la consola?
Respuesta1
tcsh
está 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 tcsh
gestiona 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.h
tiene 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 tcsh
desde 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 tcsh
configuración (por ejemplo ~/.login
, , ~/.cshrc
/etc/csh.*
): busque cualquier cosa que redirija stdin, stdout, stderr.
Cuando ejecuto tcsh
en 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/