/bin/sh
pode estar bash
em seu sistema, mas, quando chamado como sh
, bash
estará em execução no modo POSIX (como se tivesse POSIXLY_CORRECT
sido definido ou iniciado --posix
).
Nesse modo, as substituições de processo não existem.
Soluções:
all:
command1 >file1
command2 >file2
diff file1 file2
rm -f file1 file2
Alternativa:
all:
bash -c "diff <(command1) <(command2)"
Ou apenas defina a variável Makefile SHELL
como /bin/bash
:
SHELL=/bin/bash
Se você deseja portabilidade, escolha a primeira solução. Se você estiver bem com uma dependência bash
, escolha a segunda. Se você não precisar se preocupar com make
implementações que não sejam GNU , use a terceira.
Em relação à configuração SHELL
: O padrão POSIX diz que os executáveis em Makefiles devem ser chamados com a system()
função de biblioteca C por make
. Não é garantido que esta função use a SHELL
variável de ambiente (de fato, isso é desencorajado pelo padrão). O padrão também é extensivo ao dizer que a configuração da variável Makefile SHELL
não deve afetar a variável de ambiente SHELL
. Entretanto, na maioria das implementações make
que eu conheço, a variável Makefile SHELL
será usada para executar os comandos.
A sugestão na justificativa para a make
utilidade é usar bash -c
:
O MAKESHELL
recurso histórico e os recursos relacionados fornecidos por outras make
implementações foram omitidos. Em algumas implementações, é usado para permitir que um usuário substitua o shell a ser usado para executar make
comandos. Isso foi confuso; para um portátil make
, o shell deve ser escolhido pelo escritor do makefile. Além disso, um gravador de makefile não pode exigir que um shell alternativo seja usado e ainda considera o makefile portátil. Embora seja possível padronizar um mecanismo para especificar um shell alternativo, as implementações existentes não concordam com esse mecanismo, e os gravadores de makefile já podem chamar um shell alternativo especificando o nome do shell na regra de um destino; por exemplo:
python -c "foo"
bash
no Makefile ou qualquer outra solução para o problema diff sem usar arquivos temporários?SHELL
a/bin/bash
no Makefile.bash -c
.