Почему оболочка жалуется на этот скрипт в Makefile? - PullRequest
2 голосов
/ 12 июля 2011

Почему этот фрагмент сценария оболочки выдает ошибку в Makefile?

-@for file in `cat export_mojave_tcl_files.list`; do \
if { [ -f $(TEST_PATH)/$$file ] && [-f $$file]} ; \
then diff $$file bk_marker > $$file.diff ; \
if {! [ -s $$file.diff ]}; \
then rm -f $$file.diff ; \
else echo $$file >> marker.fill.tcl.diff; \
fi \
elif {[ -f $(TEST_PATH)/$$file] && ! [ -f $$file]} ; \
then echo $$file >> gold_exists; \
else echo $$file >> test_exists; \
fi; \
done ;

Ошибка

/bin/sh: -c: line 1: syntax error near unexpected token `then'
/bin/sh: -c: line 1: `for file in `cat export_mojave_tcl_files.list`; do  if { [ -f ../GOLD/$file ] && [-f $file] } ;  then diff $file bk_marker > $file.diff ;  if ! [ -s $file.diff ]};  then rm -f $file.diff ;  else echo $file >> marker.fill.tcl.diff;  fi  elif { [ -f ../GOLD/$file] && ! [ -f $file] } ;  then echo $file >> gold_exists;  else echo $file >> test_exists;  fi;  done ;'

1 Ответ

2 голосов
/ 13 июля 2011

Вы должны быть осторожны с пробелами вокруг фигурных скобок и точкой с запятой, прежде чем закрывать фигурные скобки ..

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 выдает какие-либо выходные данные, поэтому бэк-тикам нечего выполнять, но это ужасная трата процессов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...