2011-06-30 32 views
7

Cuando tengosh: ¿Cómo evito los descriptores de archivos numerados?

exec 3>>file    # file descriptor 3 now points to file 
    [ $dryrun ] && exec 3>&1 # or possibly to stdout 
    echo "running">&3 
    exec 3>&-     # and is now closed 

estoy preocupado por lo que el descriptor 3 archivos pueden haber apuntado a las afueras de la función en cuestión. ¿Cómo puedo manejar esto?

  • ¿Hay un builtin next_available_fd?
  • ¿Hay una manera de duplicar FD3 a una variable, luego de la duplicación de nuevo una vez que la función se lleva a cabo?
    • y debería preocuparse por roscado y escrituras concurrentes a FD3 en este caso?
  • estoy en sh, pero tal vez bash/ksh/zsh tiene una respuesta a esto?

Respuesta

1

En lugar de utilizar exec para redireccionar el descriptor de archivo dentro de la función, puede (con bash, no he intentado con otras conchas) hacer:

 
foo() { 
    test $dryrun && exec 3>&1 
    echo running >&3 
} 3>>file 

foo 
more_commands 

En esta configuración "continuo", irá ya sea al archivo oa la salida estándar original, dependiendo de $ dryrun y more_commands se han fd 3 como lo era antes foo fue llamado.

1

No sé de nada tan simple como next_available_fd, pero para obtener la funcionalidad que desee (redireccionar temporalmente un descriptor de archivo sin afectarlo fuera de la función) puede llevarse a cabo de la siguiente manera en bash (I don' t sabe acerca sh):

exec 3>file3 
exec 1>file1 

echo "something">&3 
echo "something else" 

f31() { 
     echo "something">&3 
} 
f31 3>&1 

f13() { 
     echo "something else" 
} 
f13 >&3 

echo "something">&3 
echo "something else" 

El resultado file1:

something else 
something 
something else 

Y file3:

something 
something else 
something 

que demuestra que el cambio de dirección se limita a la llamada a la función en cada caso.

+0

Lo sentimos, qué parte de su código de ejemplo demuestra qué? – nodakai

0

Si su sistema usa el sistema de archivos /proc, mire dentro de /proc/$$/fd para ver lo que está en uso.

Cuestiones relacionadas