Questão Detectar se o comando foi impresso para stderr


Eu tenho este programa em C

#include <stdio.h>

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

    return 0;
}

Se eu executar 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

Ele vai produzir

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!

Isso porque o gcc não considerou isso um erro, mas ainda gera esses avisos stderr.

Mas eu ainda quero detectar isso no script bash.

screenshot


2


origem


Bem-vindo ao superusuário. Se a sua questão é sobre programação / codificação, os pls postam no Stack Overflow. - Arun Vinoth
@ArunVinoth A questão ainda está no tópico aqui, pois trata-se de usar uma ferramenta de programação e sua interação com o script de chamada. - DavidPostill♦
@KamilMaciorowski Na verdade, não, porque uma resposta à pergunta feita no título também resolveria a questão dos OPs (mesmo que não fosse a melhor resposta). - DavidPostill♦
Eu ainda quero saber como detectar se o comando foi impresso para stderr, que seria muito melhor do que o awnser aceito - gabriel80546
Eu acho que a resposta de @ DavidPostill é a correta, mas se você quiser manter a distinção entre avisos e erros, assim como detectar notas, você pode adicionar `2> err` ao final do gcc comando e faça seu teste if [ $? -eq 0 -a ! -s err ]. - AFH


Respostas:


Eu acho que a resposta de @ DavidPostill é a correta, mas se você quiser manter a distinção entre avisos e erros, bem como detectar notas, você pode adicionar 2>err até o final do gcc comando:

gcc -O3 -o hello hello.c

Então faça seu teste:

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

2



bem sua resposta é o que eu realmente quero e é muito útil, sim você está certo do jeito que eu fiz a minha pergunta parece que eu realmente quero fazer essa detecção nesse caso, mas uma detecção em qualquer caso, é muito melhor. - gabriel80546
desde esse código eu criei apenas para ilustrar o problema. Na verdade, não é um código real que "realmente útil" - gabriel80546


gcc não considerou isso como um erro

Você pode usar o -Werror interruptor.

-Werror Faça todos os avisos em erros.

Fonte Opções de Aviso - Usando o GNU Compiler Collection (GCC)


4



embora seja apenas um truque que eu poderia usar com este comando gcc, mas o que eu realmente quero é algo que me ajudaria com qualquer comando. - gabriel80546
@ gabriel80546 Então você perguntou isso na sua pergunta. Mas você não deve alterar sua pergunta agora, pois invalidaria as respostas existentes. - DavidPostill♦
Eu pensei que o título estava claro - gabriel80546