Синтез на основе других ответов: 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
(Я заменил длинный путь расширением переменной. Я, вероятно, есть один в make-файле, и он явно расширяется до текущего каталога).
Поскольку вы запускаете его из 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?