Często uważam, że składnia Bash jest bardzo pomocna, np. Podstawianie procesów jak w diff <(sort file1) <(sort file2)
.
Czy można używać takich poleceń Bash w pliku Makefile? Mam na myśli coś takiego:
file-differences:
diff <(sort file1) <(sort file2) > $@
W moim GNU Make 3.80 spowoduje to błąd, ponieważ używa shell
zamiast zamiast bash
do wykonywania poleceń.
/bin/sh: -c: line 0: syntax error near unexpected token
(''Odpowiedzi:
Z dokumentacji GNU Make,
Więc umieść
SHELL := /bin/bash
na szczycie swojego makefile, a powinieneś być gotowy.BTW: Możesz to zrobić również dla jednego celu, przynajmniej dla GNU Make. Każdy cel może mieć własne przypisania zmiennych, takie jak to:
To wydrukuje:
Aby uzyskać więcej informacji, zobacz „Wartości zmiennych specyficznych dla celu” w dokumentacji. Ta linia może iść w dowolne miejsce w pliku Makefile, nie musi znajdować się bezpośrednio przed celem.
źródło
man
. Rozmawiaj o czasach. : Pinfo
właściwie, ale myślę, że to naprawdę pomogło Andy'emu. Wiem, że miałem takie dni ...SHELL=/bin/bash
jako pierwszy wiersz pliku Makefile (lub zaraz po komentarzu).Możesz zadzwonić
bash
bezpośrednio, użyj-c
flagi:Oczywiście możesz nie być w stanie przekierować do zmiennej $ @, ale kiedy próbowałem to zrobić, dostałem
-bash: $@: ambiguous redirect
komunikat o błędzie, więc możesz przyjrzeć się temu, zanim się w to wnikniesz (chociaż jestem używając bash 3.2. coś, więc może twój działa inaczej).źródło
Jeśli przenośność jest ważna, możesz nie chcieć polegać na konkretnej powłoce w pliku Makefile. Nie we wszystkich środowiskach dostępna jest wersja bash.
źródło
Możesz wywołać bash bezpośrednio w swoim Makefile zamiast używać domyślnej powłoki:
zamiast:
źródło
make
ignoruje wartość zmiennej środowiskowej SHELL.Jest na to sposób bez jawnego ustawiania zmiennej SHELL tak, aby wskazywała bash. Może to być przydatne, jeśli masz wiele plików makefile, ponieważ SHELL nie jest dziedziczony przez kolejne pliki makefile ani pobierany ze środowiska. Musisz także mieć pewność, że każdy, kto skompiluje Twój kod, skonfiguruje swój system w ten sposób.
Jeśli uruchomisz
sudo dpkg-reconfigure dash
i odpowiesz „nie” na monit, system nie użyje myślnika jako domyślnej powłoki. Następnie wskaże bash (przynajmniej w Ubuntu). Zauważ, że użycie myślnika jako powłoki systemowej jest nieco bardziej wydajne.źródło
sh
bash działa w trybie zgodności (set -o posix
). Funkcja, z której próbuje korzystać OP, zastępowanie procesów, nie jest dostępna w tym trybie.Jednym ze sposobów, który również działa, jest umieszczenie go w ten sposób w pierwszej linii celu:
źródło