5

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

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

我不想删掉第三列:

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

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

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

什么也没发生,这个文件是空的。我希望看到3的列,但一无所获。我做错了什么?

4

2 回答 2

4

你得到一个空文件,因为标准输出被缓冲了。

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

yes "test" > file

你必须做同样的事情ctrl-c来阻止它,并且文件中有很多“测试”。

使用您的脚本,如果您删除,您也会在您的脚本中sleep 1看到很多。使用,我认为您只是按得太快以至于标准输出缓冲区没有被填满/刷新。3myfilesleepctrl-c

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

./loop.sh|stdbuf -o0 cut -d' ' -f3>myfile
于 2013-09-19T12:26:04.807 回答
4

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

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

缓冲在管道链的最后一部分完成(或似乎完成),所以这stdbuf就是放置的地方。

详情请参阅man stdbuf

于 2013-09-19T12:27:16.657 回答