Como executar o cromo a partir da linha de comando usando a substituição de processo?

2

Estou usando o seguinte comando sem sucesso -

$ google-chrome <(grep "simple" SimpleDoc.txt)

Se eu simplesmente fizer um grep , obtenho -

$ grep "simple" SimpleDoc.txt
Very simple doc that contains plaintext. 

Eu também escrevi um script python chamado showFileContents.py para testar a substituição do processo e funciona -

#! /usr/bin/python

import sys

arg1 = sys.argv[1]
f = open(arg1)
line = f.readline()

while line:
    sys.stdout.write(line)
    line = f.readline()

f.close()

Aqui está a saída -

$ showFileContents.py <(grep "simple" SimpleDoc.txt)
Very simple doc that contains plaintext.

Mas quando tento fazer o mesmo com

$ google-chrome <(grep "simple" SimpleDoc.txt)

a janela do navegador não mostra nada. Com o Firefox, recebo um erro dizendo que "o Firefox não consegue encontrar o arquivo".

Por que isso está acontecendo e como posso usar a substituição de processos com o Chrome?

    
por CodeBlue 24.07.2013 / 20:50

2 respostas

5

Quando você executa google-chrome , o processo detecta que há uma instância aberta do Google Chrome e envia uma mensagem para abrir o arquivo. A mensagem contém o nome do arquivo. O Firefox funciona da mesma maneira. O processo iniciado a partir do shell não é o processo do navegador já em execução.

A construção <(…) funciona criando um canal anônimo. Ele é passado para o comando com um nome como /dev/fd/42 , significando “o arquivo que já está aberto no descritor 42”. Este arquivo só pode ser acessado por um processo que foi iniciado para executar sua linha de comando, não pelo processo do navegador já em execução.

Para passar os dados para o processo do navegador em execução, os dados devem estar em um arquivo, com um nome que ambos os processos possam acessar. Com o Firefox, você pode usar um pipe nomeado:

mkfifo f
grep "simple" SimpleDoc.txt >f &
firefox f
rm f

O Chrome não parece conseguir ler de um canal, por isso você precisa criar um arquivo temporário. Você também pode fazer isso para o Firefox.

Em zsh, o constructo de substituição de processo variante =() cria um arquivo temporário.

google-chrome =(grep "simple" SimpleDoc.txt)

No bash, você precisa criar um arquivo temporário manualmente.

tmp=$(mktemp)
grep "simple" SimpleDoc.txt >$tmp
google-chrome "$tmp"
rm "$tmp"
    
por 25.07.2013 / 03:03
1

Bem, você sempre tem a opção de:

grep "simple" SimpleDoc.txt > delme.txt; google-chrome delme.txt
    
por 24.07.2013 / 21:30