thoát dấu ngoặc kép và dấu phần trăm (%) trong cron


75

Lệnh sau hoạt động từ dấu nhắc nhưng không phải từ crontab.

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

Tôi cần thêm nó vào cron hàng ngày.


Ví dụ của bạn thật tuyệt vời,% được bao quanh bởi dấu ngoặc kép, đơn giản và ngược lại. Không có hy vọng rằng trích dẫn thoát có thể làm việc.
tuxayo

Câu trả lời:


126

Bạn phải thoát khỏi các %dấu hiệu. Chúng có một ý nghĩa đặc biệt trong 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 Rất xen kẽ, tôi cũng không biết điều đó. Ngạc nhiên là tôi không chạy vào đây.
Kyle Smith

3
Vâng, tôi vừa mới chạy vào đây. Tôi đã sử dụng date +%Fvà không nhận được bất cứ nơi nào
adamo

2
Liệu cú pháp này có sử dụng hữu ích? Với SHELL=/bin/bash, tôi luôn có thể viết lại cat %Hello worldnhư cat <<<'Hello world'. Tôi không thấy sự cần thiết cho cú pháp đặc biệt.
Witiko

@Witiko Nếu "cú pháp đặc biệt" mà bạn đang hỏi là dấu gạch chéo ngược để thoát phần trăm, thì câu hỏi của OP là một ví dụ cần thiết: các đối số lệnh yêu cầu phần trăm, đáng chú ý là chương trình ngày, khá phổ biến trong một lệnh crontab. Nếu bạn thực sự hỏi tại sao cron có gotcha này ở vị trí đầu tiên: ví dụ: thay thế linefeed thay cho phần trăm, thì tôi đoán nó để bạn có thể cung cấp, trên một dòng duy nhất mà crontab yêu cầu, một "lệnh" bao gồm hai hoặc nhiều lệnh công ty con.
gwideman

Cái sau Và, như tôi đã đề cập, người ta có thể làm tương tự với bash. Không cần xả rác cú pháp của Cron.
Witiko

7

Điều này không trực tiếp trả lời câu hỏi của bạn, nhưng tôi sẽ đề nghị bạn tạo một tệp tập lệnh trong / usr / local / bin (hoặc ~ / bin hoặc bất cứ điều gì phù hợp) và gọi nó từ cron. Dễ dàng hơn để kiểm tra và chỉnh sửa.


2
Theo kinh nghiệm của tôi, việc duy trì 50 dòng trong crontab dễ dàng hơn nhiều so với việc duy trì 50 tệp nhỏ. Chắc chắn bạn sẽ muốn biến các tập lệnh dài hơn thành tập tin tập lệnh, nhưng làm như vậy cho một lớp có thể là quá mức cần thiết.
Witiko
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.