我在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的列,但是没有看到。我做错了什么?
yes "test" > file
您需要做的是相同的,Ctrl-C
停止它,并且文件中有很多“测试”。
使用您的脚本,如果删除sleep 1
,您还将在myfile
中看到许多3
。使用sleep
,我认为您只是按下了Ctrl-C
太快,stdout缓冲区没有被填满/刷新。
如果您想跳过缓冲区,可以:
./loop.sh|stdbuf -o0 cut -d' ' -f3>myfile
正如我在评论中提到的那样,可能正在缓冲。当我尝试这个操作时,我得到了相同的结果。
你可以使用stdbuf
来修改缓冲,像这样(至少对我来说有效):
./loop.sh | stdbuf -o0 cut -d' ' -f3 > myfile
缓冲区是在管道链的最后一部分完成(或看起来完成),因此这就是stdbuf
的放置位置。
有关详细信息,请参见man stdbuf
。
myfile
中?它可能正在缓冲,每秒只有2个字符,需要一些时间来刷新缓冲区。 - user707650