Эта последовательность $?
вернет код ошибки последнего процесса, а не вывод. Проверьте это
$ echo ok; echo $?
ok
0
Первый эхо напечатало 'ok', а второе напечатало 0, что означает, что команда выполнена успешно. Код, отличный от 0, означает, что произошла какая-то ошибка.
Так что
./external-prog 23334
echo $?
2
означает, что external-prog
не удалось, а код ошибки равен 2, что бы это ни значило. И чтобы перехватить вывод какой-либо команды в переменную, вам нужен
var=$(echo ok)
$ echo $var
ok