如何在 crontab 中加入引號的環境變數?

如何在 crontab 中加入引號的環境變數?

我有一個關於我的問題的最小示例,它正在嘗試安裝一個如下所示的 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是:

  1. 建立腳本來運行命令
  2. 在腳本中設定變數。也可以使用帶有變數的外部檔案:source /path/to/file/with/variables
  3. 使用命令的完整路徑/usr/bin/ls
  4. 不要依賴您的使用者主目錄、路徑等

以下是如何建立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

man 5 crontab

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 個字元。這個問題的答案是,這根本不可能。

相關內容