Синтез інших відповідей: pushdспецифічний для bash, і ви створюєте використання іншої оболонки POSIX. Існує просте рішення для використання окремої оболонки для тієї частини, яка потребує іншого каталогу, тому просто спробуйте змінити її на:
test -z gen || mkdir -p gen \
&& ( cd $(CURRENT_DIRECTORY)/genscript > /dev/null \
&& perl genmakefile.pl \
&& mv Makefile ../gen/ ) \
&& echo "" > $(CURRENT_DIRECTORY)/gen/SvcGenLog
(Я замінив довгий шлях змінним розширенням. Я, мабуть, один у makefile, і він чітко розширюється до поточного каталогу).
Оскільки ви запускаєте його з make, я, ймовірно, теж замінив би тест правилом make. Просто
gen/SvcGenLog :
mkdir -p gen
cd genscript > /dev/null \
&& perl genmakefile.pl \
&& mv Makefile ../gen/ \
echo "" > gen/SvcGenLog
(випав поточний префікс каталогу; ви в будь-якому моменті ви використовували відносний шлях) І ніж просто зробити правило, залежатиме від цього gen/SvcGenLog. Було б трохи більш зручним для читання , і ви можете зробити це залежатиме від genscript/genmakefile.plзанадто, так що Makefileв genбуде відновлений , якщо ви зміните сценарій. Звичайно, якщо що-небудь інше впливає на зміст Makefile, ви можете зробити так, щоб правило залежало і від цього.
pushd. Чи є у вас пудд$PATH?