menghindari tanda kutip ganda dan tanda persen (%) dalam cron

75

Perintah berikut ini berfungsi dari prompt tetapi tidak dari crontab.

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

Saya perlu menambahkannya ke cron harian.

shantanuo
sumber
Contoh Anda luar biasa,% dikelilingi oleh tanda kutip ganda, sederhana dan kembali. Meninggalkan harapan bahwa kutipan yang lolos bisa bekerja.
tuxayo

Jawaban:

126

Anda harus melarikan diri dari %pertanda. Mereka memiliki arti khusus dalam 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.
bmk
sumber
7
+1 Sangat menarik, saya juga tidak tahu itu. Terkejut saya belum mengalami ini.
Kyle Smith
3
Yah saya baru saja mengalami ini. Saya menggunakan date +%Fdan mendapatkan tempat
adamo
2
Apakah sintaks ini memiliki kegunaan yang bermanfaat? Dengan SHELL=/bin/bash, saya selalu dapat menulis ulang cat %Hello worldsebagai cat <<<'Hello world'. Saya tidak melihat perlunya sintaksis khusus.
Witiko
@Witiko Jika "sintaks khusus" yang Anda tanyakan adalah backslash untuk melarikan diri persen, maka pertanyaan OP sendiri adalah contoh di mana diperlukan: argumen perintah yang memerlukan persen, terutama program tanggal, yang akan cukup populer di perintah crontab. Jika Anda benar-benar bertanya mengapa cron memiliki gotcha ini di tempat pertama: yaitu: mengganti linefeed di tempat persen, maka saya kira begitu Anda dapat memasok, pada satu baris yang diperlukan crontab, "perintah" yang terdiri dari dua atau lebih banyak perintah tambahan.
gwideman
Yang terakhir. Dan, seperti yang saya sebutkan, orang dapat melakukan hal yang sama dengan bash. Tidak perlu membuang sintaks Cron.
Witiko
7

Ini tidak langsung menjawab pertanyaan Anda, tetapi saya sarankan Anda membuat file skrip di / usr / local / bin (atau ~ / bin atau apa pun yang sesuai) dan menyebutnya dari cron. Lebih mudah untuk menguji dan mengedit.

Randy Orrison
sumber
2
Dalam pengalaman saya, jauh lebih mudah untuk mempertahankan 50 baris dalam crontab daripada mempertahankan 50 file kecil. Anda tentu ingin mengubah skrip yang lebih panjang menjadi file skrip, tetapi melakukannya untuk one-liners mungkin merupakan kerja keras.
Witiko