Tengo un script que llama a un programa (específicamente, ttf2afmparte 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 trueal 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
execcausasttf2afmpara 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
ERRseñ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
ttf2afmdirectamente. Me pregunto cómo se las(trap true ERR; exec ttf2afm "$FONT")| …arregla para comportarse de manera diferentettf2afm "$FONT" | ….