Perché può essere utilizzato solo 1 volta quando apriamo noi stessi il descrittore di file e lo reindirizziamo a stdin?
Dai un'occhiata all'esempio seguente per capire cosa voglio dire. Dopo averlo letto una volta con il comando cat, il file non viene letto tramite lo stesso descrittore di file per la seconda volta.
└─$ exec 6< input.txt
└─$ cat <&6
i am just string
and another string..
└─$ cat <&6
└─$
Risposta accettata:
Per stampare il file, il primo cat
deve leggerlo fino alla fine. exec 6< input.txt
fa in modo che la shell mantenga il descrittore di file fino a quando la shell
non muore o la chiude, quindi l'offset del file punta ancora alla fine del file
quando il secondo cat
viene invocato, che quindi non scrive nulla su stdout.
Se su un sistema basato su Linux, puoi vedere che ciò accade sbirciando nelle informazioni del descrittore di file:
echo "File contents" > input.txt
exec 6< input.txt
cat "/proc/$$/fdinfo/6"
cat <&6
cat "/proc/$$/fdinfo/6"
cat <&6
Se esegui quello script, otterrai qualcosa come
pos: 0
flags: 0100000
mnt_id: 113
File contents
pos: 14
flags: 0100000
mnt_id: 113
confermando che l'offset (pos
) non è 0
quando il secondo cat
viene eseguito, ma punta invece alla sua fine.
Per ripristinare l'offset, puoi aggiungere un altro exec 6< input.txt
tra il cat
s.