Estoy escribiendo en un gran script de fábrica de scripts que genera muchos scripts de mantenimiento para mis servidores.
Hasta ahora escribo algunas líneas que deben escribirse en una línea con, echo -ne
por ejemplo,
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
esto me genera un código (si hay, por ejemplo, 2 servidores en mi archivo de configuración) como
if (( ($server1_E != 0 && $server1_E != 1) || ($server2_E != 0 && $server2_E != 1) ))
Todos los demás bloques de código que no necesitan esta escritura en línea del código que produzco con heredocs ya que los encuentro mucho mejores para escribir y mantener. Por ejemplo, después del código superior tengo el resto generado 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
Entonces el bloque de código final se ve así
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
Mi pregunta
¿Hay alguna manera de que un heredoc se comporte de manera similar echo -ne
sin el símbolo de fin de línea?
sudo -u USERNAME
de eso en su lugar, ver ¿Cómo ejecuto un comando 'sudo' dentro de un script? .
sudo
sin nombre de usuario solicita la contraseña, a menos que la haya ingresado, hay un retraso. Es aún peor si no ejecuta el script en una terminal, entonces ni siquiera puede ver la consulta de contraseña y simplemente no funcionará. El sudo -u
enfoque no tiene ninguno de estos problemas.
sudo
un script, lo está haciendo mal: en su lugar, ejecute todo el script como root.