Понадобилось мне перед запуском скрипта определить, имеется ли в пользовательской системе утилита, которая вызывается в скрипте, и если ее таки нет, сказать юзеру, мол, поставьте, вот ссылка на скачивание.
Оказывается в Linux есть стандартные (зарезервированные) коды завершения, а если программа не найдена, то bash автоматически выдает код завершения 127. Таким образом, задача сводится к тому, чтобы на код 127 правильно отреагировать.
Можете проверить на этом скрипте:
#!/bin/bash
$1
EXITCODE=$?
if [ $EXITCODE -eq 127 ]; then
echo "Command not found!"
else
echo "Exit code: $EXITCODE"
fi
/excode-test ls
excode-test pb01 pb02 test.mp3
Exit code: 0
Команда существует и выполнена успешно.
./excode-test sagfhjsdgfhjgf
./excode-test: line 3: sagfhjsdgfhjgf: command not found
Command not found!
Примечание: Переменная $?, содержащая код завершения, будет переопределена любой следующей командой, потому можно взять за правило, сохранять значение $? в отдельную переменную, если где-то потом в скрипте понадобится проверка кода завершения.
1 — разнообразные ошибки, используется как стандартный код ошибки в скриптах или программах
2 — согласно документации к Bash — неверное использование встроенных команд, иногда программисты его перелпределяют.
126 — вызываемая команда не может быть выполнена, возникает из-за проблем с правами доступа или когда вызван на исполнение неисполняемый файл
127 — «команда не найдена»
128 — неверный аргумент команды exit
128+n — фатальная ошибка по сигналу «n»
130 — завершение по Control-C
255 — код завершения вне допустимого диапазона, но утилита dialog использует этот код, как завершение по ESC.