Попытка реализовать самопроверку синтаксиса в сценарии bash test.sh
для запуска проверки синтаксиса перед выполнением скрипта.
error_exit()
{
echo -e "$1" 1>&2
exit 1
}
bash -n "$(basename $BASH_SOURCE)"
RESULT=$?
if [ $RESULT == 0 ]; then
echo "[OK] Test pass"
else
error_exit "Something is not right :( \n check the sytntax"
fi
starting-script
bash -n
, такой же как bash -x
выполняет свою работу, если есть серьезные синтаксические ошибки, но незначительные ошибки, например:
echo "somthing" && sleep5&&
./test.sh: line 14: sleep5: command not found
игнорируются ...
есть ли способ выполнить полную проверку синтаксиса, плюс может быть запущен скрипт в каком-то «режиме песочницы» / «режиме моделирования», чтобы отловить все возможные ошибки и вернуться с ошибкой, если таковая имеется?
отредактировал В случаях, когда скрипт должен скопировать какую-то часть скрипта на удаленный сервер, например скрипт для установки nagios на сотни подчиненных (контролируемых серверов) и т. Д. К сожалению, копирование текста не всегда проходит гладко, и ошибки могут быть вызваны возникшими ошибки при автоматическом копировании скрипта в виде текста, и важно проверить и завершить скрипт, если обнаружены какие-либо ошибки.
Вы могли бы взглянуть на ShellCheck проект, который выполняет более тщательную проверку синтаксиса сценария оболочки; включая передовой опыт и возможные подводные камни.
Однако даже ShellCheck не сообщит, что пример из вашего вопроса неверен, потому что синтаксической ошибки нет.
Вы вызываете внешнюю команду sleep5
что является синтаксически допустимым действием.
Используйте переменные и проверьте, существуют ли команды перед их вызовом, и корректно завершите работу, если их нет.
Как отметили @techraf и @ Wice22, полной проверки во время выполнения не существует.
Однако вы можете создать «модульные» тесты для своего сценария bash. Один из фреймворков, который помогает в этом, - это BATS: https://github.com/sstephenson/bats
Эти тесты могут запускаться системой CI при каждой фиксации в вашем репозитории git, так что вы увидите, не ошиблись ли вы задолго до того, как эти скрипты попадут в производство.
Однако с BATS нет автоматического тестирования ваших скриптов, но вы должны реализовать каждый тест самостоятельно.
РЕДАКТИРОВАТЬ: Что касается вашего редактирования: вы можете создать md5sum скрипта, который будет скопирован, скопировать их оба (удаленный скрипт и файл md5sum) и удаленно проверить, соответствует ли скрипт md5sum.
Насколько мне известно, в bash нет такой вещи, как "режим песочницы", нет средства "try / catch". Чтобы отловить ошибки в bash, вам нужно запустить скрипт. Попробуйте эту ветку https://stackoverflow.com/questions/22009364/is-there-a-try-catch-command-in-bash Вы можете смоделировать аварийное завершение с помощью вспомогательных оболочек, как показано здесь. Используя эти методы, вы можете остановить скрипт в любой точке, если обнаружено «исключение», но это не симуляция. так что это будет примерно так:
#!/bin/bash
script_name=$(basename $0)
error_exit() { echo -e "${script_name} file: ${1:-"Unknown Error"}" 1>&2
exit 1
}
bash -n "$(basename $BASH_SOURCE)"
RESULT=$?
if [ $RESULT == 0 ]; then
echo $" ${green}[OK] Test pass${reset} "
else
error_exit "syntax error detected"
fi
echo "Check pass ok"
bash -e <<TRY
echo "" && sleep5
echo"and_somthing else"
echo"and_some_more stuff"
echo"and some_more"
TRY
if [ $? -ne 0 ]; then
error_exit "error detected"
fi
echo "continuing if all goes well"