echo '<h1>hello, world</h1>' | firefox
cat index.html | firefox
Run Code Online (Sandbox Code Playgroud)
这些命令不起作用。
如果firefox
可以读取标准输入,我可以firefox
通过管道发送 HTML 。
是否可以firefox
读取标准输入?
Sno*_*all 41
您可以使用数据 URI,如下所示:
echo '<h1>hello, world</h1>' |firefox "data:text/html;base64,$(base64 -w 0 <&0)"
Run Code Online (Sandbox Code Playgroud)
&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)"
Run Code Online (Sandbox Code Playgroud)
如果需要,您可以将第二部分放在 bash 脚本中(我称之为pipefox.sh
):
#!/bin/bash
firefox "data:text/html;base64,$(base64 -w 0 <&0)"
Run Code Online (Sandbox Code Playgroud)
现在你可以这样做:
echo '<h1>hello, world</h1>' |pipefox.sh
Run Code Online (Sandbox Code Playgroud)
Jan*_*der 25
简短的回答是,您最好编写一个临时文件并打开它。让管道正常工作更复杂,可能不会给你任何额外的好处。也就是说,这就是我发现的。
如果您的firefox
命令实际上是启动 Firefox 而不是与已经运行的 Firefox 实例对话,您可以这样做:
echo '<h1>hello, world</h1>' | firefox /dev/fd/0
Run Code Online (Sandbox Code Playgroud)
它明确地告诉 Firefox 读取它的标准输入,这是管道放置数据的地方。但是,如果 Firefox 已经在运行,该firefox
命令只会将该名称传递给主 Firefox 进程,该进程将读取自己的标准输入,这可能不会给它任何内容并且肯定不会连接到您的管道。
此外,当从管道中读取时,Firefox 会大量缓冲内容,因此每次您给它一个新的 HTML 行时它都不会更新页面,如果这就是您想要的。尝试关闭 Firefox 并运行:
cat | firefox /dev/fd/0
Run Code Online (Sandbox Code Playgroud)
(注意,您确实需要cat
此处。)将一些长行重复粘贴到您的 shell 窗口中,直到 Firefox 决定更新页面,您就可以看到它需要多少数据。现在通过点击Ctrl+D新行发送文件结束信号,并立即观看 Firefox 更新。但是这样你就不能再添加任何数据了。
所以最好的可能是:
echo '<h1>hello, world</h1>' >my_temporary_file; firefox my_temporary_file
Run Code Online (Sandbox Code Playgroud)
我找到了这个:
...要在 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
Run Code Online (Sandbox Code Playgroud)
我认为它可以与自己的浏览器一起使用 - 但运行上述内容会在已经运行的 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
Run Code Online (Sandbox Code Playgroud)
...一个选项卡将再次打开,但 Firefox 将继续显示加载图标(并且显然会在系统日志更新时更新页面)。
该bcat
主页还引用了uzbl浏览器,它可以明显处理标准输入-但它自己的命令(或许应该看看这个多,虽然)
编辑:因为我非常需要这样的东西(主要是为了查看带有动态生成的数据的 HTML 表格(我的 Firefox 变得非常慢,无法使用bcat
),所以我尝试使用自定义解决方案。自从我使用ReText以来,我已经有了python-qt4
在我的 Ubuntu 上安装和 WebKit 绑定(和依赖项)。所以,我把一个 Python/PyQt4/QWebKit 脚本放在一起 - 它的工作原理类似于bcat
(不像btee
),但有自己的浏览器窗口 - 称为Qt4WebKit_singleinst_stdin.py
(或qwksisi
简称):
基本上,使用下载的脚本(和依赖项),您可以在bash
终端中为它设置别名,如下所示:
$ alias qwksisi="python /path/to/Qt4WebKit_singleinst_stdin.py"
Run Code Online (Sandbox Code Playgroud)
...并在一个终端中(在别名之后),qwksisi
将提升主浏览器窗口;而在另一个终端中(再次在别名之后),可以执行以下操作来获取 stdin 数据:
$ echo "<h1>Hello World</h1>" | qwksisi -
Run Code Online (Sandbox Code Playgroud)
... 如下所示:
不要忘记-
在末尾引用标准输入;否则本地文件名也可以用作最后一个参数。
基本上,这里的问题是要解决:
因此,可以在 Perl 中使用 Gtk 绑定和 WebKit(或其他浏览器组件)实现相同的功能。不过,我想知道是否可以使用 Mozilla 的 XUL 框架来实现相同的功能——我猜在那种情况下,可以使用 Firefox 浏览器组件。
看看搜索“浏览器标准输入”的结果!,一个不错的小shell脚本:
#!/bin/sh
# read from stdin, write to a temp file, open the temp file in a browser, then delete it
tmpfile=$(tempfile); cat > $tmpfile; x-www-browser $tmpfile; rm $tmpfile
Run Code Online (Sandbox Code Playgroud)
如果你把它保存在stdin2www
,使其可执行(chmod +x stdin2www
),你的例子应该通过工作cat index.html | ./stdin2www
。请注意,相对链接、图像等将失败,因为要打开的页面是一些东西/tmp/
;需要做更多的工作来解决这个问题。
归档时间: |
|
查看次数: |
15824 次 |
最近记录: |