Я пишу огромный скрипт-фабрику сценариев, генерирующую множество сценариев обслуживания для моих серверов.
До сих пор я пишу несколько строк, которые нужно записать в одну строку, echo -ne
например,
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
это генерирует мне (если, например, в моем файле конфигурации 2 сервера)
if (( ($server1_E != 0 && $server1_E != 1) || ($server2_E != 0 && $server2_E != 1) ))
Все остальные блоки кода, которые не нуждаются во встроенном написании кода, который я создаю с помощью heredocs, так как я считаю, что их лучше писать и поддерживать. Например, после верхнего кода у меня есть остальные сгенерированные как
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
Таким образом, окончательный блок кода выглядит
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
Мой вопрос
Есть ли способ, с помощью которого heredoc ведет себя так же, как и echo -ne
без символа конца строки?
sudo -u USERNAME
на том , что вместо того, чтобы , увидеть Как запустить команду «» SUDO внутри сценария? ,
sudo
без имени пользователя запрашивает пароль, если вы не ввели его с задержкой. Еще хуже, если вы не запустите скрипт в терминале, тогда вы даже не увидите запрос пароля, и он просто не будет работать. sudo -u
Подход не имеет какой - либо из этих проблем.
sudo
скрипт, вы делаете это неправильно: вместо этого запустите весь скрипт как root!