2013-08-12 2 views
1

Как проверить ошибки (и, возможно, предупреждения) в сценарии bash?Как проверить скрипт bash без запуска скрипта?

Я хочу предварительно проверить скрипты bash, прежде чем проверять их в хранилище git.

Я знаю, что могу использовать bash -n script.sh для первой простой проверки, но этого не найти, например, такие вещи, как переписывание строки readonly.

readonly unique_id = "42" 
unique_id = "21" 

будет нормально для bash -n script.sh, но потерпит неудачу на исполнение, конечно.

EDIT: следующего сценарий

#!/bin/bash 
# check.sh 
readonly unique_id="42" 
unique_id="21" 

дает 0 если выполнить bash -n check.sh; echo $?, но сами по себе исполнение приводит к сообщению об ошибке ./check.sh: line 4: unique_id: readonly variable

Оба поведения являются правильными, потому что это не ошибка синтаксиса, но это будет (даже в модульных тестах), и я спрашиваю, есть ли другой способ предварительной проверки, чтобы отфильтровать такие ошибки.

Unittest найдет только ожидаемых логических сбоев, так что это не альтернатива.

+2

Две строки, выложенные выше, являются * ошибочными *. Вам нужно удалить пробелы вокруг '='. – devnull

+0

Да, вы правы; Я удалил пробелы и добавил shebang, чтобы получить пример реального мира. Спасибо – user762353

ответ

0

Предполагаю, вы считаете, что просто запустите этот скрипт, чтобы проверить наличие ошибок? Затем, если вы не сделаете сообщение об ошибках stdout, вы также можете проверить код последнего выхода в bash: $?. (http://blog.yimingliu.com/2009/01/01/check-last-exit-status-code-in-bash-shell/)

0

Другой способ - разместить все свои коды внутри функций. Таким образом, вы могли бы запустить свой код и проверить на наличии ошибок синтаксиса перед вызовом основной функции:

#!/bin/bash 

function A { 
    ... 
} 

function B { 
    ... 
} 

function main { 
    # most of your codes here 
    ... 
} 

# main "[email protected]" 

Раскоментируйте последнюю строку, если не были обнаружены ошибки синтаксиса. Конечно, существуют исключения, такие как те, которые выполняются на eval, вложенные расширения или расширения paramater, основанные на значении времени выполнения, некоторые из которых основаны на аргументах встроенной команды и других ошибках, обнаруженных во время выполнения.

+0

Но вы все равно выполняете код ... – Bernhard

Смежные вопросы