2011-11-28 9 views
15

Voglio usare una variabile bash per indicare un descrittore di file, in questo modo:Come utilizzare una variabile per indicare un descrittore di file in bash?

id=6 
file=a 
exec $id<>$file 

Ma l'utilizzo è sbagliato:

-bash: exec: 6: not found 

Così, come utilizzare una variabile per indicare un descrittore di file nel comando exec?

+0

hai provato '$ {id}' e/o 'eval' ....? In bocca al lupo. – shellter

+2

@shellter: il prossimo carattere non è un carattere di parola, quindi le parentesi graffe non saranno d'aiuto. 'eval' sembra l'unica opzione. –

+0

Potrebbe essere utile aggiornare la tua domanda con la versione di bash che stai utilizzando. In bocca al lupo. – shellter

risposta

10

È necessario utilizzare eval e inserire l'intera espressione tra virgolette.

eval "exec $id<>$file" 

E farlo ogni volta che si desidera utilizzare $id.

+0

Grazie per la risposta. Ha funzionato davvero. –

11

La risposta accettata è corretta, ma as of bash 4.1, è possibile utilizzare l'assegnazione automatica descrittore di file, e in questo caso non hai bisogno di eval:

file=a 
exec {id}<>"$file" 

quindi è possibile utilizzare in questo modo:

echo test >&${id} 

o:

fsck -v -f -C ${id} /dev/something 
+0

Sembra che "id" debba essere corretto nel codice. È possibile rendere "id" una variabile? Ciò consentirebbe una maggiore flessibilità. Immagina di usare un codice come 'for ((FD = 3; FD <100; FD ++)); do exec {FD}> file. $ FD; echo $ FD> &${FD}; done'. Questo non funzionerebbe, dato che il file 'exec {FD}>. $ {FD}' sarebbe lo stesso descrittore di tutti i valori di $ FD, giusto? –

+1

'id' è una variabile, puoi vederla con' echo $ id'. –

+0

Se si sta tentando di reindirizzare tutti i descrittori di file tra 3 e 100 in singoli file, si dovrebbe fare così: 'per fd in {3..100}; fai eval "exec $ fd <> file. $ fd"; echo $ fd> &$fd; done' –

Problemi correlati