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 tcsh
necessá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 tcsh
os forks processam para que gravem/leiam no console?
Responder1
tcsh
está 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 tcsh
gerencia 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.h
tem 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 tcsh
a 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 tcsh
configuração (por exemplo ~/.login
, ~/.cshrc
/etc/csh.*
) - procure por qualquer coisa que redirecione stdin, stdout, stderr.
Quando executo tcsh
no 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/