![如何让 Firefox 读取标准输入?](https://linux22.com/image/20159/%E5%A6%82%E4%BD%95%E8%AE%A9%20Firefox%20%E8%AF%BB%E5%8F%96%E6%A0%87%E5%87%86%E8%BE%93%E5%85%A5%EF%BC%9F.png)
echo '<h1>hello, world</h1>' | firefox
cat index.html | firefox
这些命令不起作用。
如果可以读取标准输入,我可以通过管道firefox
发送 HTML 。 是否可以读取标准输入?firefox
firefox
答案1
您可以使用数据 URI, 像这样:
echo '<h1>hello, world</h1>' |firefox "data:text/html;base64,$(base64 -w 0 <&0)"
&0
是 stdin 的文件描述符,因此它将 stdin 编码为base64
,然后将其插入到数据 URI 中。
同样的技巧也适用于其他浏览器:
echo '<h1>hello, world</h1>' |chromium "data:text/html;base64,$(base64 -w 0 <&0)"
echo '<h1>hello, world</h1>' |opera "data:text/html;base64,$(base64 -w 0 <&0)"
如果需要,您可以将第二部分放入 bash 脚本中(我将其称为pipefox.sh
):
#!/bin/bash
firefox "data:text/html;base64,$(base64 -w 0 <&0)"
现在你可以这样做:
echo '<h1>hello, world</h1>' |pipefox.sh
答案2
简而言之,您最好编写一个临时文件并打开它。让管道正常工作更加复杂,并且可能不会给您带来任何额外的优势。这就是说,这就是我发现的。
如果您的firefox
命令实际上是启动 Firefox,而不是与已经运行的 Firefox 实例对话,您可以执行以下操作:
echo '<h1>hello, world</h1>' | firefox /dev/fd/0
它明确告诉 Firefox 读取其标准输入,这是管道放置数据的位置。但如果 Firefox 已经在运行,该firefox
命令只会将该名称传递给 Firefox 主进程,该进程将读取它自己的标准输入,它可能不会给它任何东西,并且肯定不会连接到您的管道。
此外,当从管道读取数据时,Firefox 会大量缓冲内容,因此每次您给它新的 HTML 行时,它不会更新页面(如果您想要这样做)。尝试关闭 Firefox 并运行:
cat | firefox /dev/fd/0
(注意,您确实需要此处cat
。)将一些长行反复粘贴到 shell 窗口中,直到 Firefox 决定更新页面,您可以看到它需要多少数据。现在,通过点击Ctrl+D新行来发送文件结束信号,并立即观看 Firefox 更新。但随后您将无法添加更多数据。
所以最好的可能是:
echo '<h1>hello, world</h1>' >my_temporary_file; firefox my_temporary_file
答案3
我找到了这个:
...为了在 Ubuntu Natty 上安装,我做了:
sudo apt-get install rubygems1.8
sudo gem install bcat
# to call
ruby -rubygems /var/lib/gems/1.8/gems/bcat-0.6.2/bin/bcat
echo "<b>test</b>" | ruby -rubygems /var/lib/gems/1.8/gems/bcat-0.6.2/bin/bcat
我认为它适用于它自己的浏览器 - 但是运行上面的命令在已经运行的 Firefox 中打开了一个新选项卡,指向本地主机地址http://127.0.0.1:53718/btest
......bcat
安装后您还可以执行以下操作:
tail -f /var/log/syslog | ruby -rubygems /var/lib/gems/1.8/gems/bcat-0.6.2/bin/btee
...一个选项卡将再次打开,但 Firefox 将继续显示加载图标(并且显然会在系统日志更新时更新页面)。
主页bcat
还引用了乌兹布尔浏览器,它显然可以处理标准输入 - 但对于它自己的命令(不过,可能应该更多地研究这一点)
编辑:因为我非常需要这样的东西(主要是为了查看带有动态生成的数据的 HTML 表(并且我的 Firefox 的使用速度非常慢bcat
),所以我尝试使用自定义解决方案。因为我使用重新文本,我已经在我的 Ubuntu 上安装了python-qt4
WebKit 绑定(和依赖项)。因此,我编写了一个 Python/PyQt4/QWebKit 脚本 - 其工作方式类似于bcat
(而不是类似btee
),但具有自己的浏览器窗口 - 称为Qt4WebKit_singleinst_stdin.py
(或qwksisi
简称):
基本上,使用下载的脚本(和依赖项),您可以在bash
终端中为其添加别名,如下所示:
$ alias qwksisi="python /path/to/Qt4WebKit_singleinst_stdin.py"
...并且在一个终端中(别名之后),qwksisi
将弹出主浏览器窗口;在另一个终端中(再次使用别名之后),可以执行以下操作来获取 stdin 数据:
$ echo "<h1>Hello World</h1>" | qwksisi -
... 如下所示:
不要忘记-
末尾引用 stdin;否则,本地文件名也可以用作最后一个参数。
基本上,这里的问题是要解决:
- 单实例问题(因此脚本的第一次运行成为“主脚本”并引发浏览器窗口 - 而后续运行只是将数据传递给主脚本并退出)
- 用于共享变量的进程间通信(因此退出进程可以将数据传递到主浏览器窗口)
- 主控中的计时器更新检查新内容,并在新内容到达时更新浏览器窗口。
因此,同样可以在带有 Gtk 绑定和 WebKit(或其他浏览器组件)的 Perl 中实现。不过,我想知道 Mozilla 的 XUL 框架是否可以用来实现相同的功能 - 我想在这种情况下,可以使用 Firefox 浏览器组件。
答案4
您可以使用流程替代:
firefox <( echo '<h1>hello, world</h1>' )
firefox <( cat page_header.html contents.html footer.html )
firefox <( echo "<h1>Hello number "{1..23}"!</h1>" )