Saya sedang menulis di skrip pabrik skrip besar yang menghasilkan banyak skrip pemeliharaan untuk server saya.
Sampai sekarang saya menulis beberapa baris yang perlu ditulis dalam satu baris dengan echo -ne
misalnya
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
ini menghasilkan saya (jika ada misalnya 2 server di file konfigurasi saya) seperti kode
if (( ($server1_E != 0 && $server1_E != 1) || ($server2_E != 0 && $server2_E != 1) ))
Semua blok kode lain yang tidak memerlukan penulisan inline kode yang saya hasilkan dengan heredocs ini karena saya menemukan cara yang lebih baik untuk menulis dan memelihara. Misal setelah kode atas saya memiliki sisanya dihasilkan seperti
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
Jadi blok kode akhir terlihat seperti
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
Pertanyaan saya:
Adakah cara heredoc berperilaku serupa echo -ne
tanpa simbol end-of-line?
sudo -u USERNAME
pada yang bukan, lihat Bagaimana cara menjalankan perintah 'sudo' dalam naskah? .
sudo
tanpa nama pengguna meminta kata sandi, kecuali jika Anda mengetikkannya ada penundaan. Lebih buruk lagi jika Anda tidak menjalankan skrip di terminal, maka Anda bahkan tidak bisa melihat permintaan kata sandi dan itu tidak akan berfungsi. The sudo -u
Pendekatan tidak memiliki masalah ini.
sudo
skrip yang salah: Jalankan keseluruhan skrip sebagai root!