回答:
簡単な答えは、一時ファイルを書いてそれを開くほうがいいということです。パイプを適切に機能させることはより複雑で、おそらく余計な利点はありません。とはいえ、ここに私が見つけたものがあります。
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
ここが必要です。)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)"
必要に応じて、2番目の部分を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(おそらくかかわらず、より多くの本になっているはずです)が、独自のコマンドについて-明らかに標準入力を処理できるブラウザを、
編集:私はこのようなものがひどく必要だったので(主にオンザフライで生成されたデータでHTMLテーブルを表示するために(そして私のFirefoxは有用であるために本当に遅くなっていますbcat
))、私はカスタムソリューションで試しました。私はすでにReTextを使用していましたインストールpython-qt4
およびWebKitのバインディング(および依存関係)私のUbuntuのように、私は一緒に入れパイソン/ PyQt4 / QWebKitスクリプト-のように動作します。bcat
(ないようなbtee
)が、独自のブラウザウィンドウで-と呼ばれるQt4WebKit_singleinst_stdin.py
(またはqwksisi
略して):
基本的に、ダウンロードしたスクリプト(および依存関係)を使用して、次のbash
ような端末でエイリアスを作成できます。
$ alias qwksisi="python /path/to/Qt4WebKit_singleinst_stdin.py"
...そして、1つの端末(エイリアス処理後)でqwksisi
、マスターブラウザーウィンドウを表示します。一方、別の端末で(再びエイリアシング後)、stdinデータを取得するために次のことができます。
$ echo "<h1>Hello World</h1>" | qwksisi -
...以下に示すように:
-
最後にstdinを参照することを忘れないでください。それ以外の場合は、ローカルファイル名を最後の引数として使用することもできます。
基本的に、ここでの問題は解決することです:
そのため、たとえば、GtkバインディングとWebKit(または他のブラウザコンポーネント)を備えたPerlでも同じことが実装できます。ただし、MozillaのXULフレームワークを使用して同じ機能を実装できるのではないかと思います。その場合、Firefoxブラウザーコンポーネントを使用すると思います。
「ブラウザ標準」の検索結果が表示されます。、素敵な小さなシェルスクリプト:
#!/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/
。これを修正するには、さらに作業が必要です。
ffpipe
エイリアス。snowballとluk3yxが提供するデータURIソリューションは、GNU / Linuxでは機能しません。
次のエイリアスが機能するはずです。
alias ffpipe='base64 -w0 <&0 | read -r x; firefox "data:text/html;base64,$x"'
例えば。
echo '<h1>hello, world</h1>' | ffpipe
ページは、パイプが閉じられると(つまり、ファイルの終わりに達すると)ロードされます。
パイプコンテンツのインクリメンタルレンダリングが必要な場合は、前述のbcat
ユーティリティのようなものを使用することをお勧めします。
この質問は7年前のものですが、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でテストしました。MacOSを含む他のUNIXシステムをそのまま使用できるはずです。原則としてWindows用にも準備されています(テスト用のものはありません)が、タイムアウト機能を異なる方法で実装する必要があるかもしれません。