Ermitteln, ob der Befehl an stderr gedruckt wurde

376
gabriel80546

Ich habe dieses Programm in C

#include <stdio.h>  int main() { char foo[10]; int i; for(i = 0; i < 20 ; i++) { foo[i] = 0; }  return 0; } 

Wenn ich dieses Skript starte

#!/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 

Es wird ausgegeben

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! 

Das liegt daran, dass gcc diesen Fehler nicht berücksichtigt hat, aber trotzdem diese Warnungen ausgibt stderr.

Aber ich möchte das immer noch im bash-Skript erkennen.

screenshot

2
Willkommen bei Super User. Wenn Ihre Frage die Programmierung / Codierung betrifft, posten Sie bitte im Stack Overflow. Arun Vinoth vor 6 Jahren 0
@ArunVinoth Die Frage ist hier immer noch ein Thema, da es um die Verwendung eines Programmiertools und die Interaktion mit dem aufrufenden Skript geht. DavidPostill vor 6 Jahren 2
@KamilMaciorowski Nicht wirklich, denn eine Antwort auf die im Titel gestellte Frage würde auch die OP-Frage lösen (auch wenn es nicht die beste Antwort wäre). DavidPostill vor 6 Jahren 0
Ich möchte immer noch wissen, wie man erkennt, ob der Befehl an stderr gedruckt wurde. Das wäre viel besser als die akzeptierte Warnung gabriel80546 vor 6 Jahren 0
Ich denke, @ DavidPostill's Antwort ist die richtige, aber wenn Sie die Unterscheidung zwischen Warnungen und Fehlern sowie das Erkennen von Notizen beibehalten möchten, können Sie am Ende des `gcc'-Befehls` 2> err` hinzufügen und Ihren Test durchführen wenn [$? -eq 0 -a! -s err] `. AFH vor 6 Jahren 0
denn was ich mit gcc machen konnte, war schön, es löste sich in diesem Fall, aber ein anderer Befehl, bei dem ich keine spezielle Flagge wie -Werror verwenden konnte, würde nicht funktionieren. Daher ist es viel besser zu wissen, wie man in diesem Fall löst gabriel80546 vor 6 Jahren 0
@AFH Das ist die richtige Antwort, und es ist viel besser, denn wenn ich werror benutze, um das gcc-Standardverhalten zu ändern, was nicht das ist, was ich will, und auch was ich getan habe, könnte ich in jedem Befehl verwenden, den ich brauche. Vielen Dank gabriel80546 vor 6 Jahren 0
poste das für mich als richtige Antwort zu wählen gabriel80546 vor 6 Jahren 0
@ KamilMaciorowski Ja, du hast Recht, ich wähle die Antwort von DavidPostill als akzeptiert ab gabriel80546 vor 6 Jahren 0
Ich wate jetzt für eine bessere Antwort gabriel80546 vor 6 Jahren 0

2 Antworten auf die Frage

4
DavidPostill

gcc Ich habe das nicht als Fehler betrachtet

Sie können den -WerrorSchalter verwenden.

-Werror Machen Sie alle Warnungen zu Fehlern.

Quelle Warnung Optionen - Verwenden der GNU Compiler Collection (GCC)

obwohl es nur ein Trick ist, den ich mit diesem gcc-Befehl verwenden könnte, aber was ich wirklich will, ist etwas, das mir bei jedem Befehl helfen würde. gabriel80546 vor 6 Jahren 0
@ gabriel80546 Dann hast du das in deiner Frage gestellt. Sie sollten Ihre Frage jedoch jetzt nicht ändern, da bestehende Antworten dadurch ungültig werden. DavidPostill vor 6 Jahren 0
Ich dachte, der Titel war klar gabriel80546 vor 6 Jahren 1
2
AFH

Ich denke, @ DavidPostill's Antwort ist die richtige, aber wenn Sie die Unterscheidung zwischen Warnungen und Fehlern sowie das Erkennen von Notizen beibehalten möchten, können Sie 2>erram Ende des gccBefehls hinzufügen :

gcc -O3 -o hello hello.c 

Dann machen Sie Ihren Test:

if [ $? -eq 0 -a ! -s err ] 
Nun, deine Antwort ist das, was ich wirklich will und es ist sehr hilfreich. Ja, du hast Recht, so wie ich meine Frage gestellt habe. Es scheint, dass ich diese Erkennung in diesem Fall wirklich machen möchte, aber eine Erkennung ist auf jeden Fall viel besser. gabriel80546 vor 6 Jahren 0
Seit diesem Code habe ich nur das Problem dargestellt. es ist eigentlich kein echter Code, der wirklich nützliche Sachen macht gabriel80546 vor 6 Jahren 0