¿Cómo puedo usar la sintaxis Bash en destinos Makefile?

Resuelto Frank asked hace 15 años • 7 respuestas

A menudo encuentro muy útil la sintaxis de Bashdiff <(sort file1) <(sort file2) , por ejemplo, sustitución de procesos como en .

¿Es posible utilizar dichos comandos Bash en un Makefile? Estoy pensando en algo como esto:

file-differences:
    diff <(sort file1) <(sort file2) > $@

En mi GNU Make 3.80 esto dará error ya que usa shen lugar de bashpara ejecutar los comandos.

Frank avatar Feb 26 '09 12:02 Frank
Aceptado

De la documentación de GNU Make ,

5.3.2 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.

Así que colóquelo SHELL := /bin/bashen la parte superior de su archivo MAKE y estará listo para comenzar.

Por cierto: también puedes hacer esto para un objetivo, al menos para GNU Make. Cada objetivo puede tener sus propias asignaciones de variables, como esta:

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"

Eso imprimirá:

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

Consulte "Valores de variables específicas del objetivo" en la documentación para obtener más detalles. Esa línea puede ir a cualquier parte del Makefile, no tiene que estar inmediatamente antes del objetivo.

derobert avatar Feb 26 '2009 06:02 derobert

Puedes llamar bashdirectamente, usa la -cbandera:

bash -c "diff <(sort file1) <(sort file2) > $@"

Por supuesto, es posible que no puedas redirigir a la variable $@, pero cuando intenté hacer esto, recibí -bash: $@: ambiguous redirectun mensaje de error, por lo que quizás quieras investigar eso antes de entrar demasiado en esto (aunque estoy usando bash 3.2.algo, así que tal vez el tuyo funcione de manera diferente).

Chris Lutz avatar Feb 26 '2009 06:02 Chris Lutz

Una forma que también funciona es ponerlo de esta manera en la primera línea de tu objetivo:

your-target: $(eval SHELL:=/bin/bash)
    @echo "here shell is $$0"
Nicolas Marshall avatar Sep 09 '2019 12:09 Nicolas Marshall