我有一个文本文件,其中有些行我想排序。该文件名为somefile
。
cat somefile | sort
将一些排序后的输出发送到stdout。
cat somefile > anotherfile
将cat somefile
的输出写入anotherfile
但是
cat somefile | sort > somefile
导致somefile
为空。
这是为什么?我希望somefile
被发送到stdout,重定向到排序程序,该程序将已排序的输出发送到stdout,然后将其写入somefile
。
答案 0 :(得分:2)
管道中的进程是并行执行的,而不是顺序执行。
所以cat somefile | sort > somefile
的作用是:
同时运行cat
和sort
,同时将cat
的{{1}}连接到stdout
的{{1}}和sort
stdin
和cat
的{{1}}连接到为stdin
打开的文件描述符。
在运行sort
和stdout
之前,shell需要为somefile
和<
设置重定向。在此过程中,它为每个重定向使用>
和cat
系统调用。因此,sort
在open()
的系统调用被截断之前,没有机会从文件中读取文件。
答案 1 :(得分:0)
>
重定向首先清空目标文件,因此没有任何内容可用于分类。
答案 2 :(得分:0)
这只能使用sort命令来完成。
sort -o somefile somefile
否则,您将不得不对tmp文件进行排序
sort somefile > tmpfile && mv tmpfile somefile