การหลีกเลี่ยงการเสนอราคาซ้ำและเครื่องหมายเปอร์เซ็นต์ (%) ใน 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

คุณต้องหลบหนี%สัญญาณ พวกเขามีความหมายพิเศษใน crontabs:

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 รบกวนมากฉันก็ไม่รู้เหมือนกัน ประหลาดใจฉันไม่ได้พบสิ่งนี้
Kyle Smith

3
ฉันเพิ่งพบเจอสิ่งนี้ ฉันใช้งานอยู่date +%Fและไม่ได้รับเลย
adamo

2
ไวยากรณ์นี้มีประโยชน์ใช้หรือไม่? กับSHELL=/bin/bashฉันเสมอสามารถเขียนเป็นcat %Hello world cat <<<'Hello world'ฉันไม่เห็นความจำเป็นในการใช้ไวยากรณ์พิเศษ
Witiko

@ วิทิโกถ้า "ซินแท็กซ์พิเศษ" ที่คุณถามคือแบ็กสแลชเพื่อหลบหนีเปอร์เซ็นต์ดังนั้นคำถามของ OP คือตัวอย่างที่ต้องการ: อาร์กิวเมนต์ของคำสั่งที่ต้องการเปอร์เซ็นต์โดยเฉพาะโปรแกรมวันที่ซึ่งค่อนข้างเป็นที่นิยมใน คำสั่ง crontab หากคุณถามว่าทำไม cron มี gotcha นี้ตั้งแต่แรก: เช่น: แทนที่ linefeed แทนเปอร์เซ็นต์แล้วฉันเดาว่ามันจะให้คุณจัดหาได้ในบรรทัดเดียวที่ crontab ต้องการ "คำสั่ง" ที่ประกอบด้วยสอง หรือคำสั่งย่อยเพิ่มเติม
gwideman

หลัง. และอย่างที่ฉันได้กล่าวไปเราสามารถทำเช่นเดียวกันกับ bash ไม่จำเป็นต้องทิ้งไวยากรณ์ของ Cron
Witiko

7

สิ่งนี้ไม่ได้ตอบคำถามของคุณโดยตรง แต่ฉันขอแนะนำให้คุณสร้างไฟล์สคริปต์ใน / usr / local / bin (หรือ ~ / bin หรืออะไรก็ตามที่เหมาะสม) และเรียกมันจาก cron ง่ายต่อการทดสอบและแก้ไข


2
จากประสบการณ์ของฉันมันง่ายกว่ามากที่จะรักษา 50 บรรทัดใน crontab มากกว่าเพื่อรักษา 50 ไฟล์เล็ก ๆ คุณจะต้องการเปลี่ยนสคริปต์ให้ยาวขึ้นเป็นไฟล์สคริปต์อย่างแน่นอน แต่การทำเช่นนั้นสำหรับผู้ที่ใช้ liners คนหนึ่งอาจเป็นการ overkill
Witiko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.