为何使用标准输入时paste命令的输出结果不同?
关于
paste命令输入为多个-时的行为解释 手册说明
paste将每个输入文件中依次对应的行合并,以制表符分隔后写入标准输出。当文件名指定为‘-’或未给出输入文件时,使用标准输入。
问题场景
当不使用标准输入时,paste的行为符合预期:比如执行paste file1 file2,输出的第n行由file1的第n行、制表符、file2的第n行组成。
但如果将输入替换为两个表示标准输入的-,执行paste - - < foo.txt时,输出的每行却是标准输入的连续两行以制表符分隔,而非同一行重复两次,这一行为需要解释。
示例验证
假设有文件foo.txt,内容如下:
1 2 3 4
- 执行
paste foo.txt foo.txt,输出为:
1 1 2 2 3 3 4 4
- 执行
paste - - < foo.txt,输出为:
1 2 3 4
原因解释
你的猜想完全正确,核心差异在于文件描述符的数量:
paste foo.txt foo.txt会打开foo.txt的两个独立文件描述符,每个描述符都有自己独立的文件指针(即你所说的“光标”)。每次合并行时,两个指针分别读取各自指向的第n行,读取完成后同时后移,最终得到对应行合并的结果。paste - - < foo.txt中,两个-指向的是同一个标准输入流(这里由foo.txt重定向而来)。标准输入是单一的数据流,只有一个文件指针。paste处理第一个-时读取一行,指针后移;处理第二个-时,只能从当前指针位置继续读取下一行,指针再次后移。循环此过程,就将连续的两行合并成了输出的一行,从而产生了你看到的结果。
内容的提问来源于stack exchange,提问作者Mehdi Charife
相关产品推荐
相关产品推荐

