Tengo una función Bash para mostrar las páginas de manual representadas como postscript, en un PDF:
function psman () {
man -t "$@" | ps2pdf - /tmp/manpage.pdf
evince /tmp/manpage.pdf
}
( Actualizar : Eliminé las complicaciones periféricas como generar dinámicamente el nombre del archivo temporal y usar 'nohup')
Esto funciona bien. Para una captura de pantalla en uso, vea https://www.tartley.com/postscript-formatted-man-pages .
Para mi propia edificación, traté de implementarla sin usar archivos temporales. Por ejemplo, utilizando la sustitución de procesos:
$ evince <(man -t ls | ps2pdf - -)
Esto no funciona. Evince muestra un error en su GUI:
Unable to open document "file:///dev/fd/63".
PDF document is damaged
¿Por qué? ¿Cómo puedo generar y ver el PDF sin generar ningún archivo intermedio?
El mensaje de error anterior es diferente de lo que muestran los mensajes de los archivos faltantes o vacíos, así que no es simplemente eso.
Actualizar: Para obtener más información, intenté reemplazar 'evince' con 'ls':
$ ls -l <(man -t ls | ps2pdf - -)
lr-x------. 1 jhartley jhartley 64 Aug 23 08:59 /dev/fd/63 -> pipe:[196475]
donde dircolors es colorante:
/dev/fd/63como 'ORPHAN' (un enlace simbólico que apunta a un archivo inexistente), ypipe:[196475]como 'MISSING' (un archivo inexistente apuntado por un enlace simbólico)
Entonces, ¿quizás a Evince se le está dando un enlace que apunta a un archivo que no existe? Para imitar esto, creé un enlace simbólico que apunta a un archivo inexistente, luego lo abrí con 'evince'. Pero en lugar del mensaje "El PDF está dañado" más arriba, esto me da "No existe tal archivo o directorio".
Actualizar: Creo que los tipos de archivo ORPHAN / MISSING son una pista falsa. Veo el mismo enlace simbólico ORPHAN / MISSING cuando hago una sustitución de proceso muy simple:
$ ls -l <( echo 123 )
y usando el mismo man|ps2pdt La tubería funciona bien cuando la sustitución del proceso se alimenta a diff:
$ diff <(man -t ls | ps2pdf - - | tr "\0" "0") <(man -t ls | ps2pdf - - | tr "\0" "0")
248c248
< /ID [<95A81B38FAE8E6FE3C899586A1DEE861><95A81B38FAE8E6FE3C899586A1DEE861>]
---
> /ID [<2F9164BD9265C8540A4A8E7068076344><2F9164BD9265C8540A4A8E7068076344>]
(Aquí agregué 'tr' a las tuberías para eliminar los caracteres nulos / cero en la salida pdf, de modo que diff trataría los archivos como textuales en lugar de binarios).
Entonces, en resumen, no tengo idea de por qué recibo el error "El PDF está dañado" más arriba. Mi objetivo, aparte de comprender, es ver el PDF generado sin generar ningún archivo en el camino.
evince <( cat man-ls.pdf ) se abre sin errores, mostrando 4 páginas (el número correcto), pero todas las páginas están en blanco. Como si en parte hubiera leído el archivo con éxito, pero luego falló en algún punto.