Para responder literalmente, para fechar todos descritores de arquivos abertos para bash
:
for fd in $(ls /proc/$$/fd); do
eval "exec $fd>&-"
done
No entanto, isso realmente não é uma boa ideia, pois fechará os descritores de arquivos básicos que o shell precisa para entrada e saída. Se você fizer isso, nenhum dos programas executados terá sua saída exibida no terminal (a menos que eles gravem diretamente no dispositivo tty
). Se o fato de meus testes fecharem stdin
( exec 0>&-
) apenas faz com que um shell interativo saia.
O que você pode realmente querer fazer é fechar todos os descritores de arquivos que não fazem parte da operação básica do shell. Estes são 0 para stdin
, 1 para stdout
e 2 para stderr
. Além disso, alguns shells também parecem ter outros descritores de arquivos abertos por padrão. Em bash
, por exemplo, você tem 255 (também para terminal I / O) e em dash
eu tenho 10, que aponta para /dev/tty
em vez do dispositivo específico tty
/ pts
que o terminal está usando . Para fechar tudo além de 0, 1, 2 e 255 em bash
:
for fd in $(ls /proc/$$/fd); do
case "$fd" in
0|1|2|255)
;;
*)
eval "exec $fd>&-"
;;
esac
done
Observe também que eval
é necessário ao redirecionar o descritor de arquivo contido em uma variável, se não bash
expandirá a variável, mas a considerará parte do comando (nesse caso, ela tentaria exec
o comando 0
ou 1
ou qualquer descritor de arquivo que você esteja tentando fechar).
OBSERVAÇÃO: Também usando um glob em vez de ls
(ex. /proc/$$/fd/*
) parece abrir um descritor de arquivo extra para o glob, então ls
parece a melhor solução aqui.
Atualizar
Para mais informações sobre a portabilidade de /proc/$$/fd
, consulte Portabilidade do descritor de arquivo links . Se /proc/$$/fd
estiver indisponível, uma substituição no $(ls /proc/$$/fd)
, usando lsof
(se disponível), será $(lsof -p $$ -Ff | grep f[0-9] | cut -c 2-)
.