我需要从 STDIN 读取行并处理它们。我可以做类似的事情:
<print lines to STDOUT> | while read line; do
<process $line>
done
但这意味着第一的所有行都被打印并通过管道传输然后它们被处理。我想立即处理每一行,最终在下一行发送到 STDOUT 之前。
如果应在生成行时对其进行处理(例如日志文件),这可能很有用。我的任务是使用兹巴(警告!该网页会使 Firefox 崩溃...)扫描多个二维码并在 Firefox 中打开其 URL。如果运行,zbarcam --raw
网络摄像头用于扫描 QR 码。如果找到 QR 代码,URL 将立即打印到 STDOUT,但 zbarcam 不会终止。所以我想阅读这一行并运行firefox $url
左右(但不等待其他 URL)。
我发现一个办法,但我想知道这是否不能更容易地完成。基本上,他将输出写入zbarcam
临时文件并等待,直到其中写入内容:
zbarcam --raw > tmpfile &
...
while [[ ! -s $tmp ]] ; do
sleep 1
done
这可以在没有临时文件且没有循环的情况下完成吗sleep 1
?
答案1
您的第一次尝试确实有效:
tail -f temp.file | while read LINE; do firefox $LINE; done
然后在另一个终端中,附加到临时文件,以便 tail -f 将一行打印到 STDOUT:
echo 'google.com' >> temp.file
每次执行此操作时,Firefox 都会打开一个新选项卡。
答案2
经过一番尝试后,我找到了部分解决方案:
zbarcam --raw|xargs -L1 firefox
关键部分是参数-L1
,它告诉xargs
我们只读取一行。读取第一个二维码后,它会运行 Firefox。zbar
然后仍然运行,但我无法扫描第二个二维码(xargs
必须以某种方式再次调用)。
答案3
非常非常接近:
zbarcam --raw | xargs -n 1 chromium-browser
这对我来说效果很好,每次扫描都会在一个新选项卡中结束。