/bin/sh
peut être bash
sur votre système, mais lorsqu'il est appelé as sh
, bash
il s'exécutera en mode POSIX (comme s'il POSIXLY_CORRECT
était défini ou démarré avec --posix
).
Dans ce mode, les substitutions de processus n'existent pas.
Solutions:
all:
command1 >file1
command2 >file2
diff file1 file2
rm -f file1 file2
Alternative:
all:
bash -c "diff <(command1) <(command2)"
Ou définissez simplement la variable Makefile SHELL
comme /bin/bash
:
SHELL=/bin/bash
Si vous voulez la portabilité, optez pour la première solution. Si vous êtes d'accord avec une dépendance sur bash
, choisissez la seconde. Si vous n'avez pas non plus besoin de vous soucier des make
implémentations non GNU , utilisez la troisième.
Concernant le réglage SHELL
: La norme POSIX dit que les exécutables dans Makefiles doivent être appelés avec la system()
fonction de bibliothèque C par make
. Cette fonction n'est pas garantie d'utiliser la SHELL
variable d'environnement (en fait, cela est déconseillé par la norme). La norme va également jusqu'à dire que la définition de la variable Makefile ne SHELL
devrait pas affecter la variable d'environnement SHELL
. Dans la plupart des implémentations de ce make
que je connais, cependant, la variable Makefile SHELL
sera utilisée pour exécuter les commandes.
La suggestion dans la justification de l' make
utilitaire est d'utiliser bash -c
:
La MAKESHELL
fonctionnalité historique et les fonctionnalités associées fournies par d'autres make
implémentations ont été omises. Dans certaines implémentations, il est utilisé pour permettre à un utilisateur de remplacer le shell à utiliser pour exécuter des make
commandes. C'était déroutant; pour un portable make
, le shell doit être choisi par l'auteur du makefile. De plus, un écrivain de makefile ne peut pas exiger qu'un autre shell soit utilisé et considère toujours le makefile portable. Bien qu'il soit possible de normaliser un mécanisme pour spécifier un autre shell, les implémentations existantes ne conviennent pas d'un tel mécanisme, et les rédacteurs de makefile peuvent déjà invoquer un autre shell en spécifiant le nom du shell dans la règle pour une cible; par exemple:
python -c "foo"
bash
dans le Makefile ou toute autre solution au problème de diff sans utiliser de fichiers temporaires?SHELL
à/bin/bash
la Makefile.bash -c
.