Eu tentei o seguinte comando depois de assistir a este vídeo sobre travessuras de tubos.
man -k . | dmenu -l 20 | awk '{print $1}' | xargs -r man -Tpdf | zathura -
Ele basicamente imprime uma lista de manpages no dmenu para o usuário selecionar um deles, então ele usa xargs para executar man -Tpdf %
(imprimir para stdout um pdf da manpage git da entrada do xargs) e passar o pdf para um leitor de pdf (zathura ).
O problema é que (como você pode ver no vídeo) o leitor de pdf inicia antes mesmo de eu selecionar uma página de manual no dmenu. E se eu clicar em Esc e não selecionar nenhum, o leitor de pdf ainda estará aberto, não mostrando nenhum documento.
Como posso fazer com que o leitor de pdf (e qualquer outro comando em uma cadeia de pipe) seja executado apenas quando sua entrada atingir um final de arquivo ou quando receber uma entrada? Ou, alternativamente, como posso fazer uma cadeia de pipe parar depois que um dos comandos encadeados retornar um status de saída diferente de zero (para que, se o dmenu retornar um erro por não selecionar uma opção, os comandos a seguir não sejam executados)?
Existe
ifne
(no Debian está nomoreutils
pacote):No seu caso:
Todos os comandos em um pipeline são iniciados praticamente ao mesmo tempo. É apenas a E/S sobre o tubo que os sincroniza. Além disso, um pipe só pode conter a quantidade de informações que o buffer do pipe permite.
Portanto, você não pode evitar a execução de um estágio de um pipeline, porque
Em vez disso, grave a saída em um arquivo enquanto deixa o pipeline terminar. Então use esse arquivo.
Exemplo (como uma função que recebe um argumento):
Além disso, isso não executaria o
zathura
programa se o pipeline falhar (axargs
parte retornou diferente de zero) ou o arquivo gerado estiver vazio.No
bash
shell, você também pode definir apipefail
opção de shellset -o pipefail
para que o pipeline retorne o status de saída do primeiro comando no pipeline que falha. E você gostaria de fazer atmpfile
variávellocal
:Isso define a
pipefail
opção para a duração da função, se ainda não estiver definida, e a desativa, se necessário. Ele se livra do-s
teste no arquivo de saída.Arquivos PDF devem ser pesquisáveis; qualquer visualizador de pdf terá que olhar primeiro para o trailer e de lá pular para os deslocamentos da tabela xref.
Como os pipes não são pesquisáveis,
zathura
está usando um truque de ofuscação, onde está copiando toda a entrada para um arquivo temporário e, em seguida, usa esse arquivo temporário normalmente. Esse tipo de truque "inteligente" está criando falsas esperanças e está levando as pessoas a supor que os arquivos pdf podem ser transmitidos.Mas de qualquer forma, realmente
zathura
espera o EOF antes de exibir o documento, você não precisa fazer nada para que isso aconteça:O problema é que
zathura
não tem opção de só abrir a janela se o arquivo estiver OK, e sair com erro se não for o caso -- ele vai ficar lá como se estivesse tudo OK:Portanto, mesmo que você esteja redirecionando a saída para um arquivo temporário e esteja executando apenas
zathura
se tudo estiver OK, não há garantia de que o usuário não será atendido com uma janela preta sezathura
não gostar da saída por um motivo ou outro .Por falar nisso,
exibirá uma página de manual em uma janela X11 com
gxditview
, mesmo que pareça diretamente do '70 ;-)E, claro, você sempre pode usar:
que, além de muitos outros aprimoramentos, permitirá o uso de expressões regulares em pesquisas e seleção de texto adequada.