私は、サーバー用の多くのメンテナンススクリプトを生成する巨大なスクリプトファクトリスクリプトを書いています。
今までは、echo -ne
たとえば、1行で記述する必要がある行をいくつか書きました。
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
私の質問行末記号なしの
ように、ヒアドキュメントを動作させる方法はありecho -ne
ますか?
sudo -u USERNAME
上のそれは代わりに、見私はスクリプト内で「sudoの」コマンドを実行するにはどうすればよいですか?。
sudo
ます。ユーザー名なしでスクリプトを入力すると、遅延を入力しない限り、パスワードを要求されます。ターミナルでスクリプトを実行しないと、さらに悪いことに、パスワードクエリも表示されず、機能しません。sudo -u
アプローチは、これらの問題のいずれかを持っていません。
sudo
スクリプトで必要な場合、それは間違っています:代わりにスクリプト全体をルートとして実行してください!