echo '<h1>hello, world</h1>' | firefox
cat index.html | firefox
ये आदेश काम नहीं करते।
अगर फ़ायरफ़ॉक्स स्टडिन पढ़ सकता है, तो मैं पाइप के माध्यम से फ़ायरफ़ॉक्स को html भेज सकता हूं।
क्या फायरफॉक्स रीड स्टैडिन बनाना संभव है?
echo '<h1>hello, world</h1>' | firefox
cat index.html | firefox
ये आदेश काम नहीं करते।
अगर फ़ायरफ़ॉक्स स्टडिन पढ़ सकता है, तो मैं पाइप के माध्यम से फ़ायरफ़ॉक्स को html भेज सकता हूं।
क्या फायरफॉक्स रीड स्टैडिन बनाना संभव है?
जवाबों:
संक्षिप्त उत्तर है, आप एक अस्थायी फ़ाइल लिखने और उसे खोलने से बेहतर हैं। ठीक से काम करने के लिए पाइप प्राप्त करना अधिक जटिल है और शायद आपको कोई अतिरिक्त लाभ नहीं देगा। उस ने कहा, यहाँ जो मैंने पाया है।
यदि आपका firefox
आदेश वास्तव में पहले से चल रहे फ़ायरफ़ॉक्स उदाहरण के साथ बात करने के बजाय फ़ायरफ़ॉक्स शुरू कर रहा है, तो आप यह कर सकते हैं:
echo '<h1>hello, world</h1>' | firefox /dev/fd/0
जो अपने मानक इनपुट को पढ़ने के लिए फ़ायरफ़ॉक्स को स्पष्ट रूप से बताता है, जो कि जहां पाइप अपना डेटा डाल रहा है। लेकिन अगर फ़ायरफ़ॉक्स पहले से ही चल रहा है, तो firefox
कमांड केवल उस नाम को मुख्य फ़ायरफ़ॉक्स प्रक्रिया में पारित करने जा रहा है, जो अपने स्वयं के मानक इनपुट को पढ़ेगा , जो शायद इसे कुछ भी नहीं देगा और निश्चित रूप से आपके पाइप से जुड़ा नहीं है।
इसके अलावा, जब एक पाइप से पढ़ते हैं, तो फ़ायरफ़ॉक्स बहुत अधिक चीजों को बफ़र करता है, इसलिए हर बार जब आप इसे HTML की एक नई लाइन देते हैं, तो यह पृष्ठ को अपडेट करने वाला नहीं है, यदि आप इसके लिए जा रहे हैं। फ़ायरफ़ॉक्स बंद करने और चलाने का प्रयास करें:
cat | firefox /dev/fd/0
(एनबी आपको वास्तव में cat
यहां की आवश्यकता है।) फ़ायरफ़ॉक्स पेज को अपडेट करने का निर्णय लेने तक अपनी शेल विंडो में बार-बार कुछ लंबी लाइनें पेस्ट करें, और आप देख सकते हैं कि इसमें कितना डेटा लगता है। अब Ctrl+Dएक नई लाइन पर हिट करके एंड-द-फ़ाइल सिग्नल भेजें , और तुरंत फ़ायरफ़ॉक्स अपडेट देखें। लेकिन फिर आप कोई और डेटा नहीं जोड़ सकते।
तो सबसे अच्छा शायद है:
echo '<h1>hello, world</h1>' >my_temporary_file; firefox my_temporary_file
-new-instance
, इसलिए यह बन जाता है ... | firefox -new-instance /dev/fd/0
।
आप डेटा यूआरआई का उपयोग कर सकते हैं , जैसे:
echo '<h1>hello, world</h1>' |firefox "data:text/html;base64,$(base64 -w 0 <&0)"
&0
स्टड के लिए फ़ाइल डिस्क्रिप्टर है, इसलिए यह स्टड को एनकोड करता है base64
, फिर डेटा यूआरआई में इंटरपोल करता है।
अन्य ब्राउज़र के लिए भी यही चाल काम करती है:
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 - ब्राउज़र उपयोगिता के लिए पाइप
... उबंटू नेट्टी पर स्थापित करने के लिए, मैंने किया:
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
मैंने सोचा कि यह अपने स्वयं के ब्राउज़र के साथ काम करता है - लेकिन ऊपर चल रहे फ़ायरफ़ॉक्स ने एक पहले से चल रहे फ़ायरफ़ॉक्स में एक नया टैब खोला, एक स्थानीयहोस्ट पते पर इंगित किया 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
... एक टैब फिर से खुलेगा, लेकिन फ़ायरफ़ॉक्स लोडिंग आइकन दिखाता रहेगा (और जाहिरा तौर पर पेज को अपडेट करते समय अपडेट करेगा)।
bcat
होमपेज पर भी संदर्भ देता uzbl ब्राउज़र है, जो जाहिरा तौर पर stdin संभाल कर सकते हैं - लेकिन अपने स्वयं के आदेश के लिए (शायद इस में और अधिक है, हालांकि देखना चाहिए)
संपादित करें: जैसा कि मुझे कुछ इस तरह की जरूरत थी (ज्यादातर HTML तालिकाओं को देखने के लिए जिसमें मक्खी पर उत्पन्न डेटा के साथ HTML (और मेरा फ़ायरफ़ॉक्स वास्तव में धीमी गति से उपयोगी हो bcat
रहा है), मैंने एक कस्टम समाधान के साथ प्रयास किया। चूंकि मैं ReText का उपयोग करता हूं, मैं पहले से ही था। python-qt4
मेरे Ubuntu पर स्थापित और WebKit बाइंडिंग (और निर्भरताएं)। इसलिए, मैंने एक Python / PyQt4 / QWebKit स्क्रिप्ट को एक साथ रखा - जो काम करती है bcat
(जैसे नहीं btee
), लेकिन अपनी ब्राउज़र विंडो के साथ - Qt4WebKit_singleinst_stdin.py
(या qwksisi
संक्षेप में):
मूल रूप से, डाउनलोड की गई स्क्रिप्ट (और निर्भरता) के साथ आप इसे bash
इस तरह से एक टर्मिनल में दे सकते हैं :
$ alias qwksisi="python /path/to/Qt4WebKit_singleinst_stdin.py"
... और एक टर्मिनल (अलियासिंग के बाद), qwksisi
मास्टर ब्राउज़र विंडो बढ़ाएगा; जबकि दूसरे टर्मिनल में (फिर से एलियासिंग के बाद), व्यक्ति स्टड डेटा प्राप्त करने के लिए निम्न कार्य कर सकता है:
$ echo "<h1>Hello World</h1>" | qwksisi -
... जैसा की नीचे दिखाया गया:
-
स्टड को संदर्भित करने के लिए अंत में मत भूलना ; अन्यथा स्थानीय फ़ाइल नाम का उपयोग अंतिम तर्क के रूप में भी किया जा सकता है।
मूल रूप से, यहाँ समस्या को हल करना है:
जैसे, समान को Gtk बाइंडिंग और WebKit (या अन्य ब्राउज़र घटक) के साथ पर्ल, में लागू किया जा सकता है। मुझे आश्चर्य है, हालांकि, अगर मोज़िला द्वारा XUL फ्रेमवर्क का उपयोग एक ही कार्यक्षमता को लागू करने के लिए किया जा सकता है - मुझे लगता है कि उस मामले में, एक फ़ायरफ़ॉक्स ब्राउज़र घटक के साथ काम करेगा।
आप प्रक्रिया प्रतिस्थापन का उपयोग कर सकते हैं :
firefox <( echo '<h1>hello, world</h1>' )
firefox <( cat page_header.html contents.html footer.html )
firefox <( echo "<h1>Hello number "{1..23}"!</h1>" )
देखो क्या 'ब्राउज़र स्टडिन' के लिए खोज कर दिया! , एक अच्छा सा खोल स्क्रिप्ट:
#!/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/
; इसे ठीक करने के लिए और अधिक कार्य की आवश्यकता होगी।
मैंने एक अस्थायी फ़ाइल पर स्टड लिखने के लिए एक पायथन स्क्रिप्ट लिखी और फिर फ़ायरफ़ॉक्स के साथ अस्थायी फ़ाइल खोलें।
#!/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()
आप शेल स्क्रिप्ट / टर्मिनल विंडो से नीचे कमांड चला सकते हैं।
फ़ायरफ़ॉक्स (या किसी भी अन्य ब्राउज़र) को लॉन्च करने से पहले, यह खोलने पर प्रदर्शित करने के लिए सामग्री स्टड है।
यदि यह HTML नहीं भेजा जा रहा है, text/html
तो फ़ाइल के प्रकार (उदाहरण के लिए, text/plain
या image/png
) के लिए नीचे दिए गए URL में स्ट्रिंग बदलें ।
firefox "data:text/html;base64,$(base64)"
ffpipe
उपनाम।स्नोबॉल और luk3yx द्वारा दिए गए डेटा यूआरआई समाधान जीएनयू / लिनक्स पर मेरे लिए काम नहीं कर रहे हैं।
निम्नलिखित उपनाम काम करना चाहिए:
alias ffpipe='base64 -w0 <&0 | read -r x; firefox "data:text/html;base64,$x"'
जैसे।
echo '<h1>hello, world</h1>' | ffpipe
एक बार पाइप बंद होने के बाद ही पेज लोड होगा (यानी एंड-ऑफ-फ़ाइल पहुँच गया है)।
यदि पाइप की गई सामग्री के वृद्धिशील प्रतिपादन की आवश्यकता होती है, तो आप पहले से बताई गई bcat
उपयोगिता जैसी किसी चीज़ का उपयोग करना बेहतर समझते हैं।
हालांकि यह सवाल सात साल पुराना है लेकिन मुझे आश्चर्य है कि किसी ने भी वेब सर्वर के माध्यम से फाइल परोसने वाले समाधान का प्रस्ताव नहीं दिया। यह निम्नलिखित कॉम्पैक्ट पायथन 3 स्क्रिप्ट के साथ हासिल किया गया है। इसे निष्पादन योग्य फ़ाइल के रूप में सहेजें, कहते हैं, ब्राउज़ करें:
#!/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
मैंने लिनक्स पर इस स्क्रिप्ट का परीक्षण किया। इसे मैकओएस सहित अन्य यूनिक्स प्रणालियों को संभालना चाहिए। यह सिद्धांत रूप में विंडोज के लिए भी तैयार है (मेरे पास परीक्षण के लिए एक नहीं है), लेकिन टाइमआउट कार्यक्षमता को अलग तरीके से लागू करने के लिए आवश्यक हो सकता है।