GNU/Linux >> Linux の 問題 >  >> Linux

ファイル記述子が開かれ、一度だけ読み取られるのはなぜですか?

ファイル記述子を自分で開いてstdinにリダイレクトするときに、なぜ1回しか使用できないのですか?
以下の例を見て、私が言いたいことを理解してください。 catコマンドで1回読み取った後、同じファイル記述子を介してファイルが2回目に読み取られることはありません。

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

承認された回答:

ファイルを印刷するには、最初のcat 最後まで読まなければなりません。 exec 6< input.txt
シェルが停止するか閉じるまで、シェルはファイル記述子を保持します。そのため、2番目のcatの場合、ファイルオフセットは
ファイルの終わりを指します。 が呼び出されるため、stdoutには何も書き込まれません。

Linuxベースのシステムの場合は、ファイル記述子情報を確認することで、それが発生していることがわかります。

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

そのスクリプトを実行すると、次のようなものが得られます

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

オフセットを確認する(pos )2番目のcatの場合、0
ではありません 実行されますが、代わりにその終わりを指します。

オフセットをリセットするには、別のexec 6< input.txtを追加します。 catの間 s。


Linux
  1. Linuxで上書きせずに同じファイルを読み書きしますか?

  2. なぜ(そしてどのように)バイナリファイルでCatを使用したのですか?

  3. Linux – 1つのコマンドラインでCat、Tar、Gzipを使用して.tar.gzファイルを解凍してアーカイブ解除しますか?

  1. .exrcと.vimrcの違いは?

  2. Ls -lがすべてのファイルの時間や年を表示しないのはなぜですか?

  3. LsとHexdumpがファイルサイズについて意見が一致しないのはなぜですか?

  1. Bashの正規表現が変数であり、直接ではない場合にのみ機能するのはなぜですか?

  2. プロセスをフォークすると、ファイルが無限に読み取られるのはなぜですか

  3. ルート ディレクトリが / 記号で示されるのはなぜですか?