为什么管道读取和写入同一文件会导致空白文件?

时间:2019-05-22 11:24:43

标签: bash

我有一个文本文件,其中有些行我想排序。该文件名为somefile

cat somefile | sort

将一些排序后的输出发送到stdout。

cat somefile > anotherfile

cat somefile的输出写入anotherfile

但是

cat somefile | sort > somefile

导致somefile为空。

这是为什么?我希望somefile被发送到stdout,重定向到排序程序,该程序将已排序的输出发送到stdout,然后将其写入somefile

3 个答案:

答案 0 :(得分:2)

管道中的进程是并行执行的,而不是顺序执行。

所以cat somefile | sort > somefile的作用是:

同时运行catsort,同时将cat的{​​{1}}连接到stdout的{​​{1}}和sort stdincat的{​​{1}}连接到为stdin打开的文件描述符。

在运行sortstdout之前,shell需要为somefile<设置重定向。在此过程中,它为每个重定向使用>cat系统调用。因此,sortopen()的系统调用被截断之前,没有机会从文件中读取文件。

答案 1 :(得分:0)

>重定向首先清空目标文件,因此没有任何内容可用于分类。

答案 2 :(得分:0)

这只能使用sort命令来完成。

sort -o somefile somefile

否则,您将不得不对tmp文件进行排序

sort somefile > tmpfile && mv tmpfile somefile