在无限循环中,是否有某种方法可以写入接收到的数据?我有一个脚本,在我的终端显示网页上显示的网页内容。但是我对tee
数据的所有尝试都导致了一个空文件。我想这是因为没有退出循环,就没有机会写任何文件。但我已经阅读了无限循环用不需要的数据填充硬盘驱动器。所以看起来编写命令管道的输出似乎也是可能的。
get_page() {
osascript -e \
'tell application "Google_Chrome" to tell window 1 to tell active tab to execute javascript "document.body.innerText"'
}
while get_page | grep -E '[:alnum:]'
do
sleep 1 &
done < <(get_page) | awk '!x[$0]++'
请注意,这个工作的唯一原因是awk !x[$0]++
命令(如果我的解释不准确,请更正我)读取它接收的输入,然后删除重复的行,同时保留行的顺序为好。如果没有这个,那么这个剧本就会疯狂。
答案 0 :(得分:0)
一些事情:
循环不是无限的。它迭代直到getpage
函数返回非零。
您希望循环每秒执行一次吗?在这种情况下,请删除&
之后的sleep 1
,否则执行速度会快得多! &
将sleep
进程置于后台并继续。
您正在拨打getpage
两次。这可能是无意的。我不确定它会返回什么,但你可能需要类似以下内容:
while true; do
getpage
sleep 1
done | awk '!seen[$0]++' | tee output.log
如果仍然无法解决问题,正如下面的评论中所指出的那样,由于awk
进行了缓冲。要强制awk
在每行之后刷新其输出缓冲区
awk '!seen[$0]++ { print; fflush() }'
这方面的一个小问题是awk
进程将保留内存中每个唯一输入行的副本。随着从getpage
的输出中读取更多唯一行,这将会增长。