/bin/sholabilir bashsisteminizde, ancak çağrıldığında sh, bash(sanki POSIX modunda çalışıyor olacak POSIXLY_CORRECTtanımlandı veya onunla başladı --posix).
Bu modda, işlem ikameleri mevcut değildir.
Çözümler:
all:
command1 >file1
command2 >file2
diff file1 file2
rm -f file1 file2
Alternatif:
all:
bash -c "diff <(command1) <(command2)"
Veya sadece Makefile değişkenini SHELLşu şekilde tanımlayın /bin/bash:
SHELL=/bin/bash
Taşınabilirlik istiyorsanız, ilk çözümle devam edin. Bağımlılığı olan bir sorun yoksa bash, ikincisini seçin. Ek olarak GNU dışı makeuygulamaları önemsemeniz gerekmiyorsa , üçüncüyü kullanın.
Ayarla ilgili olarak SHELL: POSIX standardı, Makefiles içindeki yürütülebilir dosyaların system()C kütüphanesi işleviyle çağrılması gerektiğini söylüyor make. Bu işlevin SHELLortam değişkenini kullanacağı garanti edilmez (aslında bunu yapmak standart tarafından önerilmez). Standart, Makefile değişkeninin ayarlanmasının ortam değişkeniniSHELL etkilememesi gerektiğini söylemek için de bir miktar uzar . Ancak bildiğim çoğu uygulamada , komutları yürütmek için Makefile değişkeni kullanılacaktır. SHELLmakeSHELL
İçinde öneri Rationale için makeyardımcı kullanım için bash -c:
Tarihsel MAKESHELLözellik ve diğer makeuygulamalar tarafından sağlanan ilgili özellikler atlanmıştır. Bazı uygulamalarda, bir kullanıcının makekomutları çalıştırmak için kullanılacak kabuğun üzerine yazmasına izin vermek için kullanılır . Bu kafa karıştırıcıydı; bir taşınabilir için make, kabuk makefile yazar tarafından seçilmelidir. Ayrıca, bir makefile yazarı alternatif bir kabuğun kullanılmasını gerektiremez ve hala makefile taşınabilir olarak düşünülebilir. Alternatif bir kabuk belirtmek için bir mekanizmayı standartlaştırmak mümkün olsa da, mevcut uygulamalar böyle bir mekanizma üzerinde anlaşmaya varmaz ve makefile yazarları bir hedef kuralında kabuk adını belirterek alternatif bir kabuk çağırabilir; Örneğin:
python -c "foo"
bashGeçici dosyalar kullanmadan Makefile veya diff sorununa başka bir çözüm çağırmanın bir yolu var mı ?