Заставить cat интерпретировать входные данные как файл (а не как строку)

Заставить cat интерпретировать входные данные как файл (а не как строку)

catимеет два разных поведения в зависимости от того, является ли его вход строкой файла. Мне нужно использовать catдля передачи файла в мой просмотрщик PDF (Zathura). Имя файла основано на измененной строке следующим sedобразом:

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

Я хочу, чтобы эта строка преобразовала строку имени файла test.texи test.pdfпередала ее в Zathura для открытия соответствующего файла. Приведенная выше командная строка не работает, поскольку catввод интерпретируется как строка, а не как файл.

Очевидно,

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

не работает, поэтому я пытаюсь поиграться с cat.

решение1

Вы не имеете в виду:

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

Таким образом, результатом вашего ввода sedявляется аргумент, catа не его стандартный ввод.

Вы также можете использовать:

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

или

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

решение2

Я не рекомендую открывать файл с STDINпомощью просмотрщика документов, который предлагает такие функции, как автоматическое обновление документов или SyncTeX. Это нарушает связь между исходным файлом и программным обеспечением, поскольку открытый файл будет копией исходного файла. Отображаемый файл на самом деле будет чем-то вроде /tmp/zathura.stdin. Это может привести к проблемам безопасности, и когда исходный файл LaTeX будет перекомпилирован, отображение в программном обеспечении не будет обновлено.

Так зачем же беспокоиться, catесли можно просто передать имя файла в качестве аргумента следующим образом:

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

или используяsed

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

Связанный контент