Como executar o Chrome na linha de comando usando a substituição de processos?

Como executar o Chrome na linha de comando usando a substituição de processos?

Estou usando o seguinte comando sem sucesso -

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

Se eu simplesmente fizer um grep, recebo -

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

Também escrevi um script python chamado showFileContents.pypara 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á o resultado -

$ 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 pelo Chrome?

Responder1

Quando você executa o google-chrome, o processo detecta que há uma instância aberta do 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 no shell não é o processo do navegador já em execução.

A <(…)construção funciona criando um canal anônimo. É passado para o comando com um nome como /dev/fd/42, que significa “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, e 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 parece não conseguir ler um canal, então você precisa criar um arquivo temporário. Você também pode fazer isso no Firefox.

No zsh, a construção de substituição do 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"

Responder2

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

grep "simple" SimpleDoc.txt > delme.txt; google-chrome delme.txt

informação relacionada