私はこのファイルを持っています:
1
2
3
4
私がpaste
こちらに走るとき
paste - - <file
この結果
1 2
3 4
これまでは標準入力(からリダイレクトされますfile
)が2回渡されるため、奇数paste
行と偶数行がペアで印刷されます。
ただし、これが次のように変更された場合
paste - /dev/fd/0 <file
出力は
1 1
2 2
3 3
4 4
paste
file
パラメータ-
について一度、/dev/fd/0
。
私はこれを説明できません - 私が翻訳していたならこれ正しく、-
両方とも/dev/fd/0
単一のカーネルファイルテーブルエントリを参照する必要があるため、paste
前のケースと同じ結果を生成する必要があります。
ベストアンサー1
これはLinux固有です。ほとんどのUnicesで開く(ファイル記述子をインポートするのと/dev/fd/n
ほぼ同じです)dup(n)
ファイル説明を開くfdと同じn
)Linuxでは、/dev/fd/n
ファイル記述子で開かれたファイルへのシンボリックリンクですn
。
したがって、Linuxでは次のようになります。
paste - /dev/fd/0 < file
同じです:
paste - file < file
(またはpaste file file
)。
2 つの fd (0 と-
open or で得られる独自のファイル) は独立しており、ファイルには独自のカーソルがあります。/dev/fd/0
file
また、Linuxでは、ソケットで/dev/fd/nを使用できないことがわかります。
通常、Linuxではパイプでのみ使用しようとしています/dev/fd/n
。しかし、この場合
cat file | paste - /dev/fd/0
(またはLinuxベースではなくオペレーティングシステムに切り替えること)は実際には役に立ちません。どちらの場合も標準入力として知られているpaste - -
ため動作します。paste
しかし、ここではないので(fd 0からパイプまで)から(1行ではなく)ブロック全体を読み、次に-
/ dev / fd / 0から別のブロックを(Linuxの別のfdから同じパイプに読み込みます。fd同じものを指すかどうか)ファイル説明を開くまたはパイプラインには重要ではありません。)両方ともread()
ファイルの他の部分を読みますが、一度に数行ずつ読みます。
1行を読み取る前に、1行以上読み取らないようにpaste
一度に1バイトずつ読み込むように指示する必要があります。これはおそらく再コンパイルしなければ不可能です。標準入力を一度に1バイトずつ読み取ることができますが、おそらくそうではありません。-
/dev/fd/0
paste
stdbuf
/dev/fd/0
$ cat file | paste - /dev/fd/0
1
2
3
4
$ cat file | stdbuf -i1 paste - /dev/fd/0
1 2
3
4