如何将剪切输出写入文件

时间:2013-09-19 12:07:55

标签: linux bash shell

我在bash上有自定义生成器:

#!/bin/bash
while :
do
    echo "1 2 3 4"
    sleep 1
done

我不想剪切第3栏:

$ ./loop.sh | cut -d' ' -f3

这很好用,但是当我尝试将其输出到文件时:

$ ./loop.sh | cut -d' ' -f3 > myfile

什么都没发生,这个文件是空的。我希望看到 3 的列,但什么都没有。我做错了什么?

2 个答案:

答案 0 :(得分:4)

你得到一个空文件,因为stdout是缓冲的。

如果你想证明它,你可以尝试:

yes "test" > file

你必须这样做,ctrl-c来阻止它,文件中有很多“测试”。

使用您的脚本,如果您删除了sleep 1,您的3中也会看到很多myfile。使用sleep,我认为你只是按ctrl-c这么快,stdout缓冲区没有被填充/刷新。

如果你想跳过缓冲区,你可以:

./loop.sh|stdbuf -o0 cut -d' ' -f3>myfile

答案 1 :(得分:4)

正如我在评论中提到的那样,它可能正在缓冲。当我尝试这个时,我得到了相同的结果。 您可以使用stdbuf来修改缓冲,就像这样(至少,这对我有用):

./loop.sh | stdbuf -o0 cut -d' ' -f3  > myfile

在管道链的最后部分完成(或似乎已完成)缓冲,以便放置stdbuf

有关详细信息,请参阅man stdbuf