/bin/sh
olabilir bash
sisteminizde, ancak çağrıldığında sh
, bash
(sanki POSIX modunda çalışıyor olacak POSIXLY_CORRECT
tanı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ışı make
uygulamaları ö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 SHELL
ortam 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. SHELL
make
SHELL
İçinde öneri Rationale için make
yardımcı kullanım için bash -c
:
Tarihsel MAKESHELL
özellik ve diğer make
uygulamalar tarafından sağlanan ilgili özellikler atlanmıştır. Bazı uygulamalarda, bir kullanıcının make
komutları ç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"
bash
Geçici dosyalar kullanmadan Makefile veya diff sorununa başka bir çözüm çağırmanın bir yolu var mı ?