Bunun nedeni, pushd'nin bash'da yerleşik bir işlev olmasıdır. Bu nedenle, PATH değişkeniyle ilişkili değildir ve ayrıca / bin / sh tarafından desteklenmez (varsayılan olarak make tarafından kullanılır. Bunu SHELL ayarlayarak değiştirebilirsiniz (ancak doğrudan çalışmayacaktır (test1)).
Bunun yerine tüm komutları çalıştırabilirsiniz bash -c "...". Bu, pushd / popd dahil komutların bir bash ortamında (test2) çalışmasını sağlar.
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;"
Make test1 ve make test2 çalıştırıldığında aşağıdakileri verir:
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>
Test1 için, bash bir kabuk olarak kullanılsa bile, kuraldaki her komut / satır kendi başına çalıştırılır, bu nedenle pushd komutu popd'den farklı bir kabukta çalıştırılır.
pushd. Pushd senin içinde$PATHmi?