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
-r
ao 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
;true
apósmv
não faz o que você acha que faz. Ele não cancela o efeito da opçãoerrexit
(paramake
implementations que chamam o shell com-e
). Você precisaria de||true
. Aqui, não estamos usandoerrexit
, mas fazendo o erro lidando com|| exit
onde 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
, poisfile
seria truncado antes desed
ser iniciado. Algumas implementaçõessed
suportam uma opção-i
ou-i ''
para isso. Como alternativa, você pode usarperl -pi
. Aqui estamos fazendo o equivalente aperl -pi
manualmente (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 oumask
e / ou alterar a propriedade se oincludes
dir 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
mysql
geralmente é 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") ...
printf
sendo interno, ele não seria exibido emps
output. -
a variável
$host
nã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.