Estou escrevendo um enorme script de fábrica de scripts, gerando muitos scripts de manutenção para meus servidores.
Até agora, escrevo algumas linhas que precisam ser escritas em uma linha com, echo -nepor exemplo,
echo -n "if (( " | sudo tee -a /usr/local/bin/upgradeAllServers &> /dev/null
# Generate exitCode check for each Server
IFS=" "
COUNT=0
while read -r name ipAddr
do
if(($COUNT != 0))
then
echo -n " || " | sudo tee -a /usr/local/bin/upgradeAllServers &> /dev/null
fi
echo -n "(\$"$name"_E != 0 && \$"$name"_E != 1)" | sudo tee -a /usr/local/bin/upgradeAllServers &> /dev/null
COUNT=$((COUNT+1))
JOBSDONE=$((JOBSDONE+1))
updateProgress $JOBCOUNT $JOBSDONE
done <<< "$(sudo cat /root/.virtualMachines)"
echo " ))" | sudo tee -a /usr/local/bin/upgradeAllServers &> /dev/null
isso gera um código (se houver, por exemplo, 2 servidores no meu arquivo de configuração), como
if (( ($server1_E != 0 && $server1_E != 1) || ($server2_E != 0 && $server2_E != 1) ))
Todos os outros blocos de código que não precisam dessa escrita em linha de código que eu produzo com os heredocs, já que os acho muito melhores para escrever e manter. Por exemplo, após o código superior, tenho o resto gerado como
cat << EOF | sudo tee -a /usr/local/bin/upgradeAllServers &> /dev/null
then
# Print out ExitCode legend
echo " ExitCode 42 - upgrade failed"
echo " ExitCode 43 - Upgrade failed"
echo " ExitCode 44 - Dist-Upgrade failed"
echo " ExitCode 45 - Autoremove failed"
echo ""
echo ""
fi
EOF
Portanto, o bloco de código final parece
if (( ($server1_E != 0 && $server1_E != 1) || ($server2_E != 0 && $server2_E != 1) ))
then
# Print out ExitCode legend
echo " ExitCode 42 - upgrade failed"
echo " ExitCode 43 - Upgrade failed"
echo " ExitCode 44 - Dist-Upgrade failed"
echo " ExitCode 45 - Autoremove failed"
echo ""
echo ""
fi
Minha pergunta
Existe uma maneira de um heredoc se comportar de maneira semelhante echo -nesem o símbolo de fim de linha?
sudo -u USERNAME em vez disso, consulte Como executo um comando 'sudo' dentro de um script? .
sudosem nome de usuário pede a senha, a menos que você a tenha digitado, há um atraso. É ainda pior se você não executar o script em um terminal, nem poderá ver a consulta da senha e ela simplesmente não funcionará. A sudo -uabordagem não apresenta nenhum desses problemas.
sudode um script, está fazendo errado: execute o script inteiro como root!