「at」(atd)を使用してスケジュールされたジョブを正しくスケジュールする方法は?またはbashで正しく引用/エスケープする方法

「at」(atd)を使用してスケジュールされたジョブを正しくスケジュールする方法は?またはbashで正しく引用/エスケープする方法

再起動後に「追加タスク」(ワンタイムタスク)を実行するタスクをスケジュールするために、「at」(atd)を使用してコマンドラインを作成する方法を探しています。私が今探しているのは、「星」のスケジュールに従って一緒に接続する方法です。

私の問題は、bashの引用/エスケープで迷子になったことです。

私が今まで持っていて手動で動作することは次のとおりです。

echo "somecommand -someOptions 2>&1 | mail -s \"$HOST after reboot: somecommand -someOptions\" [email protected]" | at now +5 minutes ;\
#do admin stuff before reboot in less than 5 mins here ;\
touch /fastboot ; reboot

言及したように、うまく動作します。これで、すべてを別の新しい「AT」コマンドにカプセル化して、手動で実行する必要なく、以前のコマンドラインを特定の開始時刻にスケジュールできるようになります。

私はすべてを他の "at"コマンドにカプセル化/含めることが可能でなければならないと思うので、正しく引用/エスケープする方法を理解したいと思います。

私はこれを試しました(動作しません):

echo "echo \"somecommand -someOptions 2>&1 | mail -s \\"$HOST after reboot: somecommand -someOptions\\" [email protected]\" | at now +5 minutes ;\
#do admin stuff before reboot in less than 5 mins here ;\
touch /fastboot ; reboot ; " | at now + 1 minute

再起動して再開する前に管理タスクを実行する2つのタスクをスケジュールしましたが、2番目の(後で)タスクはいくつかの誤った引用符/エスケープのためにスクランブル/衝突するようです。私はここで何が起こったのか、そして私が逃げている間に何が間違っていたのかをもっと知りたいです。この場合、変数拡張は必要ないので、外部で一重引用符を使用できるようですが、そこでも変数拡張を使用したいとしましょう。この場合、どのように正しくエスケープ/引用する必要がありますか?

ベストアンサー1

\\"何をすべきかを書くとき、バックスラッシュの二重引用符を忘れました\\\"。ただし、ここで説明されている3番目のタイプのシェル引用符を使用すると、これを回避できます。

at now + 1 minute <<\!
echo "somecommand -someOptions 2>&1 | mail -s \"$HOST after reboot: somecommand -someOptions\" [email protected]" | at now +5 minutes
#do admin stuff before reboot in less than 5 mins here
touch /fastboot ; reboot
!

おすすめ記事