如何让 Firefox 读取标准输入?

如何让 Firefox 读取标准输入?
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

我找到了这个:

bcat——管道到浏览器实用程序

...为了在 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-qt4WebKit 绑定(和依赖项)。因此,我编写了一个 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>" )

相关内容