Понадобилось мне перед запуском скрипта определить, имеется ли в пользовательской системе утилита, которая вызывается в скрипте, и если ее таки нет, сказать юзеру, мол, поставьте, вот ссылка на скачивание.
Оказывается в 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.