почему не "эхо $?" вывести код завершения команды прямо перед ней, пока она используется в "&&"?

569
One Two Three

Предположим, у меня есть эта простая программа на C, которая возвращает 4 в оболочку.

int main() { return 4; } 

Когда я его запускаю, то делаю echo $?, я получаю 4, что ожидается

$ gcc foo.c && ./a.out $ echo $? 4 <<<< expected 

НО, когда я делаю следующее, я ничего не получаю

$ gcc foo.c && ./a.out && echo $? $ <<<< Nothing - WHY???? 
2

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

5
choroba

&&второй аргумент запускается только в том случае, если первый аргумент был успешным, т. е. если он завершился с кодом выхода 0. Код выхода 4 означает «сбой» для оболочки, поэтому echoон не выполняется. Пытаться

gcc foo.c && ./a.out || echo $? 

Если вы хотите увидеть код выхода только тогда, когда он не равен нулю. Если вы хотите видеть это всегда, используйте

gcc foo.c && ./a.out ; echo $? 

Обратите внимание, что он может сообщить код выхода, gccесли он не равен нулю.