cronで二重引用符とパーセント記号(%)をエスケープする


75

次のコマンドはプロンプトからは機能しますが、crontabからは機能しません。

 grep abc  /var/log/messages | grep "`date '+%B %d'`" | mail -s"abc log of `hostname`" shantanu.oak+`hostname`@gmail.com

毎日のcronに追加する必要があります。


あなたの例は素晴らしいです。%は二重引用符、単純引用符、および逆引用符で囲まれています。引用符のエスケープが機能する可能性を期待しないでください。
tuxayo

回答:


126

あなたは%兆候をエスケープする必要があります。それらはcrontabで特別な意味を持ちます:

man (5) crontab:

Percent-signs (%) in the command, unless escaped with backslash (\), 
will be changed into newline characters, and all data after the 
first % will be sent to the command as standard input.

7
+1非常に興味深い、私もそれを知りませんでした。驚いたことに、私はこれに遭遇していません。
カイルスミス

3
さて、私はこれに遭遇しました。私が使っていたdate +%Fし、どこにもなっていなかった
アダモ

2
この構文には便利な用途がありますか?でSHELL=/bin/bash、私はいつも書き換えることができるcat %Hello worldようcat <<<'Hello world'。特別な構文は必要ありません。
ウィティコ

@Witikoあなたが尋ねている「特別な構文」がパーセントをエスケープするバックスラッシュである場合、OP自身の質問はそれが必要な例です:パーセントを必要とするコマンド引数、特に日付プログラムは、 crontabコマンド。cronが最初にこの落とし穴を持っている理由を実際に質問している場合:つまり:パーセントの代わりに改行を使用する場合、crontabが必要とする1行で、2つの「コマンド」を提供できると思います以上の補助コマンド。
-gwideman

後者。そして、私が述べたように、bashでも同じことができます。Cronの構文を散らかす必要はありません。
ウィティコ

7

これはあなたの質問に直接答えるものではありませんが、スクリプトファイルを/ usr / local / bin(または〜/ binまたは適切なもの)に作成し、cronから呼び出すことをお勧めします。テストと編集が簡単です。


2
私の経験では、50個の小さなファイルを維持するよりも、crontabで50行を維持する方がはるかに簡単です。長いスクリプトを確実にスクリプトファイルに変換することもできますが、1行の場合はやり過ぎかもしれません。
ウィティコ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.