Ваш код работает, если при попытке запустить процесс возникает какая-то немедленная ошибка:
$ echo 1
1
$ echo $?
0
$ exec asd123
-bash: exec: asd123: not found
$ echo $?
127
Если исполняемый файл был найден и запущен, он не вернется, потому что он перегонитвесь сценарий и никогда не возвращаться в bash.
Например, это никогда не возвращает:
$ exec grep asd /dev/null
(код выхода grep равен 1, но родительская оболочка перегружена, поэтому никто не может проверить)
Если вы хотите получить код выхода из процесса в этом случае, вы должны запустить его как подпроцесс, т.е. не используя exec (просто command_that_will_fail
).В этом случае процесс bash будет выступать в роли супервизора, который ожидает завершения подпроцесса и может проверить код выхода.