Você está misturando as variáveis shell e make lá. Tanto make quanto o shell usam $ para suas variáveis.
No Makefile, as variáveis são $(var) ou $v para variáveis de uma letra e $var ou ${var} em shells.
Mas se você escrever $var em um Makefile, make entenderá como $(v)ar . Se você quiser passar um literal $ para o shell, precisará inseri-lo como $$ , como em $$var ou $${var} , para que ele se torne $var ou ${var} para o shell.
Além disso, make runs sh , não bash para interpretar esse código ( Editar , desculpe perdeu seu SHELL := /bin/bash acima, observe que muitos sistemas não têm bash em /bin se eles tiverem bash e := forem específicos do GNU), então você precisa usar a sintaxe sh lá. echo -n , read -s são zsh / bash sintaxe, não sh sintaxe.
O melhor aqui seria adicionar um script zsh / bash para fazer isso (e adicionar uma dependência de compilação em bash ). Algo como:
#! /usr/bin/env bash
printf 'Welcome\nPlease enter the MySQL host (default: localhost): '
read host || exit
host=${host:-localhost}
printf "Please enter the MySQL username: "
read username || exit
printf "Please enter the MySQL password:"
IFS= read -rs password || exit
printf '\n'
mv includes/config.php.example includes/config.php 2>/dev/null
repl=${password//\/\\}
repl=${repl//&/\&}
repl=${repl//:/\:}
{ rm includes/config.php &&
sed 's/"USER", ""/"USER", "'"$username"'"/g
s:"PASSWORD", "":"PASSWORD", "'"$repl"'"/g' > includes/config.php
} < includes/config.php || exit
mysql -u "$username" -p"$password" codeday-team < ./codeday-team.sql || exit
echo "Configuration complete. For further configuration options, check the config file"
Ele aborda mais alguns problemas:
- você precisa de
-rao ler a senha se quiser permitir que o usuário use barras invertidas em sua senha. - você precisa de
IFS=se quiser permitir que o usuário tenha uma senha que inicie ou termine em espaços em branco - o mesmo se aplica ao nome de usuário, mas aqui estamos supondo que o usuário não usará nada de bobo para o nome de usuário, e o tratamento em branco de decapagem e contrabarra pode ser visto como /feature/.
- seu
;trueapósmvnão faz o que você acha que faz. Ele não cancela o efeito da opçãoerrexit(paramakeimplementations que chamam o shell com-e). Você precisaria de||true. Aqui, não estamos usandoerrexit, mas fazendo o erro lidando com|| exitonde necessário. - Você precisa escapar da barra invertida,
&e dos:pattern:repl:separador (aqui:) ou não funcionará (e pode ter efeitos colaterais desagradáveis). -
Você não pode fazer
sed ... < file > file, poisfileseria truncado antes desedser iniciado. Algumas implementaçõessedsuportam uma opção-iou-i ''para isso. Como alternativa, você pode usarperl -pi. Aqui estamos fazendo o equivalente aperl -pimanualmente (excluir e recriar o arquivo de entrada depois de ter sido aberto para leitura), mas sem cuidar dos metadados do arquivo.Aqui, seria melhor usar o exemplo como entrada e o final como saída.
Ainda não resolve mais alguns problemas:
- o novo
config.phpé criado com permissões derivadas do atualumask, que provavelmente será legível por todos e de propriedade do usuário que estiver executandomake. Pode ser necessário adaptar oumaske / ou alterar a propriedade se oincludesdir não estiver restrito, pois esse arquivo contém informações confidenciais. - se a senha contiver
"caracteres, isso provavelmente será interrompido (desta vez paraphp). Você pode querer proibi-los (retornando um erro) ou adicionar outra camada de escape para eles na sintaxe correta para esse arquivophp. É provável que você tenha problemas semelhantes com a barra invertida e talvez queira também excluir caracteres não-ascii ou de controle. -
Passar a senha na linha de comando de
mysqlgeralmente é uma má ideia, já que isso mostra a saída deps -f. Seria melhor usar:mysql --defaults-file=<( printf '[client]\nuser=%s\npassword="%s"\n' "$username" "$password") ...printfsendo interno, ele não seria exibido empsoutput. -
a variável
$hostnão é usada. - solicitando ao usuário que isso significa que seu script não pode ser facilmente automatizado. Você poderia pegar a entrada de argumentos ou (melhor para a senha) com variáveis de ambiente.