Ini karena pushd adalah fungsi bawaan di bash. Jadi tidak terkait dengan variabel PATH dan juga tidak didukung oleh / bin / sh (yang digunakan secara default oleh make. Anda dapat mengubahnya dengan menyetel SHELL (meskipun tidak akan bekerja secara langsung (test1)).
Anda malah bisa menjalankan semua perintah melalui bash -c "...". Itu akan membuat perintah, termasuk pushd / popd, berjalan di lingkungan 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;"
Saat menjalankan make test1 dan make test2 memberikan yang berikut ini:
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>
Untuk test1, meskipun bash digunakan sebagai shell, setiap perintah / baris dalam aturan dijalankan dengan sendirinya, sehingga perintah pushd dijalankan di shell yang berbeda dengan popd.
pushd. Apakah pushd ada di dalam Anda$PATH?