echo '<h1>hello, world</h1>' | firefox
cat index.html | firefox
এই আদেশগুলি কাজ করে না।
যদি ফায়ারফক্স স্টিডিন পড়তে পারে তবে আমি পাইপের মাধ্যমে এইচটিএমএল ফায়ার ফক্সে প্রেরণ করতে পারি।
ফায়ারফক্সকে স্টিডিন পড়া কি সম্ভব?
echo '<h1>hello, world</h1>' | firefox
cat index.html | firefox
এই আদেশগুলি কাজ করে না।
যদি ফায়ারফক্স স্টিডিন পড়তে পারে তবে আমি পাইপের মাধ্যমে এইচটিএমএল ফায়ার ফক্সে প্রেরণ করতে পারি।
ফায়ারফক্সকে স্টিডিন পড়া কি সম্ভব?
উত্তর:
সংক্ষিপ্ত উত্তরটি হ'ল, আপনি একটি অস্থায়ী ফাইল লিখে এবং এটি খোলার চেয়ে ভাল। সঠিকভাবে কাজ করার জন্য পাইপ পাওয়া আরও জটিল এবং সম্ভবত আপনাকে কোনও বাড়তি সুবিধা দেয় না। বলেছিল, আমি যা পেয়েছি তা এখানে।
যদি আপনার 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
আমি এটি খুঁজে পেয়েছি:
বিসিএটি - ব্রাউজার ইউটিলিটি থেকে পাইপ
... উবুন্টু নাট্টিতে ইনস্টল করতে, আমি করেছি:
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 সব ব্যবস্থা করতে সক্ষম - কিন্তু তার নিজস্ব কমান্ডের জন্য (সম্ভবত এই মধ্যে আরো, যদিও হওয়া উচিত)
সম্পাদনা: আমার যেমন খারাপভাবে কিছু প্রয়োজন ছিল (বেশিরভাগ ফ্লাইয়ের উপরে উত্পন্ন ডেটা সহ এইচটিএমএল টেবিলগুলি দেখতে (এবং আমার ফায়ারফক্সটি কার্যকর হতে ধীর হয়ে আসছে bcat), তাই আমি একটি কাস্টম সমাধান দিয়ে চেষ্টা করেছি Since যেহেতু আমি রিটেক্সট ব্যবহার করি , আমার ইতিমধ্যে ছিল python-qt4আমার উবুন্টুতে ইনস্টল করা এবং ওয়েবকিট বাইন্ডিংগুলি (এবং নির্ভরতা) তাই আমি একটি পাইথন / পাইকিউটি 4 / কিউ ওয়েবকিট স্ক্রিপ্ট একসাথে রেখেছি - এটি 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 বাইন্ডিং এবং ওয়েবকিট (বা অন্যান্য ব্রাউজার উপাদান) সহ পার্ল প্রয়োগ করা যেতে পারে। আমি অবাক হই, যদিও, যদি মোজিলার 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()
আপনি শেল স্ক্রিপ্ট / টার্মিনাল উইন্ডো থেকে নীচের কমান্ডটি চালাতে পারেন।
ফায়ারফক্স (বা অন্য কোনও ব্রাউজার) প্রবর্তন করার আগে, এটি খোলার পরে প্রদর্শিত স্টাডেন্টটি পড়তে হবে।
যদি এটি এইচটিএমএল প্রেরণ না করা text/htmlহয় তবে নীচের ইউআরএলটিতে স্ট্রিংটি ফাইলের ধরণের যাই হোক না কেন (উদাহরণস্বরূপ text/plainবা image/png)।
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
আমি এই স্ক্রিপ্টটি লিনাক্সে পরীক্ষা করেছি। এটি বাকী বাইরে ম্যাকোস সহ অন্যান্য ইউনিক্স সিস্টেম পরিচালনা করতে হবে handle এটি নীতিগতভাবে এমনকি উইন্ডোজের জন্যও প্রস্তুত (আমার কাছে পরীক্ষার জন্য একটি নেই) তবে সেখানে টাইমআউট কার্যকারিতা আলাদাভাবে প্রয়োগ করার প্রয়োজন হতে পারে।