これら2つの「cat」コマンドの結果が異なるのはなぜですか?


12

infileに特定のテキストが含まれていて、次の一連のコマンドを実行すると仮定します。

幹部 3<infile

猫-n <&3

猫-n <&3

catの最初のインスタンスはファイルの内容を表示しますが、2回目は何もしていないようです。なぜ違うのですか?

回答:


29

これらは同じコマンドのように見えますが、異なる理由は、最初のコマンドの結果としてシステム状態が変化したためです。具体的には、最初のcatファイルはファイル全体を消費したため、2番目のファイルにcatは読み物がなく、すぐにEOF(ファイルの終わり)に到達して終了します。

この背後にある理由は、の両方の呼び出しにまったく同じファイル記述(ファイル記述子を使用して作成しexec < infile、ファイル記述子に割り当てたもの3)を使用しているためですcat。開いているファイルの説明に関連するものの1つは、ファイルオフセットです。したがって、最初のcatファイルはファイル全体を読み取り、オフセットを最後に残し、2番目のファイルはファイルの最後からピックアップしようとして、読み取るものが見つかりません。


12

@ jw013のすばらしい答えに追加するだけで、それが

{
   cat -n
   cat -n
} < infile

< fileの略で0< file、3の代わりにファイル記述子0を使用します。

問題を少し混乱させるために、このバージョン:

exec 3< infile
cat -n /dev/fd/3
cat -n /dev/fd/3

振る舞いが異なり、あなたがそれを実行するOSとに依存するタイプinfile(デバイス対パイプ対通常のファイル...)

Solarisおよびほとんどの商用Unicesでは、open("/dev/fd/3")aはaとほぼ同等ですdup(3)(そのため< /dev/fd/3、ほぼ同じです<&3)。一方、Linuxでは、通常のファイルの場合/dev/fd/3、元のファイルへのシンボリックリンクとして実装されるため、最初open("/dev/fd/3")から(おそらくfdとは異なるフラグを使用する3)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.