เกิดอะไรขึ้นกับไวยากรณ์ cronjob ของฉันฉันพยายามใช้ backtick (`)?


31

นี่คือสิ่งที่ฉันต้องการอัตโนมัติ:

00 08 * * * psql -Uuser database < query.sql | mail somone@null.com -s "query for `date +%Y-%m-%dZ%I:%M`"

นี่คือข้อความแสดงข้อผิดพลาด:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file

2
นอกเหนือจากการให้ข้อผิดพลาดแล้วให้ลองใส่มันลงใน schell script มันจะแกล้ง crontab ให้เงอะงะและคุณสามารถเพิ่มความคิดเห็นและกำหนดค่าให้กับไฟล์สคริปต์ของคุณ
PeterMmm

คำตอบ:


67

จากcrontab (5) :

ฟิลด์ `'six' '(ส่วนที่เหลือของบรรทัด) ระบุคำสั่งที่จะรัน ส่วนคำสั่งทั้งหมดของบรรทัดจนถึงบรรทัดใหม่หรืออักขระ% จะถูกดำเนินการโดย / bin / sh หรือโดยเชลล์ที่ระบุในตัวแปร SHELL ของไฟล์ crontab Percent-signs (%) ในคำสั่งยกเว้นยกเว้น Escape ด้วย backslash () จะถูกเปลี่ยนเป็นอักขระบรรทัดใหม่และข้อมูลทั้งหมดหลังจาก% แรกจะถูกส่งไปยังคำสั่งเป็นอินพุตมาตรฐาน ไม่มีวิธีที่จะแยกบรรทัดคำสั่งเดียวออกเป็นหลาย ๆ บรรทัดเช่นเดียวกับการตามด้วยเชลล์ "\"

เพียงเพิ่มแบ็กสแลชก่อนเครื่องหมาย%:

00 08 * * * psql -Uuser database < query.sql | mail somone@null.com -s "query for `date +\%Y-\%m-\%dZ\%I:\%M`"

8

เพื่อแก้ไขปัญหาตัวหนี% ของคุณ date +%Y-%m-%dควรจะเป็นdate +\%Y-\%m-\%d

แต่น่าเสียดายที่คำตอบนี้เป็นเพียงเล็กน้อยปลาย แต่ปัญหาไม่ได้เป็นเส้นทางหรือ backticks - ปัญหาก็คือว่าตัวละครตัวร้อยละ '%' เป็นตัวละครพิเศษที่ใช้เพื่อแสดงถึงการขึ้นบรรทัดใหม่หรือ STDIN ในรายการ

สิ่งนี้ขัดแย้งกับอินพุตการจัดรูปแบบของdateคำสั่ง เช่นคำสั่งที่รวมถึง: date +%Y-%m-%dจะถูกตีความว่า:

date Y- m- d


4

ฉันมีปัญหามากมายกับ backticks ด้วย บางครั้งคุณต้องมีคำพูดและแบคทีกมากกว่าหนึ่งรายการ เพียงแทนที่พวกเขาด้วยราคา $ ()

ตัวอย่าง:

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

-Gilson Soares


1
+1 นี่คือรูปแบบที่โปรดปรานในทุกวันนี้
Dan Carley

4
แต่มันไม่มีส่วนเกี่ยวข้องกับคำถามของผู้ใช้
Aaron Brown

1
แน่นอนว่ามันเกี่ยวกับ backsticks อ่านคำถามอีกครั้ง
Sergio Abreu

ขอบคุณฉันใช้เวลาสักครู่ในการตระหนักถึง backticks ที่ทำลาย crons ของฉัน - ฉันเริ่มใช้ $ () กับสคริปต์ทั้งหมดของฉันตอนนี้ด้วย
Eric Kigathi

-2

มันไม่มีส่วนเกี่ยวข้องกับ backsticks สิ่งที่แย่คือ cron นั้นไม่เห็น PATH และคุณต้องบอก cron ว่า "PATH คืออะไร" ครั้งแล้วครั้งเล่าในสคริปต์ cron

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

และฉันชอบเขียนคำสั่งในไฟล์แทนที่จะส่งคำสั่งอย่างแท้จริงในบรรทัด cron มันมีความหรูหรามากกว่าที่จะมี

* * * * * /your/script/here

กว่า

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

บรรทัดเหล่านี้สามารถเข้าไปในไฟล์เดียวไฟล์ chmod + x และไฟล์นี้จะถูกเรียกใช้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.