Вы должны быть осторожны с пробелами вокруг фигурных скобок и точкой с запятой, прежде чем закрывать фигурные скобки ..
if { [ -f $(TEST_PATH)/$$file ] && [-f $$file]} ; \
^ here!
then diff $$file bk_marker > $$file.diff ; \
if {! [ -s $$file.diff ]}; \
^ here! ^ here!
В ортодоксальной оболочке, полученной из оболочки Борна (где bash
разделяет те же взгляды на предмет), вам необходимо написать:
if { [ -f $(TEST_PATH)/$$file ] && [-f $$file] ; } ; \
then diff $$file bk_marker > $$file.diff ; \
if { ! [ -s $$file.diff ] ; }; \
Точки с запятой перед закрывающей скобкой необходимы для того, чтобы оболочка распознала закрывающую скобку как конец единицы перенаправления ввода / вывода. Конечно, поскольку перенаправление ввода / вывода отсутствует, все это несколько гипотетично. Я полагаю, что вы получите тот же эффект от:
if [ -f $(TEST_PATH)/$$file ] && [-f $$file] ; \
then diff $$file bk_marker > $$file.diff ; \
if ! [ -s $$file.diff ]; \
без скобок вообще. Я видел худшие нарушения, такие как:
if ( [ -f $(TEST_PATH)/$$file ] && [-f $$file]) ; \
then diff $$file bk_marker > $$file.diff ; \
if (! [ -s $$file.diff ]); \
Это запускает тесты в подоболочках без веской причины. И, что еще хуже, я видел:
if ( `[ -f $(TEST_PATH)/$$file ] && [-f $$file]`) ; \
then diff $$file bk_marker > $$file.diff ; \
if (! `[ -s $$file.diff ]`); \
К счастью, команда test выдает какие-либо выходные данные, поэтому бэк-тикам нечего выполнять, но это ужасная трата процессов.