У меня есть функция Bash для отображения man-страниц, отображаемых в виде postscript, в PDF:
function psman () {
man -t "$@" | ps2pdf - /tmp/manpage.pdf
evince /tmp/manpage.pdf
}
(Обновление: я избавился от периферийных сложностей, таких как динамическая генерация имени временного файла и использование nohup)
Это отлично работает. Для скриншота его использования, смотрите https://www.tartley.com/postscript-formatted-man-pages.
Для собственного назидания я попытался реализовать его без использования временных файлов. Например, используя процесс подстановки:
$ evince <(man -t ls | ps2pdf - -)
Это не работает Evince отображает ошибку в своем графическом интерфейсе:
Unable to open document "file:///dev/fd/63".
PDF document is damaged
Зачем? Как я могу генерировать и просматривать PDF без генерации промежуточных файлов?
Приведенное выше сообщение об ошибке отличается от сообщений, отображаемых для отсутствующих или пустых файлов, поэтому дело не только в этом.
Обновление: чтобы получить больше информации, я попытался заменить 'evince' на 'ls':
$ ls -l <(man -t ls | ps2pdf - -)
lr-x------. 1 jhartley jhartley 64 Aug 23 08:59 /dev/fd/63 -> pipe:[196475]
где дирколор красит:
/dev/fd/63
как ORPHAN (символическая ссылка, указывающая на несуществующий файл), иpipe:[196475]
как «MISSING» (несуществующий файл, на который указывает символическая ссылка)
Так может быть, evince просто дается ссылка, указывающая на файл, который не существует? Чтобы имитировать это, я создал символическую ссылку, которая указывает на несуществующий файл, а затем открыл его с помощью команды «evince». Но вместо сообщения «PDF поврежден», приведенного выше, появляется сообщение «Нет такого файла или каталога».
Обновление: я думаю, что типы файлов ORPHAN/MISSING - красная сельдь. Я вижу ту же символическую ссылку ORPHAN/MISSING, когда делаю очень простую подстановку процесса:
$ ls -l <( echo 123 )
и использование того же конвейера man|ps2pdt
работает нормально, когда подстановка процесса подается в diff
:
$ diff <(man -t ls | ps2pdf - - | tr "\0" "0") <(man -t ls | ps2pdf - - | tr "\0" "0")
248c248
< /ID [<95A81B38FAE8E6FE3C899586A1DEE861><95A81B38FAE8E6FE3C899586A1DEE861>]
---
> /ID [<2F9164BD9265C8540A4A8E7068076344><2F9164BD9265C8540A4A8E7068076344>]
(Здесь я добавил 'tr' в конвейеры, чтобы исключить ноль / ноль символов в выводе pdf, чтобы diff воспринимал файлы как текстовые, а не двоичные.)
Итак, в общем, я понятия не имею, почему я получаю ошибку "PDF поврежден" выше. Моя цель, помимо понимания, заключается в том, чтобы просмотреть сгенерированный PDF, не создавая при этом никаких файлов.