tcsh
é organizado de maneira diferente de 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 de bash
, ele não fornece ao roteirista uma maneira de manipular descritores de arquivos numerados. Os desenvolvedores acharam conveniente organizar seus descritores de arquivos por movendo o padrão transmite em uma área "salva" (não utilizada por scripts reais) e, ao executar comandos, ela duplica os comandos (ou seja, um subprocesso) e fecha quando os comandos terminam.
No código-fonte, sh.h
tem esse pedaço , o que explica o uso desses descritores de arquivos:
/*
* 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" em /dev/fd
(para Linux, pelo menos), porque é assim que o driver pseudo-terminal é organizado.
Você vai, a propósito, obter um resultado diferente se você executar tcsh
de outro shell. Mas se o seu shell padrão for tcsh
, provavelmente você verá esses descritores de arquivo conforme descrito na pergunta.