Piszę na ogromnym skrypcie fabrycznym, generującym wiele skryptów konserwacyjnych dla moich serwerów.
Do tej pory piszę kilka wierszy, które należy zapisać w jednym wierszu echo -nenp
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
generuje to (jeśli w moim pliku konfiguracyjnym są np. 2 serwery) kod podobny do
if (( ($server1_E != 0 && $server1_E != 1) || ($server2_E != 0 && $server2_E != 1) ))
Wszystkie inne bloki kodu, które nie wymagają tego wbudowanego pisania kodu, tworzę z heredocami, ponieważ uważam, że są one o wiele lepsze do pisania i zarządzania. Np. Po górnym kodzie mam resztę wygenerowaną jak
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
Tak wygląda ostatni blok kodu
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
Moje pytanie
Czy istnieje sposób, aby heredok zachowywał się podobnie jak echo -nebez symbolu końca linii?
sudo -u USERNAMEna który zamiast zobacz Jak uruchomić polecenie „sudo” wewnątrz skryptu? .
sudobez nazwy użytkownika prosi o hasło, chyba że je wpiszesz. Gorzej, jeśli nie uruchomisz skryptu w terminalu, wtedy nawet nie zobaczysz zapytania o hasło i po prostu nie zadziała. sudo -uPodejście nie ma żadnego z tych problemów.
sudoskryptu, robisz to źle: Zamiast tego uruchom cały skrypt jako root!