&&
somente executa o segundo argumento se o primeiro tiver sido bem-sucedido, ou seja, se tiver terminado com o código de saída 0. O código de saída 4 significa "falha" para o shell, portanto o echo
não será executado. Experimente
gcc foo.c && ./a.out || echo $?
Se você quiser ver o código de saída somente quando não for zero. Se você quiser vê-lo sempre, use
gcc foo.c && ./a.out ; echo $?
Observe que ele pode relatar o código de saída do gcc
, se não for zero.