我在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 的列,但什么都没有。我做错了什么?
答案 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
。