Answers:
简短的答案是,最好写一个临时文件并打开它。使管道正常工作更加复杂,可能不会给您带来任何额外的优势。也就是说,这就是我所发现的。
如果您的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
-new-instance
,这样就变成了... | firefox -new-instance /dev/fd/0
。
您可以使用数据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
我找到了这个:
...要在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将继续显示加载图标(并且显然在syslog更新时会更新页面)。
该bcat
首页还引用了uzbl浏览器,该浏览器显然可以处理stdin-但针对其自己的命令(不过,应该对此进行更多研究)
编辑:由于我急需这样的东西(主要是使用动态生成的数据查看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"
...并在一个终端(别名后)中,qwksisi
将显示主浏览器窗口;而在另一个终端中(还是在别名之后),可以执行以下操作来获取标准输入数据:
$ echo "<h1>Hello World</h1>" | qwksisi -
... 如下所示:
不要忘了-
在结尾引用stdin。否则,本地文件名也可以用作最后一个参数。
基本上,这里的问题是要解决:
这样,可以在具有Gtk绑定和WebKit(或其他浏览器组件)的Perl中实现相同的功能。不过,我想知道,是否可以使用Mozilla的XUL框架来实现相同的功能-我想在那种情况下,可以使用Firefox浏览器组件。
您可以使用流程替换:
firefox <( echo '<h1>hello, world</h1>' )
firefox <( cat page_header.html contents.html footer.html )
firefox <( echo "<h1>Hello number "{1..23}"!</h1>" )
看看搜索“浏览器标准输入”的结果是什么!,一个不错的小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
如果将其保存在其中stdin2www
,使其可执行(chmod +x stdin2www
),则示例应通过进行工作cat index.html | ./stdin2www
。只是请注意,相对的链接,图像等将失败,因为将要打开的页面是某种东西/tmp/
;需要更多的工作来解决此问题。
尽管这个问题已有七年之久,但我感到惊讶的是,没有人提出通过Web服务器提供文件服务的解决方案。这是通过以下紧凑的Python3脚本实现的。将其另存为可执行文件,例如,browse.py:
#!/usr/bin/env python3
import sys, os, time, platform, signal
from subprocess import Popen
from http.server import HTTPServer, BaseHTTPRequestHandler
sys.stderr = open(os.devnull, 'w')
def timeoutHandler(signum, frame):
sys.exit("")
signal.signal(signal.SIGALRM, timeoutHandler)
signal.alarm(2)
html = sys.stdin.read()
port = int(sys.argv[1]) if len(sys.argv) > 1 else 8000
class Handler(BaseHTTPRequestHandler):
def _set_headers(self):
self.send_response(200)
self.send_header("content-type", "text/html")
self.end_headers()
def do_GET(self):
self._set_headers()
self.wfile.write(b = bytes(html, "utf-8"))
platform = platform.system().lower()
if platform.find("win") >= 0: command = "start"
elif platform.find("mac") >= 0 or platform.find("darwin") >= 0: command = "open"
else: command = "xdg-open"
p = Popen([command, "http://localhost:" + str(port) + "/"])
httpd = HTTPServer(("localhost", port), Handler)
httpd.serve_forever()
然后,您可以将标准输入重定向到默认浏览器:
./browser.py < somewebpage.html
echo "<html><body><h1>Hello</h1></body></html>" | browse.py
默认情况下,服务器在端口8000上运行,但是可以使用命令行参数更改该行为:
./browser.py 9000 < website.html
我在Linux上测试了此脚本。它应该开箱即用地处理其他UNIX系统,包括MacOS。原则上,它甚至是为Windows准备的(我没有要测试的Windows),但是可能有必要以不同的方式实现超时功能。