bash重定向到无效的文件

时间:2016-01-13 17:41:26

标签: bash shell sorting cat uniq

我有两个文件,yolo.txtbar.txt

yolo.txt:

a
b
c

跳回到bar.txt:

c

我有以下命令,它可以获得所需的输出:

$ cat yolo.txt bar.txt | sort | uniq -u | sponge
a
b

但是当我添加重定向(>)语句时,输出会改变:

$ cat yolo.txt bar.txt | sort | uniq -u | sponge > yolo.txt && cat yolo.txt
c

我预计输出会保持不变,我很困惑。请帮帮我。

1 个答案:

答案 0 :(得分:3)

> yolo.txt shell重定向发生在任何命令运行之前。特别是,在执行yolo.txt之前,shell会打开cat yolo.txt bar.txt来编写并将其截断。因此,当cat打开yolo.txt时,yolo.txt为空。因此c中的bar.txt行是唯一的,因此uniq -u会将其传递出来。

我想你想使用sponge来避免这个问题,因为那是sponge的用途。但是你错误地使用了它。这是正确的用法:

cat yolo.txt bar.txt | sort | uniq -u | sponge yolo.txt && cat yolo.txt

请注意,我只是将输出文件名作为命令行参数传递给sponge,而不是使用shell重定向。