Perintah-perintah ini tidak berfungsi.
Jika firefox dapat membaca stdin, saya dapat mengirim html ke firefox melalui pipa.
Apakah mungkin membuat firefox read stdin?
@ pbm: Mungkin berguna untuk menghindari penyimpanan data sementara ...
l0b0
Jawaban:
23
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 firefoxperintah 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, firefoxperintah 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 catsini.) 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.
benar-benar dahsyat !, bagaimana kamu bisa melakukan ini? Anda dapat meningkatkan penamaan pipefox.sh ke pipebrowser dengan konteks: $ 1 "data: teks / html; base64, $ (base64 -w 0 <& 0)" memungkinkan untuk memilih browser yang Anda sukai
Sayangnya ini tidak berfungsi lagi, lihat blog.mozilla.org/security/2017/11/27/… untuk alasan mengapa sebagian besar mimetipe dalam url data sekarang diblokir dari navigasi tingkat atas.
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 bcatinstalasi Anda juga dapat melakukan:
... sebuah tab lagi akan terbuka, tetapi Firefox akan tetap menampilkan ikon pemuatan (dan tampaknya akan memperbarui halaman ketika syslog memperbarui).
The bcathomepage 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-qt4binding 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 qwksisisingkatnya):
Pada dasarnya, dengan skrip yang diunduh (dan dependensi) Anda dapat alias di bashterminal seperti ini:
$ alias qwksisi="python /path/to/Qt4WebKit_singleinst_stdin.py"
... dan dalam satu terminal (setelah aliasing), qwksisiakan 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:
masalah instance tunggal (jadi jalankan skrip pertama menjadi "master" dan memunculkan jendela browser - sementara menjalankan selanjutnya hanya meneruskan data ke master dan keluar)
komunikasi antarproses untuk berbagi variabel (sehingga proses yang keluar dapat meneruskan data ke jendela browser utama)
Pembaruan timer di master yang memeriksa konten baru, dan memperbarui jendela browser jika konten baru tiba.
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.
#!/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.
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:
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.
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: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:
(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:
sumber
-new-instance
, jadi itu... | firefox -new-instance /dev/fd/0
.Anda dapat menggunakan URI data , seperti ini:
&0
adalah deskriptor file untuk stdin, sehingga menyandikan stdin kebase64
, lalu menginterpolasi itu ke dalam data URI.Trik yang sama juga berfungsi untuk browser lain:
Jika mau, Anda bisa meletakkan bagian kedua dalam skrip bash (saya akan menyebutnya
pipefox.sh
):Sekarang Anda bisa melakukannya:
sumber
Aku menemukan ini:
bcat - pipe to utility browser
... untuk menginstal di Ubuntu Natty, saya lakukan:
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
... Denganbcat
instalasi Anda juga dapat melakukan:... 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 memilikipython-qt4
binding yang terinstal dan WebKit (dan dependensi) pada Ubuntu saya. Jadi, saya mengumpulkan skrip Python / PyQt4 / QWebKit - yang bekerja sepertibcat
(tidak sukabtee
), tetapi dengan jendela browser sendiri - disebutQt4WebKit_singleinst_stdin.py
(atauqwksisi
singkatnya):Pada dasarnya, dengan skrip yang diunduh (dan dependensi) Anda dapat alias di
bash
terminal seperti ini:... 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:... 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.
sumber
Anda dapat menggunakan substitusi proses :
sumber
Lihat apa yang mencari 'browser stdin' muncul! , skrip shell kecil yang bagus:
Jika Anda menyimpan ini di
stdin2www
, membuatnya bisa dieksekusi (chmod +x stdin2www
), contoh Anda harus bekerja melaluicat 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.sumber
Saya menulis skrip python untuk menulis stdin ke file sementara dan kemudian membuka file sementara dengan Firefox.
sumber
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
atauimage/png
).sumber
ffpipe
Alias sederhana .Solusi data URI yang diberikan oleh bola salju dan luk3yx tidak berfungsi untuk saya di GNU / Linux.
Alias berikut harus berfungsi:
misalnya.
Keterbatasan
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 .sumber
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:
Kemudian Anda dapat mengarahkan input standar ke browser default:
Secara default server beroperasi pada port 8000, tetapi perilaku itu dapat diubah dengan argumen baris perintah:
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.
sumber