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-) .