Определить, распечатана ли команда в stderr

315
gabriel80546

У меня есть эта программа на C

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

Если я запускаю этот скрипт

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

Будет выводить

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! 

Это потому, что gcc не считал это ошибкой, а выводил эти предупреждения stderr.

Но я все еще хочу обнаружить это в скрипте bash.

screenshot

2
Добро пожаловать в Супер пользователя. Если ваш вопрос касается программирования / кодирования, просьба опубликовать в Stack Overflow. Arun Vinoth 6 лет назад 0
@ArunVinoth Вопрос по-прежнему актуален, так как речь идет об использовании инструмента программирования и его взаимодействии с вызывающим скриптом. DavidPostill 6 лет назад 2
@KamilMaciorowski Не совсем, потому что ответ на вопрос, заданный в заголовке, также разрешит вопрос ОП (даже не самый лучший ответ). DavidPostill 6 лет назад 0
я все еще хочу знать, как определить, если команда напечатала в stderr, это было бы намного лучше, чем принятый awnser gabriel80546 6 лет назад 0
Я думаю, что ответ @ DavidPostill правильный, но если вы хотите сохранить различие между предупреждениями и ошибками, а также обнаруживать заметки, вы можете добавить `2> err` в конец команды` gcc` и выполнить тест `если [$? -экв 0 -а! -s err] `. AFH 6 лет назад 0
потому что то, что я мог сделать с gcc, было хорошо, это решило в этом случае, но другую команду, которую я не мог использовать специальный флаг, такой как -Werror, это не сработало бы, так что гораздо лучше знать, как решить в этом случае gabriel80546 6 лет назад 0
@AFH Это правильный ответ, и он намного лучше, потому что, если я использую -Werror, изменяя поведение gcc по умолчанию, что не то, что я хочу, а также то, что вы сделали, я мог бы использовать в любой команде, которая мне нужна, спасибо, очень помогли gabriel80546 6 лет назад 0
опубликуйте, чтобы я выбрал правильный ответ gabriel80546 6 лет назад 0
@KamilMaciorowski да, вы правы, я отменил выбор ответа DavidPostill как принятый gabriel80546 6 лет назад 0
я сейчас жду лучшего ответа gabriel80546 6 лет назад 0

2 ответа на вопрос

4
DavidPostill

gcc не считал это ошибкой

Вы можете использовать -Werrorпереключатель.

-Werror Превратите все предупреждения в ошибки.

Параметры предупреждения об источнике - Использование коллекции компиляторов GNU (GCC)

хотя это всего лишь уловка, которую я мог бы использовать с этой командой gcc, но то, что я действительно хочу, это то, что помогло бы мне с любой командой. gabriel80546 6 лет назад 0
@ gabriel80546 Тогда вы задали этот вопрос в своем вопросе. Но вы не должны менять свой вопрос сейчас, так как это сделает недействительными существующие ответы. DavidPostill 6 лет назад 0
я думал, что название было ясно gabriel80546 6 лет назад 1
2
AFH

Я думаю, что ответ @ DavidPostill является правильным, но если вы хотите сохранить различие между предупреждениями и ошибками, а также обнаружением заметок, вы можете добавить 2>errв конец gccкоманды:

gcc -O3 -o hello hello.c 

Тогда сделайте свой тест:

if [ $? -eq 0 -a ! -s err ] 
ну, ваш ответ - это то, что я действительно хочу, и это очень полезно, да, вы правы, как я сформулировал свой вопрос, кажется, что я действительно хочу сделать это обнаружение в этом случае, но обнаружение в любом случае намного лучше. gabriel80546 6 лет назад 0
так как этот код я создал только для иллюстрации проблемы. на самом деле это не настоящий код, который делает «действительно полезные вещи» gabriel80546 6 лет назад 0

Похожие вопросы