GNU/Linux >> Linux Esercitazione >  >> Linux

Perché il descrittore di file viene aperto e letto solo una volta?

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.


Linux
  1. Leggi e scrivi dati da qualsiasi luogo con reindirizzamento nel terminale Linux

  2. Leggi e scrivi sullo stesso file in Linux senza sovrascriverlo??

  3. Linux:decomprimi e decomprimi il file .tar.gz utilizzando Cat, Tar e Gzip su una riga di comando?

  4. Tail legge l'intero file?

  5. Echo To File Descriptor sovrascrive il file?

Perché (e come) l'uso di Cat su file binari ha rovinato il terminale?

La differenza tra .exrc e .vimrc?

Perché Ls -l non mostra l'ora e l'anno per ogni file??

Vantaggi di cat'ing file e piping a grep

Perché mount non rispetta l'opzione di sola lettura per i bind mount?

Grep in un file di registro enorme (> 14 GB) solo l'ultimo x GB?