Có gì sai với cú pháp cronjob của tôi, tôi đang cố gắng sử dụng backtick (`)?


31

Đây là những gì tôi muốn tự động hóa:

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

Đây là thông báo lỗi:

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

2
Ngoài lỗi đưa ra xem xét để đặt điều này trong một kịch bản schell. Nó sẽ giả vờ crontab vụng về và bạn có thể thêm nhận xét và cấu hình vào tệp tập lệnh của mình.
PeterMmm

Câu trả lời:


67

Từ crontab (5) :

Trường `` sixth '' (phần còn lại của dòng) chỉ định lệnh sẽ được chạy. Toàn bộ phần lệnh của dòng, tối đa một dòng mới hoặc% ký tự, sẽ được thực thi bởi / bin / sh hoặc bằng vỏ được chỉ định trong biến SHELL của tệp crontab. Phần trăm dấu (%) trong lệnh, trừ khi thoát bằng dấu gạch chéo ngược (), sẽ được thay đổi thành ký tự dòng mới và tất cả dữ liệu sau% đầu tiên sẽ được gửi đến lệnh dưới dạng đầu vào tiêu chuẩn. Không có cách nào để phân chia một dòng lệnh thành nhiều dòng, như dấu "\" của shell.

Chỉ cần thêm dấu gạch chéo ngược trước dấu hiệu%:

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

8

Để giải quyết vấn đề thoát% ký tự của bạn . date +%Y-%m-%dnên làdate +\%Y-\%m-\%d

Thật không may, câu trả lời này hơi muộn nhưng vấn đề không phải là PATH hay backticks - vấn đề đơn giản là phần trăm ký tự '%' là một ký tự đặc biệt được sử dụng để biểu thị NEWLINE hoặc STDIN trong các mục crontab .

Điều này mâu thuẫn với đầu vào định dạng của datelệnh. Vì vậy, một lệnh bao gồm: date +%Y-%m-%dsẽ được hiểu là:

date Y- m- d


4

Tôi cũng có rất nhiều vấn đề với backticks. Đôi khi bạn cần nhiều hơn một lần xuất hiện của dấu ngoặc kép và backticks. Chỉ cần thay thế chúng cho $ ().

Thí dụ:

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

-Gilson Soares


1
+1 Đây là cú pháp được ưa chuộng hiện nay.
Dan Carley

4
nhưng nó không liên quan gì đến câu hỏi của người dùng.
Aaron Brown

1
tất nhiên nó có, về backsticks, đọc lại câu hỏi.
Sergio Abreu

Cảm ơn, tôi đã mất một thời gian để nhận ra các backticks đang phá vỡ các con quạ của tôi - tôi cũng đã bắt đầu sử dụng $ () trong tất cả các kịch bản của mình
Eric Kigathi

-2

Nó không có gì để làm với backsticks. Một điều khủng khiếp là cron KHÔNG nhìn thấy ĐƯỜNG, và bạn PHẢI nói với cron "PATH là gì?" hơn và hơn trong các kịch bản cron.

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

Và tôi ủng hộ việc viết lệnh trong một tệp thay vì truyền lệnh theo nghĩa đen trong dòng cron. Nó thanh lịch hơn nhiều

* * * * * /your/script/here

hơn

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

những dòng này có thể đi vào bên trong một tệp, tệp chmod + x và tệp này sẽ được gọi.

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.