echo '<h1>hello, world</h1>' | firefox
cat index.html | firefox
คำสั่งเหล่านี้ไม่ทำงาน
หาก firefox สามารถอ่าน stdin ได้ฉันสามารถส่ง html ไปยัง firefox ผ่านไพพ์ได้
เป็นไปได้หรือไม่ที่จะทำให้ firefox อ่าน stdin?
echo '<h1>hello, world</h1>' | firefox
cat index.html | firefox
คำสั่งเหล่านี้ไม่ทำงาน
หาก firefox สามารถอ่าน stdin ได้ฉันสามารถส่ง html ไปยัง firefox ผ่านไพพ์ได้
เป็นไปได้หรือไม่ที่จะทำให้ firefox อ่าน stdin?
คำตอบ:
คำตอบสั้น ๆ คือคุณควรเขียนไฟล์ชั่วคราวและเปิดไฟล์นั้นดีกว่า การใช้ท่อเพื่อทำงานอย่างถูกต้องมีความซับซ้อนมากขึ้นและอาจจะไม่ให้ประโยชน์เพิ่มเติมใด ๆ แก่คุณ ที่กล่าวว่านี่คือสิ่งที่ฉันได้พบ
หาก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 ตัดสินใจที่จะอัปเดตหน้าเว็บและคุณสามารถดูว่าต้องใช้ข้อมูลจำนวนเท่าใด ตอนนี้ส่งสัญญาณ End-Of-File โดยกด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)"
หากคุณต้องการคุณสามารถใส่ส่วนที่สองในสคริปต์ทุบตี (ฉันจะเรียกมันว่าpipefox.sh
):
#!/bin/bash
firefox "data:text/html;base64,$(base64 -w 0 <&0)"
ตอนนี้คุณสามารถทำได้:
echo '<h1>hello, world</h1>' |pipefox.sh
ฉันพบสิ่งนี้:
bcat - ไปยังโปรแกรมอรรถประโยชน์เบราว์เซอร์
... เพื่อติดตั้งบน 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 ที่ใช้งานอยู่ชี้ไปที่ที่อยู่ localhost 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
และการผูก WebKit (และการขึ้นต่อกัน) บน Ubuntu ของฉันดังนั้นฉันจึงรวบรวมสคริปต์ Python / PyQt4 / QWebKit - ซึ่งทำงานเหมือนbcat
(ไม่ชอบbtee
) แต่มีหน้าต่างเบราว์เซอร์ของตัวเอง - เรียกQt4WebKit_singleinst_stdin.py
(หรือqwksisi
สั้น ๆ ):
โดยพื้นฐานแล้วด้วยสคริปต์ที่ดาวน์โหลด (และการอ้างอิง) คุณสามารถใช้นามแฝงในbash
เทอร์มินัลดังนี้:
$ alias qwksisi="python /path/to/Qt4WebKit_singleinst_stdin.py"
... และในเทอร์มินัลเดียว (หลัง aliasing) qwksisi
จะเพิ่มหน้าต่างเบราว์เซอร์หลัก ขณะอยู่ในเทอร์มินัลอื่น (อีกครั้งหลังจากนามแฝง) เราสามารถทำสิ่งต่อไปนี้เพื่อรับข้อมูล stdin:
$ echo "<h1>Hello World</h1>" | qwksisi -
... ดังแสดงด้านล่าง:
อย่าลืม-
ที่จะอ้างอิงถึง stdin; มิฉะนั้นชื่อไฟล์ท้องถิ่นสามารถใช้เป็นอาร์กิวเมนต์สุดท้ายได้เช่นกัน
โดยทั่วไปปัญหาที่นี่คือการแก้ปัญหา:
เช่นเดียวกันสามารถนำมาใช้ในการพูด Perl กับ Gtk ผูกและ WebKit (หรือส่วนประกอบเบราว์เซอร์อื่น ๆ ) ฉันสงสัยว่าถ้าหากเฟรมเวิร์ก XUL ของ Mozilla สามารถใช้ในการใช้งานฟังก์ชั่นเดียวกันได้ - ฉันเดาว่าในกรณีนี้จะใช้กับเบราว์เซอร์ Firefox แทน
คุณสามารถใช้การทดแทนกระบวนการ :
firefox <( echo '<h1>hello, world</h1>' )
firefox <( cat page_header.html contents.html footer.html )
firefox <( echo "<h1>Hello number "{1..23}"!</h1>" )
ดูสิ่งที่ค้นหา 'เบราว์เซอร์ stdin' ปรากฏขึ้น! เป็นเชลล์สคริปต์ที่ดีเล็กน้อย:
#!/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/
; จำเป็นต้องใช้งานมากขึ้นเพื่อแก้ไขปัญหานี้
ฉันเขียนสคริปต์ไพ ธ อนเพื่อเขียน stdin ไปยังไฟล์ชั่วคราวจากนั้นเปิดไฟล์ชั่วคราวด้วย 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()
คุณสามารถเรียกใช้คำสั่งด้านล่างจากหน้าต่างเชลล์สคริปต์ / เทอร์มินัล
ก่อนที่จะเปิด Firefox (หรือเบราว์เซอร์อื่น ๆ ) มันจะอ่านจาก stdin เนื้อหาที่จะแสดงเมื่อเปิด
หากไม่มีการส่ง HTML ให้เปลี่ยนtext/html
สตริงใน URL ด้านล่างเป็นประเภทไฟล์ (เช่นtext/plain
หรือimage/png
)
firefox "data:text/html;base64,$(base64)"
ffpipe
นามแฝงง่ายๆโซลูชัน URI ข้อมูลที่ให้โดยก้อนหิมะและ luk3yx ไม่ทำงานสำหรับฉันบน GNU / Linux
นามแฝงต่อไปนี้ควรใช้งานได้:
alias ffpipe='base64 -w0 <&0 | read -r x; firefox "data:text/html;base64,$x"'
เช่น.
echo '<h1>hello, world</h1>' | ffpipe
หน้าจะโหลดก็ต่อเมื่อปิดท่อไปแล้ว (เช่นถึงจุดสิ้นสุดไฟล์แล้ว)
หากจำเป็นต้องมีการเรนเดอร์แบบเนื้อหาส่วนเพิ่มคุณควรใช้บางอย่างเช่นbcat
ยูทิลิตีที่กล่าวถึงก่อนหน้านี้
แม้ว่าคำถามนี้อายุเจ็ดปีฉันประหลาดใจที่ไม่มีใครเสนอวิธีแก้ปัญหาการให้บริการไฟล์ผ่านเว็บเซิร์ฟเวอร์ สามารถทำได้ด้วยสคริปต์ Python3 ขนาดกะทัดรัดต่อไปนี้ บันทึกเป็นไฟล์เรียกทำงานพูดท่องเว็บ:
#!/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 (ฉันไม่ได้มีหนึ่งสำหรับการทดสอบ) แต่อาจจำเป็นต้องใช้ฟังก์ชั่นการหมดเวลาที่แตกต่างกัน