Apa yang salah dengan sintaks cronjob saya, saya mencoba menggunakan backtick (`)?

31

Inilah yang saya ingin otomatiskan:

00 08 * * * psql -Uuser database < query.sql | mail [email protected] -s "query for `date +%Y-%m-%dZ%I:%M`"

Inilah pesan kesalahannya:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file
Terry G Lorber
sumber
2
Terlepas dari kesalahan memberi pertimbangkan untuk menempatkan ini dalam skrip schell. Ini akan berpura-pura crontab menjadi canggung dan Anda dapat menambahkan komentar dan mengkonfigurasi file skrip Anda.
PeterMmm

Jawaban:

67

Dari crontab (5) :

Kolom `` keenam '' (sisa baris) menentukan perintah yang akan dijalankan. Seluruh bagian perintah dari baris, hingga baris baru atau karakter%, akan dieksekusi oleh / bin / sh atau oleh shell yang ditentukan dalam variabel SHELL dari file crontab. Tanda-persen (%) dalam perintah, kecuali lolos dengan backslash (), akan diubah menjadi karakter baris baru, dan semua data setelah% pertama akan dikirim ke perintah sebagai input standar. Tidak ada cara untuk membagi satu baris perintah menjadi beberapa baris, seperti shell yang mengekor "\".

Cukup tambahkan garis miring terbalik sebelum tanda%:

00 08 * * * psql -Uuser database < query.sql | mail [email protected] -s "query for `date +\%Y-\%m-\%dZ\%I:\%M`"
Juliano
sumber
8

Untuk menyelesaikan masalah, lepaskan% karakter Anda . date +%Y-%m-%dseharusnyadate +\%Y-\%m-\%d

Sayangnya jawaban ini agak terlambat tetapi masalahnya bukan PATH atau backticks - masalahnya hanya bahwa karakter% '%' adalah karakter khusus yang digunakan untuk menunjukkan NEWLINE atau STDIN dalam entri crontab .

Ini bertentangan dengan input pemformatan dateperintah. Dengan demikian perintah yang meliputi: date +%Y-%m-%dakan diartikan sebagai:

date Y- m- d

Eric Kigathi
sumber
4

Saya punya banyak masalah dengan backticks juga. Terkadang Anda membutuhkan lebih dari satu kemunculan kutipan dan backticks. Cukup ganti mereka dengan $ ().

Contoh:

export NOW=`date`
by
export NOW=$(date)

-Gilson Soares

Guilsson
sumber
1
+1 Ini adalah sintaks yang disukai saat ini.
Dan Carley
4
tetapi tidak ada hubungannya dengan pertanyaan pengguna.
Aaron Brown
1
Tentu saja, ini tentang backsticks, baca lagi pertanyaannya.
Sergio Abreu
Terima kasih, butuh beberapa saat untuk menyadari bahwa backticks telah melanggar cron saya - Saya sudah mulai menggunakan $ () dalam semua skrip saya sekarang juga
Eric Kigathi
-2

Itu tidak ada hubungannya dengan backsticks. Suatu hal yang mengerikan adalah bahwa cron JANGAN melihat PATH, dan Anda HARUS memberi tahu cron "apa PATH itu?" berulang-ulang dalam skrip cron.

PATH=/bin:/usr/bin:/usr/sbin
* * * * * /your/script/here

Dan saya lebih suka menulis perintah di file daripada melewati perintah secara harfiah di baris cron. Jauh lebih elegan untuk dimiliki

* * * * * /your/script/here

dari

* * * * * perl -e '$@#$@$%%@' | grep -e '@#$@$#$@' | sed s/asfdf/asdfa/

baris ini dapat masuk ke dalam satu file, file chmod + x, dan file ini untuk dipanggil.

Sergio Abreu
sumber