Faça cat interpretar a entrada como arquivo (não string)

Faça cat interpretar a entrada como arquivo (não string)

cattem dois comportamentos diferentes dependendo se sua entrada é uma string de arquivo. Preciso usar catpara canalizar um arquivo para meu visualizador de PDF (Zathura). O nome do arquivo é baseado em uma string modificada com sedo seguinte:

cat <(echo test.tex | sed 's/[^.]*$/pdf/') | zathura -

Eu quero que este liner converta uma string de nome de arquivo test.texe test.pdfcanalize-a para Zathura para abrir o arquivo correspondente. A linha de comando acima não está funcionando porque a catentrada é interpretada como uma string e não como um arquivo.

Obviamente,

echo test.tex | sed 's/[^.]*$/pdf/') | zathura

não está funcionando, é por isso que tento mexer com cat.

Responder1

Você não quer dizer:

cat $(echo test.tex | sed 's/[^.]*$/pdf/') | zathura -

Para que o resultado do seu sedseja um argumento cate não o seu stdin.

Você também pode usar:

cat $(basename $file .tex).pdf | zathura -

ou

cat ${file%.*}.pdf | zathura -

Responder2

Não recomendo abrir um arquivo STDINcom um visualizador de documentos que ofereça recursos como atualização automática de documentos ou SyncTeX. Isso quebra o vínculo entre o arquivo original e o software, pois o arquivo aberto será uma cópia do arquivo original. O arquivo exibido será algo como /tmp/zathura.stdin. Isso pode levar a problemas de segurança e quando o arquivo fonte LaTeX for recompilado, a exibição no software não será atualizada.

Então, por que se preocupar catquando você pode simplesmente passar o nome do arquivo como argumento da seguinte maneira:

zathura $(basename file.tex .tex).pdf

ou usandosed

zathura $(echo file.tex | sed 's/[^.]*$/pdf/')

informação relacionada