2014-03-09 3 views
1

Итак, я новичок во всей сценарии сценариев Bash, но я работаю над скриптом для компиляции всех файлов .c в каталоге, который мне удалось сделать:Обработка gcc-предупреждений и вывод в сценарии Bash

for F in *.c; do 
     gcc -c -Wall -o ${F%.c} $F 
    done 

Все работает отлично, но я хочу, чтобы на выходе выглядеть примерно так:

ex1.c Errors 
ex2.c OK 
ex3.c Warnings 

Поэтому в основном я хочу, чтобы иметь статус завершения 0 (Все прошло отлично) для «Ok», статус 1 (Предупреждения, но без ошибок) для «Предупреждений» и статуса 2 (не компилировался) для «Ошибок».

Мне сложно определить, как это сделать. Я искал вокруг и не мог найти ничего, что я нашел полезным. Я очень хорошо мог что-то пропустить.

EDIT: Было бы все равно сказать: если gcc -Wall file.c имеет ошибки, то просто скажите «Ошибка» вместо полного сообщения об обработке ошибок GCC? То же самое с предупреждениями и отличным компилятором?

+0

В bash вы можете 'echo $?' Вернуть статус выхода из предыдущего вызова процесса. Однако, кроме нуля/не-нуля, не будет легкого или даже возможного сопоставления между статусами выхода gcc и тем, что вы хотите. Вы заглядывали в Спок? Я не могу сказать, что вы сосредоточены, будь то о bash или компиляции кучи целевых файлов. Если у вас есть проект, то DAG-ориентированный строитель - это то, что вы хотите. – JayInNyc

+0

Был бы способ сказать: если gcc file.c имеет ошибку, то echo Error? И так далее, и так далее? – TheFatness

+0

Возможный дубликат [Как проверить, не сработал ли gcc, вернул предупреждение или преуспел? (в bash)] (http://stackoverflow.com/questions/1024525/how-to-check-if-gcc-has-failed-returned-a-warning-or-succeeded-in-bash) – dtmland

ответ

3

gcc возвращает 0 код выхода для предупреждений. Итак, вы собираетесь это сделать следующим образом:

for F in *.c; do 
     out=$(gcc -c -Wall -o ${F%.c} $F 2>&1) 
     if [ $? -ne 0 ]; then 
     echo $F Errors 
     else 
     if grep "warning:" <<<"${out}" >/dev/null ; then 
      echo $F Warnings 
     else 
      echo $F OK 
     fi 
    fi 
    done 
+0

Мне нравится концепция этого. Однако я получаю неоднозначные ошибки переадресации: output = $ (gcc -c -Wall -o $ {F% .c} $ F 2> $ 1). Кроме того, не могли бы вы дать краткое объяснение того, что именно делает << TheFatness

+0

Это не * 2> $ 1 * but '2> &1' ;) Вот почему вы получаете сообщение об ошибке. В bash '<<<' следует читать из переменной, а не читать из файла. Он называется * здесь строки *. Вы можете прочитать больше здесь: http://www.gnu.org/software/bash/manual/bashref.html#Here-Strings –

+0

Не могу поверить, что я неправильно понял это!Но да, это было результатом ошибки. Кроме того, спасибо за объяснение того, что делает <<<. Я ценю помощь! – TheFatness

0

Джефри,

Для создания проекта вам нужен инструмент сборки, который визуализирует в DAG. make - это классический пример, SCons - это современный инструмент.

Чтобы обратиться к вам Баш вопрос, следующий будет сообщать о состоянии ненулевую выхода:

for F in *.c; do 
    gcc -c -Wall -o ${F%.c} $F && [[ `echo $?` ]] || echo "Error" 
done 

В && и || лексемы и и или. [[echo $?]] проверяет состояние выхода после вызова gcc. Если нулевое, то тихое, иначе эхо-ошибка.

Я обращаюсь к вашему конкретному вопросу, так что, возможно, это полезно. Но в целом компилирование файлов .c в bash for loop не является хорошей практикой.

+0

Я на самом деле просто снова прикрутили и придумали что-то очень похожее, что заставляет меня двигаться вперед. Но потом я столкнулся с проблемой, которую подняла «Голубая луна». – TheFatness

Смежные вопросы