Tôi đang viết trên một tập lệnh nhà máy kịch bản lớn tạo ra rất nhiều tập lệnh bảo trì cho các máy chủ của tôi.
Cho đến bây giờ tôi viết một số dòng cần được viết thành một dòng với echo -ne
ví dụ
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
điều này tạo ra tôi (nếu có 2 máy chủ trong tệp cấu hình của tôi) mã như
if (( ($server1_E != 0 && $server1_E != 1) || ($server2_E != 0 && $server2_E != 1) ))
Tất cả các khối mã khác không cần cách viết mã nội tuyến này do tôi sản xuất với heredocs vì tôi thấy chúng tốt hơn để viết và duy trì. Ví dụ: sau đoạn mã trên tôi có phần còn lại được tạo như
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
Vì vậy, khối mã cuối cùng trông giống như
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
Câu hỏi của tôi
Có cách nào để một di sản hành xử tương tự như echo -ne
không có biểu tượng cuối dòng không?
sudo -u USERNAME
vào đó , hãy sử dụng lệnh 'sudo' bên trong tập lệnh? .
sudo
không có tên người dùng yêu cầu mật khẩu, trừ khi bạn nhập nó vào đó có độ trễ. Thậm chí còn tệ hơn nếu bạn không chạy tập lệnh trong một thiết bị đầu cuối, sau đó bạn thậm chí không thể nhìn thấy truy vấn mật khẩu và nó sẽ không hoạt động. Cách sudo -u
tiếp cận không có bất kỳ vấn đề nào trong số này.
sudo
trong một tập lệnh, bạn đang làm sai: Thay vào đó, hãy chạy toàn bộ tập lệnh dưới dạng root!