¿Cómo usar una variable para indicar un descriptor de archivo en bash?
exec file-descriptor (3)
La discusión en la respuesta de tobias.pal me pareció muy interesante: https://stackoverflow.com/a/32689974/1184842
for (( FD=3 ; FD < 100 ; FD++ )) ; do exec {FD}> file.$FD ; echo $FD >&${FD}; done
Esto no funcionaría, ya que el exec {FD}> file.${FD}
sería el mismo descriptor sobre todos los valores de $ FD, ¿verdad? (Denio Mariz)
Resolví esto usando una matriz como lo dijo Drew Chapin:
#!/bin/bash
# global variables for temp file handling
declare -a TEMPORARY_FILES_WRITE;
declare -a TEMPORARY_FILES_READ;
function createTempFile() {
local usecase="$1"
local id="$2"
local tmpfile=$(mktemp) # Create a temporal file in the default temporal folder of the system
# Lets do some magic for the tmpfile to be removed when this script ends, even if it crashes
exec {TEMPORARY_FILES_WRITE[$id]}>"$tmpfile"
exec {TEMPORARY_FILES_READ[$id]}<"$tmpfile"
rm "$tmpfile" # Delete the file, but file descriptors keep available for this script
}
for (( FD=3 ; FD < 100 ; FD++ )) ; do
TEMP_FILE_COUNTER=$((TEMP_FILE_COUNTER + 1))
createTempFile "Iteration $FD" $FD ;
echo $FD >&${TEMPORARY_FILES_WRITE[$FD] ;
done
example=$(cat <&${TEMPORARY_FILES_READ[50]})
echo $example
Esto dará salida a 50.
Quiero usar una variable bash para indicar un descriptor de archivo, como este:
id=6
file=a
exec $id<>$file
Pero el uso es incorrecto:
-bash: exec: 6: not found
Entonces, ¿cómo usar una variable para indicar un descriptor de archivo en el comando exec?
La respuesta aceptada es correcta, pero a partir de bash 4.1 , puede usar la asignación automática de descriptores de archivos, y en ese caso no necesita eval
:
file=a
exec {id}<>"$file"
Entonces puedes usarlo así:
echo test >&${id}
o:
fsck -v -f -C ${id} /dev/something
Tienes que usar eval
y poner toda la expresión entre comillas.
eval "exec $id<>$file"
Y haz eso cada vez que quieras usar $id
.