2009-02-26 12 views

risposta

258

Dalla documentazione GNU Make,

5.3.1 Choosing the Shell 
------------------------ 

The program used as the shell is taken from the variable `SHELL'. If 
this variable is not set in your makefile, the program `/bin/sh' is 
used as the shell. 

così si può mettere SHELL := /bin/bash nella parte superiore del makefile, e si dovrebbe essere a posto.

BTW: Puoi farlo anche per un obiettivo, almeno per GNU Make. Ogni bersaglio può avere le proprie assegnazioni di variabili, in questo modo:

all: a b 

a: 
    @echo "a is $$0" 

b: SHELL:=/bin/bash # HERE: this is setting the shell for b only 
b: 
    @echo "b is $$0" 

Che ti stampare:

a is /bin/sh 
b is /bin/bash 

Vedere "specifici target valori di variabili" nella documentazione per maggiori dettagli. Quella linea può andare ovunque nel Makefile, non deve essere immediatamente prima del bersaglio.

+21

500 bounty in attesa di una citazione da 'uomo'. Parla degli orari. : P – SiddharthaRT

+3

@inLoveWithPython Bene, 'info', in realtà, ma, credo che abbia davvero aiutato Andy. So che ho avuto giorni del genere ... – derobert

+2

in caso di dubbio, @derobert significava letteralmente: 'SHELL =/bin/bash' come prima riga del Makefile (o subito dopo il commento). –

10

È possibile chiamare bash direttamente, utilizzare il flag -c:

bash -c "diff <(sort file1) <(sort file2) > [email protected]" 

Naturalmente, si può non essere in grado di reindirizzare alla variabile $ @, ma quando ho provato a fare questo, mi sono -bash: [email protected]: ambiguous redirect come un messaggio di errore, quindi dovresti esaminarlo prima di entrare in questo (anche se sto usando bash 3.2. Qualcosa, quindi forse il tuo funziona in modo diverso).

2

È possibile chiamare bash direttamente all'interno del vostro Makefile invece di utilizzare la shell di default:

bash -c "ls -al" 

invece di:

ls -al 
+0

Nota che 'make' ignora il valore della variabile di ambiente SHELL. – choroba

4

Se la portabilità è importante non si può decidere di dipendere da un guscio specifica nel tuo Makefile. Non tutti gli ambienti hanno disponibilità bash.

1

C'è un modo per farlo senza impostare esplicitamente la variabile SHELL in modo che punti a bash. Questo può essere utile se si hanno molti makefile poiché SHELL non è ereditato da makefile successivi o preso dall'ambiente. Devi anche essere sicuro che chiunque compili il tuo codice configuri il loro sistema in questo modo.

Se si esegue sudo dpkg-reconfigure dash e si risponde 'no' al prompt, il sistema non utilizzerà dash come shell predefinita. Quindi indicherà bash (almeno in Ubuntu). Nota che usare dash come shell del sistema è un po 'più efficiente.

+1

Quando invocato con il nome 'sh', bash viene eseguito in modalità di compatibilità (' set -o posix'). La funzionalità che l'OP sta tentando di utilizzare, la sostituzione di processo, non è disponibile in questa modalità. –

Problemi correlati