Por que o tcsh tem consistentemente vários fds apontando para/dev/tty

Por que o tcsh tem consistentemente vários fds apontando para/dev/tty

Isso está no Ubuntu 16.04, com bash 4.3.42 e tcsh 6.19

Se abrir um console virtual que não está sendo usado pelo X e executar o bash, vejo stdin, stdout, stderr e um descritor de arquivo dedicado para o tty (aparentemente).

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

Se estou usando tcsh, vejo cinco descritores de arquivo não-std{in, out, err} apontando para tty e std{in, out, err} estão todos mapeados para /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 que seriam tcshnecessários tantos descritores de arquivo apontando para o tty e qual é a vantagem de mapear 0,1 e 2 para /dev/null? Isso não significaria apenas que um pouco mais de contabilidade é necessária quando tcshos forks processam para que gravem/leiam no console?

Responder1

tcshestá organizado de forma diferente bash(sem surpresa). Ambos são antigos e cheios de peculiaridades interessantes para o leitor atento.

Essa diferença se deve à forma como tcshgerencia os descritores de arquivos. Ao contrário bash, ele não fornece ao escritor do script uma maneira de manipular descritores de arquivos numerados. Os desenvolvedores acharam conveniente organizar seus descritores de arquivos porem movimentoos fluxos padrão para uma área "salva" (não utilizada por scripts reais) e, ao executar comandos,duplicatasaqueles para comandos (ou seja, um subprocesso), efechaquando os comandos forem concluídos.

No código-fonte,sh.htem esse pedaçoque explica o uso desses descritores de arquivo:

/*
 * 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 os shells, existem vários links para o mesmo dispositivo "real" /dev/fd(para Linux, pelo menos), porque é assim que o driver do pseudo-terminal é organizado.

A propósito, você obterá um resultado diferente se executar tcsha partir de outro shell. Mas se o seu shell padrão for tcsh, provavelmente você verá os descritores de arquivo conforme descrito na pergunta.

Responder2

É quase certo que isso seja algo em sua tcshconfiguração (por exemplo ~/.login, ~/.cshrc /etc/csh.*) - procure por qualquer coisa que redirecione stdin, stdout, stderr.

Quando executo tcshno meu sistema, recebo:

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

informação relacionada