como fazer o firefox ler stdin

28
echo '<h1>hello, world</h1>' |  firefox
cat index.html | firefox

Estes comandos não funcionam.
Se o firefox puder ler stdin, posso enviar o html para o firefox via pipe. É possível fazer o firefox ler stdin?

    
por kev 19.11.2011 / 07:31

8 respostas

22

A resposta curta é que é melhor escrever um arquivo temporário e abri-lo. Colocar os canos para funcionar corretamente é mais complicado e provavelmente não lhe dará nenhuma vantagem extra. Dito isso, aqui está o que eu encontrei.

Se o comando firefox estiver iniciando o Firefox em vez de falar com uma instância do Firefox já em execução, você pode fazer isso:

echo '<h1>hello, world</h1>' | firefox /dev/fd/0

Que informa ao Firefox explicitamente para ler sua entrada padrão, que é onde o pipe está colocando seus dados. Mas se o Firefox já estiver rodando, o comando firefox vai passar esse nome para o processo principal do Firefox, que lerá sua própria entrada padrão, que provavelmente não dará nada e certamente não está conectado ao seu pipe.

Além disso, ao ler de um pipe, o Firefox armazena bastante as coisas, então não atualizará a página toda vez que você der uma nova linha de HTML, se é isso que você está procurando. Tente fechar o Firefox e rodar:

cat | firefox /dev/fd/0

(N.B. você realmente precisa do cat aqui.) Cole algumas linhas longas em sua janela do shell repetidamente até que o Firefox decida atualizar a página, e você pode ver quantos dados são necessários. Agora, envie um sinal de fim de arquivo pressionando Ctrl + D em uma nova linha e observe o Firefox atualizar instantaneamente. Mas você não pode adicionar mais dados.

Então, o melhor é provavelmente:

echo '<h1>hello, world</h1>' >my_temporary_file; firefox my_temporary_file
    
por 19.11.2011 / 11:59
31

Você pode usar URIs de dados , desta forma:

echo '<h1>hello, world</h1>' |firefox "data:text/html;base64,$(base64 -w 0 <&0)"

&0 é o descritor de arquivo para stdin, portanto, ele codifica stdin para base64 e, em seguida, interpola isso no URI de dados.

O mesmo truque funciona para outros navegadores também:

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)"

Se quiser, você pode colocar a segunda parte em um script bash (eu chamarei pipefox.sh ):

#!/bin/bash
firefox "data:text/html;base64,$(base64 -w 0 <&0)"

Agora você pode fazer:

echo '<h1>hello, world</h1>' |pipefox.sh
    
por 15.08.2013 / 18:12
6

Você pode usar substituição de processos :

 firefox <( echo '<h1>hello, world</h1>' )

 firefox <( cat page_header.html contents.html footer.html )

 firefox  <( echo "<h1>Hello number "{1..23}"!</h1>" )
    
por 19.11.2011 / 14:11
5

Eu encontrei isto:

utilitário bcc-pipe to browser

... para instalar no Ubuntu Natty, eu fiz:

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

Eu achei que funciona com seu próprio navegador - mas a execução acima abriu uma nova guia em um Firefox já em execução, apontando para um endereço de host local http://127.0.0.1:53718/btest ... Com bcat instalação você também pode fazer:

tail -f /var/log/syslog | ruby -rubygems /var/lib/gems/1.8/gems/bcat-0.6.2/bin/btee

... uma aba será aberta novamente, mas o Firefox continuará mostrando o ícone de carregamento (e, aparentemente, atualizaria a página quando atualizações do syslog).

A página bcat também faz referência ao navegador uzbl , que aparentemente pode lidar com stdin - mas por seus próprios comandos (provavelmente olhe para isso mais, embora)

EDIT: Como eu precisava de algo assim mal (principalmente para ver tabelas HTML com dados gerados na hora (e meu Firefox está ficando muito lento para ser útil com bcat ), eu tentei com uma solução personalizada. use ReText , eu já tinha instalado python-qt4 e ligações do WebKit (e dependências) no meu Ubuntu. Script Python / PyQt4 / QWebKit - que funciona como bcat (não como btee ), mas com sua própria janela do navegador - chamada Qt4WebKit_singleinst_stdin.py (ou qwksisi para abreviar):

Basicamente, com o script baixado (e dependências), você pode aliasá-lo em um terminal bash como este:

$ alias qwksisi="python /path/to/Qt4WebKit_singleinst_stdin.py"

... e em um terminal (após o aliasing), qwksisi aumentará a janela do navegador mestre; enquanto em outro terminal (novamente após o aliasing), pode-se fazer o seguinte para obter dados stdin:

$ echo "<h1>Hello World</h1>" | qwksisi - 

... como mostrado abaixo:

Nãoseesqueçado-nofinalparasereferirastdin;casocontrário,umnomedearquivolocaltambémpodeserusadocomoúltimoargumento.

Basicamente,oproblemaaquiéresolver:

  • problemadeinstânciaúnica(assim,aprimeiraexecuçãodoscriptsetornaum"mestre" e gera uma janela do navegador - enquanto as execuções subseqüentes simplesmente passam os dados para o mestre e saem)
  • interprocessar a comunicação para compartilhar variáveis (para que os processos de saída possam passar dados para a janela do navegador mestre)
  • Atualização do timer no mestre que procura por novo conteúdo e atualiza a janela do navegador se o novo conteúdo chegar.

Como tal, o mesmo poderia ser implementado em, digamos, Perl com ligações Gtk e WebKit (ou outro componente do navegador). Pergunto-me, no entanto, se o framework XUL do Mozilla poderia ser usado para implementar a mesma funcionalidade - eu acho que nesse caso, seria possível trabalhar com o componente do navegador Firefox.

    
por 04.02.2013 / 07:52
3

Veja o que está procurando 'stdin do navegador' aparecendo!

#!/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

Se você salvar isso em stdin2www , torne-o executável ( chmod +x stdin2www ), seus exemplos devem funcionar via cat index.html | ./stdin2www . Apenas observe que links relativos , imagens, etc, falharão, pois a página que será aberta é algo /tmp/ ; mais trabalho seria necessário para corrigir isso.

    
por 19.11.2011 / 11:39
3

Eu escrevi um script python para escrever stdin em um arquivo temporário e depois abrir o arquivo temporário com o 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()
    
por 27.03.2013 / 23:55
0

Você pode executar o comando abaixo a partir de um script de shell / janela de terminal.

Antes de iniciar o Firefox (ou qualquer outro navegador), ele lerá o conteúdo a ser exibido na abertura.

Se não for HTML sendo enviado, altere a string text/html na URL abaixo para qualquer que seja o tipo de arquivo (por exemplo, text/plain ou image/png ).

firefox "data:text/html;base64,$(base64)"
    
por 15.06.2016 / 23:54
0

Um simples ffpipe alias.

As soluções URI de dados fornecidas pelo snowball e luk3yx não estão funcionando para mim no GNU / Linux.

O seguinte alias deve funcionar:

alias ffpipe='base64 -w0 <&0 | read -r x; firefox "data:text/html;base64,$x"'

por exemplo,

echo '<h1>hello, world</h1>' | ffpipe

Limitações

A página só será carregada quando o canal for fechado (ou seja, o fim do arquivo foi atingido).

Se a renderização incremental do conteúdo enviado for necessária, é melhor usar algo como o bcat utilitário.

    
por 19.11.2016 / 04:26

Tags