echo '<h1>hello, world</h1>' | firefox
cat index.html | firefox
Perintah-perintah ini tidak berfungsi.
Jika firefox dapat membaca stdin, saya dapat mengirim html ke firefox melalui pipa.
Apakah mungkin membuat firefox read stdin?
echo '<h1>hello, world</h1>' | firefox
cat index.html | firefox
Perintah-perintah ini tidak berfungsi.
Jika firefox dapat membaca stdin, saya dapat mengirim html ke firefox melalui pipa.
Apakah mungkin membuat firefox read stdin?
Jawaban:
Jawaban singkatnya adalah, Anda lebih baik menulis file sementara dan membukanya. Membuat pipa berfungsi dengan baik lebih rumit dan mungkin tidak akan memberi Anda keuntungan tambahan. Yang mengatakan, inilah yang saya temukan.
Jika firefox
perintah Anda sebenarnya memulai Firefox alih-alih berbicara dengan instance Firefox yang sudah berjalan, Anda dapat melakukan ini:
echo '<h1>hello, world</h1>' | firefox /dev/fd/0
Yang memberitahu Firefox secara eksplisit untuk membaca input standarnya, yang merupakan tempat pipa meletakkan datanya. Tetapi jika Firefox sudah berjalan, firefox
perintah itu hanya akan meneruskan nama itu ke proses Firefox utama, yang akan membaca input standar sendiri , yang mungkin tidak akan memberikan apa pun dan tentu saja tidak terhubung ke pipa Anda.
Selain itu, ketika membaca dari sebuah pipa, Firefox sangat mendukung hal-hal, jadi itu tidak akan memperbarui halaman setiap kali Anda memberikan baris baru HTML, jika itu yang Anda inginkan. Coba tutup Firefox dan jalankan:
cat | firefox /dev/fd/0
(NB Anda benar-benar membutuhkannya di cat
sini.) Tempelkan beberapa baris panjang ke jendela shell Anda berulang kali hingga Firefox memutuskan untuk memperbarui halaman, dan Anda dapat melihat berapa banyak data yang dibutuhkan. Sekarang kirim sinyal End-Of-File dengan menekan Ctrl+Dpada baris baru, dan saksikan pembaruan Firefox secara instan. Tetapi Anda tidak dapat menambahkan data lagi.
Jadi yang terbaik mungkin:
echo '<h1>hello, world</h1>' >my_temporary_file; firefox my_temporary_file
-new-instance
, jadi itu ... | firefox -new-instance /dev/fd/0
.
Anda dapat menggunakan URI data , seperti ini:
echo '<h1>hello, world</h1>' |firefox "data:text/html;base64,$(base64 -w 0 <&0)"
&0
adalah deskriptor file untuk stdin, sehingga menyandikan stdin ke base64
, lalu menginterpolasi itu ke dalam data URI.
Trik yang sama juga berfungsi untuk browser lain:
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)"
Jika mau, Anda bisa meletakkan bagian kedua dalam skrip bash (saya akan menyebutnya pipefox.sh
):
#!/bin/bash
firefox "data:text/html;base64,$(base64 -w 0 <&0)"
Sekarang Anda bisa melakukannya:
echo '<h1>hello, world</h1>' |pipefox.sh
Aku menemukan ini:
bcat - pipe to utility browser
... untuk menginstal di Ubuntu Natty, saya lakukan:
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
Saya pikir itu bekerja dengan browser sendiri - tetapi menjalankan di atas membuka tab baru di Firefox yang sudah berjalan, menunjuk ke alamat localhost http://127.0.0.1:53718/btest
... Dengan bcat
instalasi Anda juga dapat melakukan:
tail -f /var/log/syslog | ruby -rubygems /var/lib/gems/1.8/gems/bcat-0.6.2/bin/btee
... sebuah tab lagi akan terbuka, tetapi Firefox akan tetap menampilkan ikon pemuatan (dan tampaknya akan memperbarui halaman ketika syslog memperbarui).
The bcat
homepage juga referensi uzbl browser, yang tampaknya dapat menangani stdin - tetapi untuk perintah sendiri (mungkin harus melihat ke dalam ini lebih, meskipun)
EDIT: Karena saya sangat membutuhkan sesuatu seperti ini (kebanyakan untuk melihat tabel HTML dengan data yang dihasilkan dengan cepat (dan Firefox saya menjadi sangat lambat untuk berguna bcat
), saya mencoba dengan solusi khusus. Karena saya menggunakan ReText , saya sudah memiliki python-qt4
binding yang terinstal dan WebKit (dan dependensi) pada Ubuntu saya. Jadi, saya mengumpulkan skrip Python / PyQt4 / QWebKit - yang bekerja seperti bcat
(tidak suka btee
), tetapi dengan jendela browser sendiri - disebut Qt4WebKit_singleinst_stdin.py
(atau qwksisi
singkatnya):
Pada dasarnya, dengan skrip yang diunduh (dan dependensi) Anda dapat alias di bash
terminal seperti ini:
$ alias qwksisi="python /path/to/Qt4WebKit_singleinst_stdin.py"
... dan dalam satu terminal (setelah aliasing), qwksisi
akan menaikkan jendela browser utama; sementara di terminal lain (lagi setelah aliasing), orang bisa melakukan hal berikut untuk mendapatkan data stdin:
$ echo "<h1>Hello World</h1>" | qwksisi -
... seperti yang ditunjukkan di bawah ini:
Jangan lupa bagian -
akhir untuk merujuk ke stdin; jika tidak, nama file lokal juga dapat digunakan sebagai argumen terakhir.
Pada dasarnya, masalah di sini adalah untuk menyelesaikan:
Dengan demikian, hal yang sama dapat diimplementasikan dalam, katakanlah, Perl dengan binding Gtk dan WebKit (atau komponen browser lainnya). Saya bertanya-tanya, apakah kerangka kerja XUL oleh Mozilla dapat digunakan untuk mengimplementasikan fungsi yang sama - saya kira dalam kasus itu, orang akan bekerja dengan komponen browser Firefox.
Anda dapat menggunakan substitusi proses :
firefox <( echo '<h1>hello, world</h1>' )
firefox <( cat page_header.html contents.html footer.html )
firefox <( echo "<h1>Hello number "{1..23}"!</h1>" )
Lihat apa yang mencari 'browser stdin' muncul! , skrip shell kecil yang bagus:
#!/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
Jika Anda menyimpan ini di stdin2www
, membuatnya bisa dieksekusi ( chmod +x stdin2www
), contoh Anda harus bekerja melalui cat index.html | ./stdin2www
. Harap perhatikan bahwa tautan relatif , gambar, dll, akan gagal karena halaman yang akan dibuka adalah sesuatu /tmp/
; lebih banyak pekerjaan akan diperlukan untuk memperbaikinya.
Saya menulis skrip python untuk menulis stdin ke file sementara dan kemudian membuka file sementara dengan Firefox.
#!/usr/bin/env python
import sys
import tempfile
import subprocess
with tempfile.NamedTemporaryFile() as f:
f.write(sys.stdin.read())
f.flush()
process = subprocess.Popen(['firefox', f.name])
process.wait()
Anda dapat menjalankan perintah di bawah ini dari skrip shell / jendela terminal.
Sebelum meluncurkan Firefox (atau peramban lain), ia akan membaca dari konten yang akan ditampilkan saat dibuka.
Jika bukan HTML yang dikirim, ubah text/html
string di URL di bawah ini menjadi jenis file apa pun (misalnya, text/plain
atau image/png
).
firefox "data:text/html;base64,$(base64)"
ffpipe
Alias sederhana .Solusi data URI yang diberikan oleh bola salju dan luk3yx tidak berfungsi untuk saya di GNU / Linux.
Alias berikut harus berfungsi:
alias ffpipe='base64 -w0 <&0 | read -r x; firefox "data:text/html;base64,$x"'
misalnya.
echo '<h1>hello, world</h1>' | ffpipe
Halaman hanya akan memuat setelah pipa ditutup (mis. Akhir file telah tercapai).
Jika rendering tambahan dari konten yang disaring diperlukan, Anda lebih baik menggunakan sesuatu seperti bcat
utilitas yang disebutkan sebelumnya .
Meskipun pertanyaan ini berumur tujuh tahun, saya terkejut bahwa tidak ada yang mengusulkan solusi untuk melayani file melalui server web. Ini dicapai dengan skrip Python3 kompak berikut. Simpan sebagai file yang dapat dieksekusi, misalnya, 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()
Kemudian Anda dapat mengarahkan input standar ke browser default:
./browser.py < somewebpage.html
echo "<html><body><h1>Hello</h1></body></html>" | browse.py
Secara default server beroperasi pada port 8000, tetapi perilaku itu dapat diubah dengan argumen baris perintah:
./browser.py 9000 < website.html
Saya menguji skrip ini di Linux. Itu harus menangani sistem UNIX lain termasuk MacOS di luar kotak. Ini pada prinsipnya bahkan disiapkan untuk Windows (saya tidak punya satu untuk pengujian), tetapi di sana mungkin perlu untuk menerapkan fungsi batas waktu secara berbeda.