/bin/sh
może być bash
w twoim systemie, ale gdy zostanie wywołany jako sh
, bash
będzie działał w trybie POSIX (tak jakby POSIXLY_CORRECT
został zdefiniowany lub został uruchomiony przy pomocy --posix
).
W tym trybie podstawienia procesów nie istnieją.
Rozwiązania:
all:
command1 >file1
command2 >file2
diff file1 file2
rm -f file1 file2
Alternatywny:
all:
bash -c "diff <(command1) <(command2)"
Lub po prostu zdefiniuj zmienną Makefile SHELL
jako /bin/bash
:
SHELL=/bin/bash
Jeśli chcesz mieć przenośność, skorzystaj z pierwszego rozwiązania. Jeśli wszystko jest w porządku z zależnością bash
, wybierz drugą. Jeśli dodatkowo nie musisz przejmować się make
implementacjami innymi niż GNU , użyj trzeciego.
Jeśli chodzi o ustawienia SHELL
: Standard POSIX mówi, że pliki wykonywalne w Makefile powinien być wywołany z system()
funkcją C bibliotekę make
. Nie można zagwarantować, że funkcja ta będzie używać SHELL
zmiennej środowiskowej (w rzeczywistości standard tego odradza). Norma również do pewnego stopnia mówi, że ustawienie zmiennej Makefile SHELL
nie powinno wpływać na zmienną środowiskową SHELL
. Jednak w większości znanych mi implementacji make
zmienna Makefile SHELL
będzie używana do wykonywania poleceń.
Sugestia w Uzasadnieniem dla make
narzędzia ma zastosowania bash -c
:
Funkcja historyczna MAKESHELL
i funkcje powiązane z innymi make
implementacjami zostały pominięte. W niektórych implementacjach umożliwia użytkownikowi przesłonięcie powłoki używanej do uruchamiania make
poleceń. To było mylące; w przypadku urządzenia przenośnego make
powłoka powinna zostać wybrana przez pisarza makefile. Ponadto program piszący makefile nie może wymagać użycia alternatywnej powłoki i nadal uważa, że plik makefile jest przenośny. Chociaż możliwe byłoby ujednolicenie mechanizmu określania alternatywnej powłoki, istniejące implementacje nie zgadzają się na taki mechanizm, a twórcy plików makefile mogą już wywoływać alternatywną powłokę, podając nazwę powłoki w regule dla celu; na przykład:
python -c "foo"
bash
w Makefile lub inne rozwiązanie problemu z różnicą bez użycia plików tymczasowych?SHELL
, aby/bin/bash
w pliku Makefile.bash -c
.