Điều này là do pushd là một hàm nội trang trong bash. Vì vậy, nó không liên quan đến biến PATH và nó cũng không được hỗ trợ bởi / bin / sh (được sử dụng theo mặc định của make. Bạn có thể thay đổi điều đó bằng cách đặt SHELL (mặc dù nó sẽ không hoạt động trực tiếp (test1)).
Thay vào đó, bạn có thể chạy tất cả các lệnh bash -c "..."
. Điều đó sẽ làm cho các lệnh, bao gồm pushd / popd, chạy trong môi trường 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;"
Khi chạy, hãy tạo test1 và tạo test2, nó sẽ đưa ra kết quả sau:
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>
Đối với test1, mặc dù bash được sử dụng như một trình bao, mỗi lệnh / dòng trong quy tắc được chạy bởi chính nó, vì vậy lệnh pushd được chạy trong một trình bao khác với popd.
pushd
. Đẩy có trong bạn$PATH
không?