/bin/sh
có thể bash
trên hệ thống của bạn, nhưng khi được gọi là sh
, bash
sẽ chạy ở chế độ POSIX (như thể POSIXLY_CORRECT
đã được xác định hoặc được bắt đầu bằng --posix
).
Trong chế độ này, quá trình thay thế không tồn tại.
Các giải pháp:
all:
command1 >file1
command2 >file2
diff file1 file2
rm -f file1 file2
Thay thế:
all:
bash -c "diff <(command1) <(command2)"
Hoặc chỉ định nghĩa biến Makefile SHELL
là /bin/bash
:
SHELL=/bin/bash
Nếu bạn muốn tính di động, hãy đi với giải pháp đầu tiên. Nếu bạn ổn với sự phụ thuộc vào bash
, hãy chọn cái thứ hai. Nếu bạn cũng không cần quan tâm đến make
việc triển khai không phải GNU , hãy sử dụng phần ba.
Về cài đặt SHELL
: Các tiêu chuẩn POSIX nói rằng thực thi trong Makefiles nên được gọi với system()
chức năng thư viện C bằng make
. Hàm này không được đảm bảo để sử dụng SHELL
biến môi trường (trên thực tế, làm như vậy không được khuyến khích bởi tiêu chuẩn). Tiêu chuẩn cũng đi đến một số độ dài để nói rằng việc đặt biến Makefile SHELL
sẽ không ảnh hưởng đến biến môi trường SHELL
. make
Tuy nhiên, trong hầu hết các triển khai mà tôi biết, biến Makefile SHELL
sẽ được sử dụng để thực thi các lệnh.
Gợi ý trong Cơ sở lý luận cho make
tiện ích là sử dụng bash -c
:
MAKESHELL
Tính năng lịch sử và các tính năng liên quan được cung cấp bởi các make
triển khai khác đã bị bỏ qua. Trong một số triển khai, nó được sử dụng để cho phép người dùng ghi đè lên trình bao được sử dụng để chạy make
các lệnh. Điều này thật khó hiểu; Đối với một thiết bị cầm tay make
, vỏ nên được lựa chọn bởi nhà văn makefile. Hơn nữa, một nhà văn makefile không thể yêu cầu một vỏ thay thế được sử dụng và vẫn xem xét makefile xách tay. Mặc dù có thể tiêu chuẩn hóa một cơ chế để chỉ định một vỏ thay thế, nhưng các triển khai hiện tại không đồng ý với cơ chế đó và các nhà văn makefile có thể đã gọi một vỏ thay thế bằng cách chỉ định tên shell trong quy tắc cho mục tiêu; ví dụ:
python -c "foo"
bash
trong Makefile hoặc bất kỳ giải pháp nào khác cho vấn đề khác mà không sử dụng các tệp tạm thời không?