bash - run - makefile and shell script



Como posso usar a sintaxe Bash em destinos Makefile? (4)

Eu costumo achar a sintaxe Bash muito útil, por exemplo, substituição de processo como em diff <(sort file1) <(sort file2) .

É possível usar esses comandos Bash em um Makefile? Estou pensando em algo assim:

file-differences:
    diff <(sort file1) <(sort file2) > [email protected]

No meu GNU Make 3.80 isso causará um erro, já que ele usa o shell invés do bash para executar os comandos.

https://src-bin.com


Answer #1

Da documentação do 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.

Então coloque SHELL := /bin/bash no topo do seu makefile, e você deve estar pronto para ir.

BTW: Você também pode fazer isso para um alvo, pelo menos para o GNU Make. Cada destino pode ter suas próprias atribuições de variáveis, assim:

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"

Isso vai imprimir:

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

Consulte "Valores Variáveis ​​Específicos do Alvo" na documentação para obter mais detalhes. Essa linha pode ir a qualquer lugar no Makefile, não precisa ser imediatamente antes do alvo.


Answer #2

Existe uma maneira de fazer isso sem definir explicitamente sua variável SHELL para apontar para bash. Isso pode ser útil se você tiver muitos makefiles, pois o SHELL não é herdado por makefiles subsequentes ou retirado do ambiente. Você também precisa ter certeza de que qualquer pessoa que compile seu código configura o sistema dessa maneira.

Se você executar o sudo dpkg-reconfigure dash e responder 'no' ao prompt, seu sistema não usará dash como o shell padrão. Ele então apontará para bash (pelo menos no Ubuntu). Note que usar dash como seu shell de sistema é um pouco mais eficiente.


Answer #3

Você pode chamar bash diretamente, use o sinalizador -c :

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

Claro, você pode não ser capaz de redirecionar para a variável $ @, mas quando eu tentei fazer isso, recebi -bash: [email protected]: ambiguous redirect como uma mensagem de erro, então você pode querer olhar para isso antes de obter também para isso (embora eu esteja usando o bash 3.2.alguma coisa, então talvez a sua funcione de maneira diferente).


Answer #4

Você pode chamar o bash diretamente dentro do seu Makefile ao invés de usar o shell padrão:

bash -c "ls -al"

ao invés de:

ls -al




makefile