J'écris sur un énorme script de fabrique de scripts générant beaucoup de scripts de maintenance pour mes serveurs.
Jusqu'à présent, j'écris quelques lignes qui doivent être écrites sur une seule ligne avec echo -ne
par exemple
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
cela me génère (s'il y a par exemple 2 serveurs dans mon fichier de configuration) du code comme
if (( ($server1_E != 0 && $server1_E != 1) || ($server2_E != 0 && $server2_E != 1) ))
Tous les autres blocs de code qui n'ont pas besoin de cette écriture de code en ligne que je produis avec heredocs car je les trouve bien meilleurs à écrire et à maintenir. Par exemple, après le code supérieur, j'ai le reste généré comme
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
Ainsi, le bloc de code final ressemble
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
Ma question
Existe-t-il un moyen pour un hérédoc de se comporter comme echo -ne
sans le symbole de fin de ligne?
sudo -u USERNAME
sur ce lieu, voir Comment puis-je exécuter une commande « sudo » dans un script? .
sudo
sans nom d'utilisateur demande le mot de passe, sauf si vous l'avez tapé, il y a un délai. C'est encore pire si vous n'exécutez pas le script dans un terminal, vous ne pouvez même pas voir la requête de mot de passe et cela ne fonctionnera tout simplement pas. L' sudo -u
approche n'a aucun de ces problèmes.
sudo
d'un script, vous le faites mal: exécutez le script entier en tant que root à la place!