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.