/bin/sh
potrebbe essere bash
sul tuo sistema, ma quando viene invocato come sh
, bash
sarà in esecuzione in modalità POSIX (come se POSIXLY_CORRECT
fosse stato definito, o fosse iniziato con --posix
).
In questa modalità, non esistono sostituzioni di processo.
soluzioni:
all:
command1 >file1
command2 >file2
diff file1 file2
rm -f file1 file2
Alternativa:
all:
bash -c "diff <(command1) <(command2)"
O semplicemente definire la variabile Makefile SHELL
come /bin/bash
:
SHELL=/bin/bash
Se vuoi la portabilità, scegli la prima soluzione. Se stai bene con una dipendenza bash
, scegli il secondo. Se inoltre non è necessario preoccuparsi delle make
implementazioni non GNU , utilizzare la terza.
Per quanto riguarda l'impostazione SHELL
: lo standard POSIX afferma che gli eseguibili nei Makefile dovrebbero essere invocati con la system()
funzione libreria C da make
. Non è garantito che questa funzione utilizzi la SHELL
variabile d'ambiente (infatti, lo standard è scoraggiato). Lo standard va anche oltre per dire che l'impostazione della variabile Makefile SHELL
non dovrebbe influenzare la variabile d'ambiente SHELL
. Nella maggior parte delle implementazioni make
che conosco, tuttavia, la variabile Makefile SHELL
verrà utilizzata per eseguire i comandi.
Il suggerimento nel Razionale per l' make
utilità è di usare bash -c
:
La MAKESHELL
funzionalità storica e le funzionalità correlate fornite da altre make
implementazioni sono state omesse. In alcune implementazioni viene utilizzato per consentire a un utente di ignorare la shell da utilizzare per eseguire i make
comandi. Questo era confuso; per un portatile make
, la shell dovrebbe essere scelta dallo scrittore di makefile. Inoltre, uno scrittore di makefile non può richiedere l'uso di una shell alternativa e deve comunque considerare il makefile portatile. Mentre sarebbe possibile standardizzare un meccanismo per specificare una shell alternativa, le implementazioni esistenti non concordano su tale meccanismo e gli autori di makefile possono già invocare una shell alternativa specificando il nome della shell nella regola per una destinazione; per esempio:
python -c "foo"
bash
nel Makefile o qualsiasi altra soluzione al problema diff senza usare file temporanei?