回答:
これらは同じコマンドのように見えますが、異なる理由は、最初のコマンドの結果としてシステム状態が変化したためです。具体的には、最初のcatファイルはファイル全体を消費したため、2番目のファイルにcatは読み物がなく、すぐにEOF(ファイルの終わり)に到達して終了します。
この背後にある理由は、の両方の呼び出しにまったく同じファイル記述(ファイル記述子を使用して作成しexec < infile、ファイル記述子に割り当てたもの3)を使用しているためですcat。開いているファイルの説明に関連するものの1つは、ファイルオフセットです。したがって、最初のcatファイルはファイル全体を読み取り、オフセットを最後に残し、2番目のファイルはファイルの最後からピックアップしようとして、読み取るものが見つかりません。
@ 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)。