Dzieje się tak, ponieważ pushd jest funkcją wbudowaną w bash. Nie jest więc powiązany ze zmienną PATH, a także nie jest obsługiwany przez / bin / sh (który jest używany domyślnie przez make. Możesz to zmienić ustawiając SHELL (chociaż nie będzie to działać bezpośrednio (test1)).
Zamiast tego możesz uruchomić wszystkie polecenia bash -c "...". Spowoduje to, że polecenia, w tym pushd / popd, będą działać w środowisku bash (test2).
SHELL = /bin/bash
test1:
@echo before
@pwd
@pushd /tmp
@echo in /tmp
@pwd
@popd
@echo after
@pwd
test2:
@/bin/bash -c "echo before;\
pwd; \
pushd /tmp; \
echo in /tmp; \
pwd; \
popd; \
echo after; \
pwd;"
Podczas uruchamiania make test1 i make test2 daje to co następuje:
prompt>make test1
before
/download/2011/03_mar
make: pushd: Command not found
make: *** [test1] Error 127
prompt>make test2
before
/download/2011/03_mar
/tmp /download/2011/03_mar
in /tmp
/tmp
/download/2011/03_mar
after
/download/2011/03_mar
prompt>
W przypadku testu1, mimo że bash jest używany jako powłoka, każde polecenie / wiersz w regule jest uruchamiane samodzielnie, więc polecenie pushd jest uruchamiane w innej powłoce niż popd.
pushd. Czy jest wciśnięty w twoim$PATH?