¿Hay alguna manera de cerrar todos los descriptores de archivos abiertos, sin tener una lista explícita de ellos de antemano?
bash
shell
file-descriptors
Lorenzo Pistone
fuente
fuente
Respuestas:
Para responder literalmente, cerrar todos los descriptores de archivos abiertos para
bash
:Sin embargo, esto realmente no es una buena idea, ya que cerrará los descriptores de archivo básicos que el shell necesita para entrada y salida. Si hace esto, ninguno de los programas que ejecute mostrará su salida en el terminal (a menos que escriban
tty
directamente en el dispositivo). Si el hecho de cerrar mis pruebasstdin
(exec 0>&-
) solo hace que salga un shell interactivo.Lo que puede estar buscando hacer es cerrar todos los descriptores de archivos que no forman parte de la operación básica del shell. Estos son 0 para
stdin
, 1 parastdout
y 2 parastderr
. Además de esto, algunos shells también parecen tener otros descriptores de archivos abiertos de forma predeterminada. Enbash
, por ejemplo, tiene 255 (también para E / S de terminal) y endash
10, que apunta en/dev/tty
lugar del dispositivotty
/pts
dispositivo específico que está utilizando el terminal. Para cerrar todo, excepto 0, 1, 2 y 255 enbash
:Tenga en cuenta también que
eval
es necesario al redirigir el descriptor de archivo contenido en una variable, si nobash
se expandirá la variable, pero considérelo parte del comando (en este caso, trataríaexec
del comando0
o del1
descriptor de archivo que esté intentando cerrar).NOTA: También el uso de un glob en lugar de
ls
(por ejemplo/proc/$$/fd/*
) parece abrir un descriptor de archivo adicional para el glob, por lo quels
parece la mejor solución aquí.Actualizar
Para obtener más información sobre la portabilidad de
/proc/$$/fd
, consulte Portabilidad de enlaces de descriptor de archivo . Si/proc/$$/fd
no está disponible, entonces sería una caída en el reemplazo para el$(ls /proc/$$/fd)
usolsof
(si está disponible)$(lsof -p $$ -Ff | grep f[0-9] | cut -c 2-)
.fuente
/proc
solo está disponible bajo Linux./proc/PID/fd
no es muy portátil. Pero decir que/proc
solo está disponible en Linux no es una declaración correcta.<&-
formulario, ¿es diferente / necesario?En versiones recientes de Bash (4.1 y posteriores, año 2009 y posteriores), puede especificar el descriptor de archivo para cerrar usando una variable de shell:
La característica ya había estado en Korn Shell (¿desde 1993?) Pero aparentemente tardó un tiempo en llegar a Bash.
fuente
Borre todos los descriptores de archivo, excepto i / o / e del shell actual, pero también excluye los proporcionados como argumentos
fuente
Otra forma sin "evaluar" es usar el formulario:
fuente
No. El kernel puede cerrar solo un FD a la vez, y bash no tiene "comandos de grupo" para los FD.
Retire el
echo
y el"
después de la prueba.Si esto no es para el shell en sí, sino para ejecutar un comando, puede usarlo
nohup
.fuente
>&-
no puede ser un parámetro; la redirección se analiza antes de la expansión del parámetro.exec {fd}>&-
funciona.