Não, você certamente não quer fechar os descritores de arquivo 0, 1 e 2.
Se você fizer isso, na primeira vez que o aplicativo abrir um arquivo, ele se tornará stdin / stdout / stderr ...
Por exemplo, se você fizer isso:
echo text | tee file >&-
Quando tee
(pelo menos algumas implementações, como busybox ') abre o arquivo para gravação, ele será aberto no descritor de arquivo 1 (stdout). Então tee
irá escrever text
duas vezes em file
:
$ echo text | strace tee file >&-
[...]
open("file", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 1
read(0, "text\n", 8193) = 5
write(1, "text\n", 5) = 5
write(1, "text\n", 5) = 5
read(0, "", 8193) = 0
exit_group(0) = ?
Isso é conhecido por causar vulnerabilidades de segurança. Por exemplo:
chsh 2>&-
E chsh
(uma aplicação setuid) pode acabar escrevendo mensagens de erro em /etc/passwd
.
Algumas ferramentas e até algumas bibliotecas tentam se proteger contra isso. Por exemplo, o GNU tee
irá mover o descritor de arquivo para um acima de 2 se os arquivos que ele abrir para gravação forem atribuídos 0, 1, 2 enquanto busybox tee
não será.
A maioria das ferramentas, se não puderem gravar no stdout (porque, por exemplo, não está aberta), reportará uma mensagem de erro no stderr (no idioma do usuário, o que significa processamento extra para abrir e analisar arquivos de localização ... ), portanto, será significativamente menos eficiente e possivelmente causará falha no programa.
Em qualquer caso, não será mais eficiente. O programa ainda fará uma chamada de sistema write()
. Ele só pode ser mais eficiente se o programa desistir de gravar em stdout / stderr após a primeira falha na chamada do sistema write()
, mas os programas geralmente não fazem isso. Eles geralmente saem com um erro ou continuam tentando.