Por qué un segfault desaparece al lanzar un programa con entr y bash -c

Fuentes: Where did my segfault go?

Un programador que iteraba sobre un pequeño programa en C con la herramienta entr descubrió que el mensaje 'Segmentation fault' no aparecía en la terminal al ejecutar el binario tras la compilación, pese a que el proceso moría por SIGSEGV. El artículo explica la causa raíz y propone soluciones.

El responsable de imprimir 'Segmentation fault' no es el programa que falla —que ya está muerto—, sino el shell padre, que detecta que un proceso hijo terminó por SIGSEGV al recogerlo. Cuando se invoca bash -c 'gcc ... && ./hello', bash aplica una optimización: si el comando es lo único que debe ejecutar, hace un execve directo sobre él y reemplaza su propio proceso, de modo que ya no existe un shell padre que recoja al hijo y emita el aviso. En consecuencia, el fallo se produce en silencio.

El texto describe dos formas de recuperar el mensaje sin renunciar a la línea de comandos. La más robusta es envolver la ejecución en un script con shebang, ya que ese script arranca un bash hijo que sí actúa como padre del binario y muestra la traza. Una alternativa sin script consiste en forzar una subshell con paréntesis —(./hello)—, lo que impide que bash haga exec y mantiene la relación padre-hijo necesaria para imprimir el diagnóstico. El autor también demuestra que añadir cualquier instrucción posterior (por ejemplo, '; true') basta para impedir el exec y devolver el mensaje.