Isso ocorre porque pushd é uma função embutida no bash. Portanto, não está relacionado à variável PATH e também não é suportado por / bin / sh (que é usado por padrão pelo make. Você pode mudar isso configurando SHELL (embora não funcione diretamente (test1)).
Em vez disso, você pode executar todos os comandos bash -c "...". Isso fará com que os comandos, incluindo pushd / popd, sejam executados em um ambiente 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;"
Ao executar make test1 e make test2, ele fornece o seguinte:
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>
Para test1, embora o bash seja usado como um shell, cada linha de comando / linha na regra é executada por si só, portanto, o comando pushd é executado em um shell diferente do popd.
pushd. O pushd está no seu$PATH?