GNU/Linux >> Znalost Linux >  >> Linux

Proč je deskriptor souboru otevřen a přečten pouze jednou?

Proč jej lze použít pouze jednou, když sami otevřeme deskriptor souboru a přesměrujeme jej na stdin?
Podívejte se prosím na níže uvedený příklad, abyste pochopili, co chci říci. Po prvním přečtení pomocí příkazu cat se soubor podruhé nečte přes stejný deskriptor souboru.

└─$ exec 6< input.txt
└─$ cat <&6
i am just string
and another string..
└─$ cat <&6
└─$

Přijatá odpověď:

Chcete-li soubor vytisknout, první cat musí to dočíst až do konce. exec 6< input.txt způsobí, že shell podrží deskriptor souboru, dokud
shell nezemře nebo jej nezavře, takže offset souboru stále ukazuje na konec
souboru, když je druhý cat je vyvoláno, což tedy do stdout nic nezapíše.

Pokud používáte systém založený na Linuxu, můžete to vidět nahlédnutím do informací o deskriptoru souboru:

echo "File contents" > input.txt
exec 6< input.txt
cat "/proc/$$/fdinfo/6"
cat <&6
cat "/proc/$$/fdinfo/6"
cat <&6

Pokud tento skript spustíte, dostanete něco jako

pos:    0
flags:  0100000
mnt_id: 113
File contents
pos:    14
flags:  0100000
mnt_id: 113

potvrzující, že offset (pos ) není 0
, když je druhý cat se provede, ale místo toho ukazuje na svůj konec.

Pro resetování offsetu můžete přidat další exec 6< input.txt mezi cat s.


Linux
  1. Číst a zapisovat do stejného souboru v Linuxu bez přepisování?

  2. Linux – dekomprimujte a zrušte archivaci souboru .tar.gz pomocí Cat, Tar a Gzip na jednom příkazovém řádku?

  3. Rozdíl mezi .exrc a .vimrc?

  1. Echo To File Descriptor přepíše soubor?

  2. Proč Ls -l neukazuje čas a rok pro každý soubor?

  3. Proč Ls a Hexdump nesouhlasí s velikostí souboru?

  1. Proč se v Linuxu používá select

  2. Proč připojení nerespektuje možnost pouze pro čtení pro připojení připojení?

  3. Linux + jak dát ke čtení souboru pouze konkrétnímu uživateli