Existe uma maneira de fechar todos os descritores de arquivos abertos, sem ter uma lista explícita deles previamente?
bash
shell
file-descriptors
Lorenzo Pistone
fonte
fonte
Respostas:
Para responder literalmente, feche todos os descritores de arquivos abertos para
bash
:No entanto, isso realmente não é uma boa ideia, pois fechará os descritores de arquivo básicos que o shell precisa para entrada e saída. Se você fizer isso, nenhum dos programas executados terá a saída exibida no terminal (a menos que escreva
tty
diretamente no dispositivo). Se fato em meus testes, o fechamentostdin
(exec 0>&-
) apenas faz com que um shell interativo saia.O que você realmente deseja 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 parastdout
e 2 parastderr
. Além disso, alguns shells também parecem ter outros descritores de arquivos abertos por padrão. Embash
, por exemplo, você possui 255 (também para o terminal de E / S) e emdash
10, que aponta para/dev/tty
o dispositivotty
/pts
dispositivo específico que o terminal está usando. Para fechar tudo além de 0, 1, 2 e 255 embash
:Note também que
eval
é necessária quando redirecionando o descritor de arquivo contido em uma variável, se nãobash
irá expandir a variável, mas considerá-lo parte do comando (neste caso, seria tentarexec
o comando0
ou1
ou qualquer descritor de arquivo que você está tentando fechar).NOTA: O uso de um globo em vez de
ls
(por exemplo/proc/$$/fd/*
) parece abrir um descritor de arquivo extra para o globo, assimls
parece a melhor solução aqui.Atualizar
Para obter mais informações sobre portabilidade
/proc/$$/fd
, consulte Portabilidade dos links do descritor de arquivos . Se/proc/$$/fd
não estiver disponível, seria uma queda no substituto de$(ls /proc/$$/fd)
, usandolsof
(se disponível)$(lsof -p $$ -Ff | grep f[0-9] | cut -c 2-)
.fonte
/proc
está disponível apenas no Linux./proc/PID/fd
não é muito portátil. Mas dizer que/proc
só está disponível no Linux não é uma afirmação correta.<&-
formulário, é diferente / necessário?Nas versões recentes do Bash (4.1 e seguintes, ano de 2009 e posteriores), você pode especificar o descritor de arquivo a ser fechado usando uma variável de shell:
O recurso já estava no shell Korn (desde 1993?), Mas aparentemente levou algum tempo para entrar no Bash.
fonte
Limpe todos os descritores de arquivo, exceto i / o / e do shell atual, mas também exclui os fornecidos como argumentos
fonte
Outra maneira sem "eval" é usar o formulário:
fonte
Não. O kernel pode fechar apenas um FD por vez e o bash não possui "comandos de grupo" para FDs.
Remova o
echo
e o"
após o teste.Se não for para o próprio shell, mas para que um comando seja executado, você poderá usá-lo
nohup
.fonte
>&-
não pode ser um parâmetro; o redirecionamento é analisado antes da expansão do parâmetro.exec {fd}>&-
funciona.