Onde o pipe envia sua saída?

0

Meu entendimento é que pipe em, por exemplo,

command1 | command2 

envia a saída do command1 para command2 . No entanto, eu esperava que isso funcionasse:

echo "tmp.pdf" | evince 

Mas isso não acontece. Onde a saída de echo "tmp.pdf" está sendo enviada?

    
por JeffDror 29.06.2015 / 15:29

3 respostas

5

Um canal envia sua saída para o programa que o abre para leitura. Em um pipeline de shell, esse é o programa no lado direito do símbolo de pipe, ou seja, evince em seu exemplo.

Você está enviando o nome do arquivo tmp.pdf para evidenciar sua entrada padrão. No entanto, o evince não se importa com sua entrada padrão. Como todo programa que age em um arquivo, ele espera que o nome do arquivo seja passado como um argumento de linha de comando; se você não passar um nome de arquivo na linha de comando, ele se oferece para abrir um arquivo. Argumentos de linha de comando não são a mesma coisa que a entrada padrão. Os seres humanos têm diferentes órgãos de entrada que introduzem coisas diferentes (por exemplo, você não pode comer pelo nariz) e, da mesma forma, os programas têm maneiras diferentes de receber informações que servem a propósitos diferentes.

Evince pode ler um arquivo (não um nome de arquivo) na entrada padrão: evince /dev/stdin <"tmp.pdf" . (Isso pode não funcionar em todas as variantes do Unix.) O nome do arquivo /dev/stdin significa “qualquer arquivo que você já tenha aberto em sua entrada padrão”. Os programas destinados à linha de comando geralmente lêem suas entradas padrão quando não recebem um nome de arquivo, mas os programas de GUI normalmente não recebem. O Evince só pode abrir um arquivo regular dessa maneira, não os dados de um canal (por exemplo, cat tmp.pdf | evince /dev/stdin não funciona), porque ele precisa ser capaz de procurar e voltar no arquivo ao navegar entre as páginas.

    
por 30.06.2015 / 01:49
6

Seu entendimento está correto. A seqüência command1 | command2 está enviando a saída (STDOUT) de command1 para a entrada (STDIN) de command2 . A razão pela qual o comando evince não funcionou é que evince não aceita um nome de arquivo no STDIN.

    
por 29.06.2015 / 15:31
0

Você pode passar este problema da seguinte forma, como eu recentemente percebi sozinho. Primeiro use o comando locate para encontrar o caminho do arquivo que você deseja abrir em evince.Em seguida, passe este resultado como argumento em evince.Nós vamos dizer que seu nome de arquivo é abc_xyz.pdf e você deseja abri-lo. Então você pode fazer %código%. Por gentileza, observe que, caso o nome do seu arquivo PDF contenha espaços, será necessário fazer um duplo citação do evince "$(sudo locate xyz | grep abc)" A razão pela qual estou usando outro código (canalizado com $(sudo locate xyz | grep abc) ), por exemplo, sudo locate xyz , é filtrar ainda mais o resultado. Mas aqui está um problema, ou seja, você precisa atualizar constantemente o site emitindo grep abc . Vamos dizer que você mudou a localização do seu pdf para algum novo diretório, em seguida, localizar não será capaz de encontrar itz novo local como itz base de dados não foi atualizado. Mas você pode usar o comando "find" com a condição "e" para fazer seu trabalho enquanto ele procura em tempo real. Por exemplo, você pode fazer -

evince "$(find ~/ -iname "*abc*" -a -iname "*xyz*" -type f)"

e passe isso como um argumento para evince.here argumento sudo updatedb é para busca insensível a maiúsculas e -iname is e condição. -a só retornará arquivos.

    
por 16.12.2016 / 11:52

Tags