Acabei de resolver um problema com meu(s) Makefile(s). Faça viagens em cada <<<
com a mensagem de erro
/bin/sh: 1: Syntax error: redirection unexpected
E gostaria de saber por quê. (estou usando Bash como SHELL
)
Em meus projetos atuais, tentei muitas receitas como:
target:
read FOO <<< "XXX"; \
read BAR <<< "YYY"; \
read BAZ <<< "ZZZ"; \
someprog -a param0 -b $$FOO -c param1 -d $${BAR} -e param2 -f $${BAZ} >$@
Tentar isso resultará em um erro para cada <<<
, conforme descrito no início. Minha solução alternativa é
target.dep:
echo "XXX YYY ZZZ" >$@
target: %: %.dep
read FOO BAR BAZ < $<;\
someprog -a param0 -b $$FOO -c param1 -d $${BAR} -e param2 -f $${BAZ} >$@
o que significa que coloco minhas coisas em arquivos temporários que leio com <
, o que funciona muito bem. Quando copio e colo minha saída make em um prompt bash normal, todos os comandos funcionam exatamente como esperado, mesmo com a extensão <<<
. Estou bastante certo de que meu problema é que usar o <<<
operador, ou seja, aqui strings, quebra alguma coisa. Por que isso e existe uma maneira de fazer as strings funcionarem em Makefiles?
PS: Sim, às vezes sinto que as ferramentas automáticas seriam a melhor escolha em vez da marca.
significa que você não está usando o bash como seu shell, apesar de suas expectativas em contrário. bash as
sh
reconhece aqui as strings bem (paraMakefile
que funcione no Fedora), mas, por exemplo, dash assh
não. A menos que seja dito o contrário, faça usos/bin/sh
como sua casca; ele ignora seu shell de usuário padrão.Contexto
em seu
Makefile
deve consertar as coisas para você; pelo menos, para mim em um sistema que mostra os mesmos sintomas que o seu.Autotools e Make não resolvem os mesmos problemas; eles são complementares, e usar Autotools ainda significaria usar Make...
Como você pode ver na mensagem de erro, o shell que
make
invoca não ébash
mas/bin/sh
.sh
geralmente não entende here-strings.Se você definir a
make
variávelSHELL
como/bin/bash
(ou qualquer que seja o caminho para esse shell em seu sistema), ela usarábash
em vez desh
.Veja também a documentação GNU relevante
make
sobre isso em https://www.gnu.org/software/make/manual/html_node/Choosing-the-Shell.html