从 STDIN 读取并立即使用数据(同时仍在读取)或使用 zbar 打开 URL

从 STDIN 读取并立即使用数据(同时仍在读取)或使用 zbar 打开 URL

我需要从 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

这对我来说效果很好,每次扫描都会在一个新选项卡中结束。

相关内容