Я создал простую c программу и бросил a''; нарочно получить ошибку. Я хочу использовать команду grep, чтобы знать, была ли компиляция успешна или нет.
Я использую:
gcc test.c | grep 'error'
но вывод не кажется правильным. Действительно ли это - правильный путь?
Я предполагаю, что это не работает потому что путем выполнения:
эхо "hello world" | grep "hello"
Я получаю цветной текст для соответствия.
При выполнении grep для компиляции нет такой вещи.
Ошибка имеет эту форму:
test.c: In function ‘main’:
test.c:8:2: error: expected ‘,’ or ‘;’ before ‘return’
return 0;
^
и программа, которую я использую:
int main(int argc, char const *argv[]){
char f[] = "Hello thereeee!"
return 0;
}
Если требуется знать, успешно выполнилась ли команда или перестала работать, обычно необходимо проверять ее код выхода. Zero указывает на успех, ненулевой выставочный отказ.
Пример в оболочке:
gcc foo.c
rc=$? # Store exit code for later use
if [ $rc -ne 0 ]; then # $rc not equal to zero
echo "gcc exited with $rc"
fi
Вы могли также использовать &&
или ||
для выполнения команды на успешности или неуспешности, соответственно:
gcc foo.c && echo gcc succeeded
gcc foo.c || echo gcc failed
, Как упомянуто в комментариях, gcc foo.c | grep error
не поймал все, потому что канал обычно ловит стандартный вывод (stdout) только. Программы будут часто производить исключительные сообщения к стандартной погрешности (stderr). Для ловли того потока необходимо перенаправить stderr к stdout прежде, чем передать по каналу к grep
:
gcc foo.c 2>&1 | grep error
Или, если Вы используете эти bash
оболочка, можно использовать эту стенографию:
gcc foo.c |& grep error
Теперь, это gcc
генерирует a.out
двоичный файл. Если Вы просто хотите проверить на синтаксические ошибки, можно использовать gcc -fsyntax-only foo.c
. Можно тогда исследовать в выводе или проверить его код выхода на наличие ошибок.
необходимо захватывать stderr:
gcc ... |& grep.
†“muru