Если вы хотите, чтобы код выхода вашей команды последнего запуска был кодом выхода для скрипта, ваш скрипт должен заканчиваться на exit $? как последняя строка. Любая функция до этого также должна заканчиваться на $? таким образом, цепь течет к этой последней линии. В противном случае происходит какой-то другой выход.
Если сценарий уничтожается вместе с приложением или сценарием, который вы пытаетесь уничтожить, то ваша работа ps и grep, вероятно, включает оба результата в результаты. Посмотрите на вывод ps и grep во время работы скрипта. Вы можете добавить строку перед строкой уничтожения, которая просто показывает вывод ps и greps, чтобы вы могли увидеть, что на самом деле убивается.
Наконец (и я не думаю, что это так), если вы пытаетесь завершить сценарий после уничтожения, вручную запустите выход (снова, вероятно, с помощью exit $? По причине, указанной выше), где это уместнов сценарии.
Надеюсь, это поможет вам добраться туда, куда вы идете.