Detectar si el comando se ha impreso en stderr

Detectar si el comando se ha impreso en stderr

Tengo este programa en C.

#include <stdio.h>

int main() {
    char foo[10];
    int i;
    for(i = 0; i < 20 ; i++) {
        foo[i] = 0;
    }

    return 0;
}

Si ejecuto este script

#!/bin/bash
gcc -O3 -o hello hello.c
if [ $? -eq 0 ]
then
    echo -e "\033[1;32mcompilation sucess!\033[0m"
else
    echo -e "\033[1;31mcompilation error!\033[0m"
fi

saldrá

hello.c: In function ‘main’:
hello.c:8:10: warning: iteration 10u invokes undefined behavior     [-Waggressive-loop-optimizations]
foo[i] = 0;
    ^
hello.c:6:2: note: containing loop
  for(i = 0; i<20 ;i++)
  ^
compilation sucess!

Esto se debe a que gcc no lo consideró un error pero aun así mostró esas advertencias stderr.

Pero todavía quiero detectar eso dentro del script bash.

captura de pantalla

Respuesta1

Creo que la respuesta de @DavidPostill es la correcta, pero si desea conservar la distinción entre advertencias y errores, además de detectar notas, puede agregar 2>erral final del gcccomando:

gcc -O3 -o hello hello.c

Entonces haz tu prueba:

if [ $? -eq 0 -a ! -s err ]

Respuesta2

gccno lo considero un error

Puedes usar el -Werrorinterruptor.

-WerrorConvierta todas las advertencias en errores.

FuenteOpciones de advertencia: uso de la colección de compiladores GNU (GCC)

información relacionada