Te polecenia nie działają.
Jeśli firefox może odczytać standardowe wejście, mogę wysłać html do firefox poprzez potok.
Czy to możliwe, aby firefox odczytał standardowe wejście?
@pbm: Przydatne może być unikanie przechowywania danych tymczasowych ...
l0b0
Odpowiedzi:
23
Krótka odpowiedź brzmi: lepiej jest napisać plik tymczasowy i otworzyć go. Zapewnienie prawidłowego działania rur jest bardziej skomplikowane i prawdopodobnie nie zapewni żadnych dodatkowych korzyści. To powiedziawszy, oto co znalazłem.
Jeśli twoje firefoxpolecenie faktycznie uruchamia Firefoksa zamiast rozmawiać z już działającą instancją Firefoksa, możesz to zrobić:
echo '<h1>hello, world</h1>' | firefox /dev/fd/0
Co wyraźnie mówi Firefoksowi, aby przeczytał standardowe dane wejściowe, czyli miejsce, w którym potok umieszcza swoje dane. Ale jeśli Firefox już działa, firefoxpolecenie po prostu przekaże tę nazwę do głównego procesu Firefoksa, który odczyta własne standardowe dane wejściowe, które prawdopodobnie nic nie dadzą i na pewno nie będą podłączone do twojego potoku.
Co więcej, podczas czytania z potoku Firefox dość mocno buforuje rzeczy, więc nie będzie aktualizować strony za każdym razem, gdy dasz jej nową linię HTML, jeśli o to ci chodzi. Spróbuj zamknąć Firefoksa i uruchomić:
cat | firefox /dev/fd/0
(Uwaga: tak naprawdę potrzebujesz cattutaj.) Wklej kilka długich linii do okna powłoki, aż Firefox zdecyduje się zaktualizować stronę i zobaczysz, ile danych to zajmie. Teraz wyślij sygnał końca pliku, uderzając Ctrl+Dw nową linię, i natychmiast obejrzyj aktualizację Firefoksa. Ale wtedy nie możesz dodać więcej danych.
totalnie niesamowite! Jak do cholery to wymyśliłeś ?. Możesz poprawić zmianę nazwy pipefox.sh na pipebrowser za pomocą kontekstu: $ 1 "data: text / html; base64, $ (base64 -w 0 <& 0)" pozwalając wybrać przeglądarkę według własnych upodobań
Myślałem, że działa z własną przeglądarką - ale uruchomienie powyższej otworzyło nową kartę w już działającym Firefoksie, wskazując na adres localhost http://127.0.0.1:53718/btest... Dzięki bcatinstalacji możesz także:
... karta ponownie się otworzy, ale Firefox będzie nadal wyświetlał ikonę ładowania (i najwyraźniej zaktualizuje stronę po aktualizacji syslog).
Strona bcatgłówna odwołuje się również do przeglądarki uzbl , która najwyraźniej może obsługiwać standardowe wejście - ale w przypadku własnych poleceń (prawdopodobnie powinna się jednak bardziej temu zainteresować)
EDYCJA: Ponieważ bardzo potrzebowałem czegoś takiego (głównie do przeglądania tabel HTML z danymi generowanymi w locie (a mój Firefox robi się naprawdę powoli przydatny bcat), próbowałem z niestandardowym rozwiązaniem. Ponieważ używam ReText , już miałem zainstalowane python-qt4i powiązania WebKit (i zależności) na moim Ubuntu. Więc stworzyłem skrypt Python / PyQt4 / QWebKit - który działa jak bcat(nie jak btee), ale z własnym oknem przeglądarki - o nazwie Qt4WebKit_singleinst_stdin.py(lub qwksisiw skrócie):
Zasadniczo za pomocą pobranego skryptu (i zależności) można go aliasować w bashterminalu w następujący sposób:
$ alias qwksisi="python /path/to/Qt4WebKit_singleinst_stdin.py"
... i w jednym terminalu (po aliasingu) qwksisipodniesie okno głównej przeglądarki; w innym terminalu (ponownie po aliasingu) można wykonać następujące czynności, aby uzyskać dane standardowe:
$ echo "<h1>Hello World</h1>" | qwksisi -
... jak pokazano niżej:
Nie zapomnij -na końcu, aby odnosić się do stdin; w przeciwnym razie jako ostatni argument może być użyty lokalny plik.
Zasadniczo problemem jest tutaj rozwiązanie:
problem z pojedynczą instancją (więc pierwsze uruchomienie skryptu staje się „głównym” i podnosi okno przeglądarki - podczas gdy kolejne uruchomienia po prostu przekazują dane do głównego i kończą działanie)
komunikacja międzyprocesowa w celu współdzielenia zmiennych (dzięki czemu wychodzące procesy mogą przekazywać dane do głównego okna przeglądarki)
Aktualizacja timera w systemie głównym, który sprawdza nową zawartość, i aktualizuje okno przeglądarki, jeśli pojawi się nowa zawartość.
Jako taki, to samo można zaimplementować, powiedzmy, w Perlu z powiązaniami Gtk i WebKit (lub innym komponentem przeglądarki). Zastanawiam się jednak, czy platforma XUL firmy Mozilla mogłaby zostać wykorzystana do zaimplementowania tej samej funkcjonalności - wydaje mi się, że w takim przypadku można by pracować z komponentem przeglądarki 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
Jeśli zapiszesz to w stdin2www, uczyń go wykonywalnym ( chmod +x stdin2www), twoje przykłady powinny działać cat index.html | ./stdin2www. Pamiętaj tylko, że względne linki , obrazy itp. Przestaną działać, ponieważ strona, która zostanie otwarta, jest czymś /tmp/; potrzeba więcej pracy, aby to naprawić.
Chociaż to pytanie ma siedem lat, jestem zaskoczony, że nikt nie zaproponował rozwiązania obsługującego plik za pośrednictwem serwera WWW. Osiąga się to za pomocą następującego kompaktowego skryptu Python3. Zapisz go jako plik wykonywalny, powiedzmy, 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()
Następnie możesz przekierować standardowe dane wejściowe do domyślnej przeglądarki:
Domyślnie serwer działa na porcie 8000, ale to zachowanie można zmienić za pomocą argumentu wiersza poleceń:
./browser.py 9000 < website.html
Testowałem ten skrypt w systemie Linux. Powinien obsługiwać inne systemy UNIX, w tym MacOS, po wyjęciu z pudełka. Zasadniczo jest nawet przygotowany dla systemu Windows (nie mam go do testowania), ale może być konieczne zaimplementowanie funkcji limitu czasu w inny sposób.
Odpowiedzi:
Krótka odpowiedź brzmi: lepiej jest napisać plik tymczasowy i otworzyć go. Zapewnienie prawidłowego działania rur jest bardziej skomplikowane i prawdopodobnie nie zapewni żadnych dodatkowych korzyści. To powiedziawszy, oto co znalazłem.
Jeśli twoje
firefox
polecenie faktycznie uruchamia Firefoksa zamiast rozmawiać z już działającą instancją Firefoksa, możesz to zrobić:Co wyraźnie mówi Firefoksowi, aby przeczytał standardowe dane wejściowe, czyli miejsce, w którym potok umieszcza swoje dane. Ale jeśli Firefox już działa,
firefox
polecenie po prostu przekaże tę nazwę do głównego procesu Firefoksa, który odczyta własne standardowe dane wejściowe, które prawdopodobnie nic nie dadzą i na pewno nie będą podłączone do twojego potoku.Co więcej, podczas czytania z potoku Firefox dość mocno buforuje rzeczy, więc nie będzie aktualizować strony za każdym razem, gdy dasz jej nową linię HTML, jeśli o to ci chodzi. Spróbuj zamknąć Firefoksa i uruchomić:
(Uwaga: tak naprawdę potrzebujesz
cat
tutaj.) Wklej kilka długich linii do okna powłoki, aż Firefox zdecyduje się zaktualizować stronę i zobaczysz, ile danych to zajmie. Teraz wyślij sygnał końca pliku, uderzając Ctrl+Dw nową linię, i natychmiast obejrzyj aktualizację Firefoksa. Ale wtedy nie możesz dodać więcej danych.Więc najlepiej jest prawdopodobnie:
źródło
-new-instance
, więc tak się stanie... | firefox -new-instance /dev/fd/0
.Możesz użyć identyfikatorów URI danych , takich jak to:
&0
jest deskryptorem pliku dla stdin, więc koduje stdin nabase64
, a następnie interpoluje je do identyfikatora URI danych.Ta sama sztuczka działa również w przypadku innych przeglądarek:
Jeśli chcesz, możesz umieścić drugą część w skrypcie bash (nazywam to
pipefox.sh
):Teraz możesz zrobić:
źródło
Znalazłem to:
bcat - narzędzie do potoku do przeglądarki
... aby zainstalować na Ubuntu Natty, zrobiłem:
Myślałem, że działa z własną przeglądarką - ale uruchomienie powyższej otworzyło nową kartę w już działającym Firefoksie, wskazując na adres localhost
http://127.0.0.1:53718/btest
... Dziękibcat
instalacji możesz także:... karta ponownie się otworzy, ale Firefox będzie nadal wyświetlał ikonę ładowania (i najwyraźniej zaktualizuje stronę po aktualizacji syslog).
Strona
bcat
główna odwołuje się również do przeglądarki uzbl , która najwyraźniej może obsługiwać standardowe wejście - ale w przypadku własnych poleceń (prawdopodobnie powinna się jednak bardziej temu zainteresować)EDYCJA: Ponieważ bardzo potrzebowałem czegoś takiego (głównie do przeglądania tabel HTML z danymi generowanymi w locie (a mój Firefox robi się naprawdę powoli przydatny
bcat
), próbowałem z niestandardowym rozwiązaniem. Ponieważ używam ReText , już miałem zainstalowanepython-qt4
i powiązania WebKit (i zależności) na moim Ubuntu. Więc stworzyłem skrypt Python / PyQt4 / QWebKit - który działa jakbcat
(nie jakbtee
), ale z własnym oknem przeglądarki - o nazwieQt4WebKit_singleinst_stdin.py
(lubqwksisi
w skrócie):Zasadniczo za pomocą pobranego skryptu (i zależności) można go aliasować w
bash
terminalu w następujący sposób:... i w jednym terminalu (po aliasingu)
qwksisi
podniesie okno głównej przeglądarki; w innym terminalu (ponownie po aliasingu) można wykonać następujące czynności, aby uzyskać dane standardowe:... jak pokazano niżej:
Nie zapomnij
-
na końcu, aby odnosić się do stdin; w przeciwnym razie jako ostatni argument może być użyty lokalny plik.Zasadniczo problemem jest tutaj rozwiązanie:
Jako taki, to samo można zaimplementować, powiedzmy, w Perlu z powiązaniami Gtk i WebKit (lub innym komponentem przeglądarki). Zastanawiam się jednak, czy platforma XUL firmy Mozilla mogłaby zostać wykorzystana do zaimplementowania tej samej funkcjonalności - wydaje mi się, że w takim przypadku można by pracować z komponentem przeglądarki Firefox.
źródło
Możesz użyć podstawienia procesu :
źródło
Spójrz, co się pojawiło, szukając hasła „przeglądarka standardowa”! , ładny mały skrypt powłoki:
Jeśli zapiszesz to w
stdin2www
, uczyń go wykonywalnym (chmod +x stdin2www
), twoje przykłady powinny działaćcat index.html | ./stdin2www
. Pamiętaj tylko, że względne linki , obrazy itp. Przestaną działać, ponieważ strona, która zostanie otwarta, jest czymś/tmp/
; potrzeba więcej pracy, aby to naprawić.źródło
Napisałem skrypt Pythona, aby zapisać stdin do pliku tymczasowego, a następnie otworzyć plik tymczasowy w przeglądarce Firefox.
źródło
Możesz uruchomić poniższe polecenie z poziomu skryptu powłoki / okna terminala.
Przed uruchomieniem Firefoksa (lub dowolnej innej przeglądarki) odczyta zawartość ze standardowej zawartości do wyświetlenia po otwarciu.
Jeśli nie jest wysyłany HTML, zmień
text/html
ciąg w poniższym adresie URL na dowolny typ pliku (na przykładtext/plain
lubimage/png
).źródło
Prosty
ffpipe
alias.Rozwiązania URI danych podane przez snowball i luk3yx nie działają dla mnie w systemie GNU / Linux.
Powinien działać następujący alias:
na przykład.
Ograniczenia
Strona zostanie załadowana dopiero po zamknięciu potoku (tzn. Osiągnięto koniec pliku).
Jeśli wymagane jest renderowanie przyrostowe potokowej zawartości, lepiej użyć czegoś takiego jak wspomniane wcześniej
bcat
narzędzie.źródło
Chociaż to pytanie ma siedem lat, jestem zaskoczony, że nikt nie zaproponował rozwiązania obsługującego plik za pośrednictwem serwera WWW. Osiąga się to za pomocą następującego kompaktowego skryptu Python3. Zapisz go jako plik wykonywalny, powiedzmy, browse.py:
Następnie możesz przekierować standardowe dane wejściowe do domyślnej przeglądarki:
Domyślnie serwer działa na porcie 8000, ale to zachowanie można zmienić za pomocą argumentu wiersza poleceń:
Testowałem ten skrypt w systemie Linux. Powinien obsługiwać inne systemy UNIX, w tym MacOS, po wyjęciu z pudełka. Zasadniczo jest nawet przygotowany dla systemu Windows (nie mam go do testowania), ale może być konieczne zaimplementowanie funkcji limitu czasu w inny sposób.
źródło