
我有一個關於我的問題的最小示例,它正在嘗試安裝一個如下所示的 crontab:
FOO="foo\"bar\"bin"
0 0 1 * * ls
通過運行crontab crontab
(我將其放在文件名中crontab
)。它因以下錯誤而失敗:
% crontab crontab
"crontab":0: bad minute
crontab: errors in crontab file, can't install
這是轉義引號\"
引起的問題。
如何轉義 crontab 環境變數中的引號。
為了添加更多上下文,我不僅僅是在手動編寫的 crontab 中編寫變數。這個 crontab 是由每當(一個 Ruby gem),它有大約 70 個條目,它會取得所有環境變數並將它們作為變數放入 crontab 中,以便腳本可以使用所有憑證。問題是,最近我添加了一個包含引號的複雜的,這破壞了這個系統。
如果您好奇的話,產生變數的 Ruby 程式碼是:
ENV.each do |key, value|
env key.to_sym, value.inspect
end
答案1
好的做法cron
是:
- 建立腳本來運行命令
- 在腳本中設定變數。也可以使用帶有變數的外部檔案:
source /path/to/file/with/variables
- 使用命令的完整路徑
/usr/bin/ls
- 不要依賴您的使用者主目錄、路徑等
以下是如何建立ruby
在不同環境中執行程式的 shell 腳本的範例。
您cron
有如下記錄(範例):
0 1 * * * /path/script 1
0 2 * * * /path/script 2
腳本本身是這樣的:
#!/bin/bash
a=$1
case "$a" in
1) source /path/file1
/path/to/ruby <parameters>
;;
2) source /path/file2
/path/to/ruby <parameters>
;;
<snip>
*) # do something if parameter is not enumerated
;;
esac
並file1
包含類似的內容(範例)
RUBYVAR1_1=1
RUBYVAR1_2=2
和file2
RUBYVAR2_1=12
RUBYVAR2_2=22
答案2
crontab 中的活動列可以是環境設定或 cron 指令。環境設定的形式如下:
name = value
其中等號 (=) 周圍的空格是可選的,value 中任何後續的非前導空格都會成為指派給 name 的值的一部分。值字串可以放在引號中(單引號或雙引號,但要匹配)以保留前導或尾隨空格。
因此,用單引號將包含雙引號的字串括起來應該可以
使用 crontab 進行測試:
var = 'this"contains"quotes'
* * * * * /usr/bin/env >> /tmp/env
看起來它會正確地將雙引號存放在 var 中。
cat /tmp/env
HOME=/home/HBruijn
LANG=C.UTF-8
SHELL=/bin/sh
var=this"contains"quotes
但我也同意之前的回答和觀點; cron 不是一個合適的腳本環境,它只是一個古老的作業調度程序,有很多限制,您應該卸載任何類似複雜性的東西並將其包含在作業本身中。
答案3
據我所知,crontab 變數不能有引號,長度也不能超過 999 個字元。這個問題的答案是,這根本不可能。