echo '<h1>hello, world</h1>' | firefox
cat index.html | firefox
Các lệnh này không hoạt động.
Nếu firefox có thể đọc stdin, tôi có thể gửi html đến firefox qua đường ống.
Có thể làm cho firefox đọc stdin?
echo '<h1>hello, world</h1>' | firefox
cat index.html | firefox
Các lệnh này không hoạt động.
Nếu firefox có thể đọc stdin, tôi có thể gửi html đến firefox qua đường ống.
Có thể làm cho firefox đọc stdin?
Câu trả lời:
Câu trả lời ngắn gọn là, tốt hơn hết bạn nên viết một tập tin tạm thời và mở nó ra. Làm cho các đường ống hoạt động đúng là phức tạp hơn và có lẽ sẽ không cung cấp cho bạn bất kỳ lợi thế nào nữa. Điều đó nói rằng, đây là những gì tôi đã tìm thấy.
Nếu firefox
lệnh của bạn thực sự bắt đầu Firefox thay vì nói chuyện với một phiên bản Firefox đã chạy, bạn có thể thực hiện việc này:
echo '<h1>hello, world</h1>' | firefox /dev/fd/0
Điều này cho Firefox biết rõ ràng để đọc đầu vào tiêu chuẩn của nó, đó là nơi đường ống đưa dữ liệu của nó. Nhưng nếu Firefox đã chạy, firefox
lệnh sẽ chuyển tên đó sang quy trình Firefox chính, nó sẽ đọc đầu vào tiêu chuẩn của chính nó , có thể sẽ không cung cấp cho nó bất cứ điều gì và chắc chắn không được kết nối với đường ống của bạn.
Hơn nữa, khi đọc từ một đường ống, Firefox đệm rất nhiều thứ, vì vậy nó sẽ không cập nhật trang mỗi khi bạn cung cấp cho nó một dòng HTML mới, nếu đó là những gì bạn đang làm. Hãy thử đóng Firefox và chạy:
cat | firefox /dev/fd/0
(NB bạn thực sự cần cat
ở đây.) Dán một số dòng dài vào cửa sổ shell của bạn cho đến khi Firefox quyết định cập nhật trang và bạn có thể thấy nó mất bao nhiêu dữ liệu. Bây giờ hãy gửi tín hiệu End-Of-File bằng cách nhấn Ctrl+Dvào một dòng mới và xem cập nhật Firefox ngay lập tức. Nhưng sau đó bạn không thể thêm bất kỳ dữ liệu nào.
Vì vậy, tốt nhất có lẽ là:
echo '<h1>hello, world</h1>' >my_temporary_file; firefox my_temporary_file
-new-instance
, để nó trở thành ... | firefox -new-instance /dev/fd/0
.
Bạn có thể sử dụng URI dữ liệu , như thế này:
echo '<h1>hello, world</h1>' |firefox "data:text/html;base64,$(base64 -w 0 <&0)"
&0
là bộ mô tả tệp cho stdin, vì vậy nó mã hóa stdin thành base64
, sau đó nội suy nó vào URI dữ liệu.
Thủ thuật tương tự cũng hoạt động cho các trình duyệt khác:
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)"
Nếu bạn muốn, bạn có thể đặt phần thứ hai vào tập lệnh bash (tôi sẽ gọi nó pipefox.sh
):
#!/bin/bash
firefox "data:text/html;base64,$(base64 -w 0 <&0)"
Bây giờ bạn có thể làm:
echo '<h1>hello, world</h1>' |pipefox.sh
Tôi đã tìm thấy cái này:
bcat - đường dẫn đến tiện ích trình duyệt
... Để cài đặt trên Ubuntu Natty, tôi đã làm:
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
Tôi nghĩ rằng nó hoạt động với trình duyệt riêng của mình - nhưng việc chạy ở trên đã mở một tab mới trong Firefox đã chạy, chỉ vào một địa chỉ localhost http://127.0.0.1:53718/btest
... Với bcat
cài đặt, bạn cũng có thể làm:
tail -f /var/log/syslog | ruby -rubygems /var/lib/gems/1.8/gems/bcat-0.6.2/bin/btee
... Một tab sẽ mở lại, nhưng Firefox sẽ tiếp tục hiển thị biểu tượng tải (và dường như sẽ cập nhật trang khi cập nhật nhật ký hệ thống).
Các bcat
trang web cũng tham chiếu Uzbl trình duyệt, mà dường như có thể xử lý stdin - nhưng đối với các lệnh riêng của mình (có lẽ nên nhìn vào điều này hơn, mặc dù)
EDIT: Vì tôi rất cần một thứ như thế này (chủ yếu là để xem các bảng HTML với dữ liệu được tạo nhanh chóng (và Firefox của tôi đang trở nên rất hữu ích với bcat
), tôi đã thử với một giải pháp tùy chỉnh. Vì tôi đã sử dụng ReText , tôi đã có đã cài đặt python-qt4
và liên kết WebKit (và phụ thuộc) trên Ubuntu của tôi. Vì vậy, tôi kết hợp một tập lệnh Python / PyQt4 / QWebKit - hoạt động như bcat
(không thích btee
), nhưng với cửa sổ trình duyệt riêng - được gọi là Qt4WebKit_singleinst_stdin.py
(hoặc gọi tắt là qwksisi
):
Về cơ bản, với tập lệnh được tải xuống (và phụ thuộc), bạn có thể đặt bí danh cho nó trong một bash
thiết bị đầu cuối như thế này:
$ alias qwksisi="python /path/to/Qt4WebKit_singleinst_stdin.py"
... và trong một thiết bị đầu cuối (sau khi răng cưa), qwksisi
sẽ nâng cửa sổ trình duyệt chính; trong khi ở một thiết bị đầu cuối khác (một lần nữa sau khi răng cưa), người ta có thể làm như sau để có được dữ liệu stdin:
$ echo "<h1>Hello World</h1>" | qwksisi -
... như hình dưới đây:
Đừng quên -
cuối cùng để đề cập đến stdin; mặt khác, tên tệp cục bộ cũng có thể được sử dụng làm đối số cuối cùng.
Về cơ bản, vấn đề ở đây là giải quyết:
Như vậy, điều tương tự có thể được thực hiện trong, giả sử, Perl với các ràng buộc Gtk và WebKit (hoặc thành phần trình duyệt khác). Tuy nhiên, tôi tự hỏi, nếu khung XUL của Mozilla có thể được sử dụng để thực hiện chức năng tương tự - tôi đoán trong trường hợp đó, người ta sẽ làm việc với thành phần trình duyệt Firefox.
Bạn có thể sử dụng thay thế quá trình :
firefox <( echo '<h1>hello, world</h1>' )
firefox <( cat page_header.html contents.html footer.html )
firefox <( echo "<h1>Hello number "{1..23}"!</h1>" )
Hãy nhìn những gì đang tìm kiếm 'stdin' trình duyệt! , một kịch bản shell nhỏ đẹp:
#!/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
Nếu bạn lưu cái này vào stdin2www
, làm cho nó có thể thực thi được ( chmod +x stdin2www
), các ví dụ của bạn sẽ hoạt động thông qua cat index.html | ./stdin2www
. Chỉ cần lưu ý rằng các liên kết tương đối , hình ảnh, vv, sẽ thất bại vì trang sẽ được mở là một cái gì đó /tmp/
; cần nhiều công việc hơn để khắc phục điều này.
Tôi đã viết một kịch bản python để viết stdin vào một tệp tạm thời và sau đó mở tệp tạm thời bằng 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()
Bạn có thể chạy lệnh dưới đây từ cửa sổ shell / terminal.
Trước khi khởi chạy Firefox (hoặc bất kỳ trình duyệt nào khác), nó sẽ đọc từ nội dung đó để hiển thị khi mở.
Nếu nó không được gửi HTML, hãy thay đổi text/html
chuỗi trong URL bên dưới thành bất kỳ loại tệp nào (ví dụ: text/plain
hoặc image/png
).
firefox "data:text/html;base64,$(base64)"
ffpipe
bí danh đơn giản .Các giải pháp URI dữ liệu được cung cấp bởi snowball và luk3yx không hoạt động với tôi trên GNU / Linux.
Các bí danh sau sẽ hoạt động:
alias ffpipe='base64 -w0 <&0 | read -r x; firefox "data:text/html;base64,$x"'
ví dụ.
echo '<h1>hello, world</h1>' | ffpipe
Trang sẽ chỉ tải sau khi đường ống được đóng lại (tức là đã kết thúc tập tin).
Nếu việc hiển thị gia tăng nội dung được yêu cầu, bạn nên sử dụng một cái gì đó giống như bcat
tiện ích được đề cập trước đó .
Mặc dù câu hỏi này đã bảy tuổi nhưng tôi ngạc nhiên rằng không ai đề xuất giải pháp phục vụ tệp thông qua máy chủ web. Điều này đạt được với tập lệnh Python3 nhỏ gọn sau đây. Lưu nó dưới dạng một tập tin thực thi, giả sử, duyệt:
#!/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()
Sau đó, bạn có thể chuyển hướng đầu vào tiêu chuẩn sang trình duyệt mặc định:
./browser.py < somewebpage.html
echo "<html><body><h1>Hello</h1></body></html>" | browse.py
Theo mặc định, máy chủ hoạt động trên cổng 8000, nhưng hành vi đó có thể được thay đổi bằng đối số dòng lệnh:
./browser.py 9000 < website.html
Tôi đã thử nghiệm kịch bản này trên Linux. Nó sẽ xử lý các hệ thống UNIX khác bao gồm cả MacOS. Về nguyên tắc, nó thậm chí đã được chuẩn bị cho Windows (tôi không có bản nào để thử nghiệm), nhưng có thể cần phải thực hiện chức năng hết thời gian khác nhau.