Tengo un script que llama a un programa (específicamente, ttf2afm
parte de tetex 3.0) que a veces se daña y otras no. La información que necesito siempre se imprime antes de que ocurra de manera predeterminada, pero me resulta difícil evitar que la redirección de la tubería falle y no envíe nada a la tubería cuando el programa falla.
Intenté redirigir a través de un FIFO, paréntesis del proceso con un true
al final, ejecutar desde una función de shell y encapsular sh -c
, pero el script nunca parece permitir que el proceso genere nada , redirigido o de otro modo, ni siquiera para stderr.
Sé que es capaz de dar salida, ya que es perfectamente capaz de darlo desde la línea de comandos, pero no desde un script por alguna razón.
Mi pregunta es, ¿hay alguna forma de que el script ignore el hecho de que el programa falla y me da la salida de todos modos?
Estoy ejecutando BASH 4.1.10 (2) -lanzamiento.
fuente
Finalmente lo descubrí a través de un proceso de prueba y error. La solución es algo complicada:
Aparentemente, las
exec
causasttf2afm
para hacerse cargo del proceso de subshell con el error atrapado, lo que hace que opere en un entorno en el que no importa si falla.Capturar la
ERR
señal de todo incluido detendrá la muerte del subshell y enviará una señal al script principal, que terminará inmediatamente si lo hace, cuando el programa falle.El único problema es que el núcleo en sí mismo generará una gran cantidad de basura de seguimiento de pila directamente al dispositivo de consola una vez que el proceso falla, por lo que no hay forma de evitar que salga [que yo sepa], pero eso no importa ya que no afecta a stdout o stderr.
fuente
ttf2afm
directamente. Me pregunto cómo se las(trap true ERR; exec ttf2afm "$FONT")| …
arregla para comportarse de manera diferentettf2afm "$FONT" | …
.