Cron

如何處理 cron 命令中的第一個 ‘%’?

  • January 27, 2021

我不完全理解man cron,以及第一個%符號的處理。

與大多數關於crontab文件中 % 的問題不同,我實際上使用 % 作為換行符。我需要對第一個 % 做什麼,以便它不會被解釋為文字“%”符號或標準輸入的更改/重定向?我不太明白它在做什麼以及如果我不需要它該怎麼做。

crontab 行範例:

0 0 * * *  root  newline="%" %echo "this${newline}that" %command2 %command3

(我知道我可以使用分號或 \n 來表示一些,但為了這個例子而使用 %-newline)

更新:

由於評論似乎沒有抓住重點,這就是問題所在:

人 crontab(5)

“第六”欄位(該行的其餘部分)指定要執行的命令。該行的整個命令部分,直到換行符或“%”字元,將由 /bin/sh 或由 cronfile 的 SHELL 變數中指定的 shell 執行。

…命令中的“%”字元,除非用反斜杠 () 轉義,否則將更改為換行符 …

…並且第一個 % 之後的所有數據都將作為標準輸入發送到命令。

我很清楚,正如所寫的那樣,我給出的 crontab 行目前不起作用。我理解在第一個-> 換行符(第一個粗體點)*之後未轉義的 % 。*我不明白的是第二個粗體點。

如果我只想使用 % 插入換行符,這意味著我需要對第一個未轉義的“%”做一些不同的事情,以避免它被視為“將所有後續數據作為標準輸入發送到命令”的意外觸發器. 這可能意味著在命令的開頭放置一個額外的“%”,或者其他什麼,以確保第一個 % 不會中斷命令的其餘部分處理。

具有 2 或 3 個未轉義 % 的行的一些範例,顯示 cron 將如何解釋第一個未轉義 % 以及它在命令處理中的作用,將是理想的。

另外,第二個粗體字是字面意思嗎?如果是這樣,我可以使用第二個後續未轉義的 % 作為換行符,基本上我的命令可以在 % -> 換行符替換之後包含多行腳本,然後再傳遞給 shell。那是對的嗎?

在 crontab 中,時間規範之後直到第一個未轉義的部分%構成要傳遞給 shell 的程式碼(作為 and 之後的參數sh-c。之後的內容首先%構成要通過其標準輸入提供給該 shell 的行。

實際上,使用 crontab 行,例如:

* * * * * shell code%line 1%line 2

cron每分鐘都相當於這個shell程式碼:

printf '%s\n' 'line 1' 'line 2' | sh -c 'shell code'

因此,您不能真正使用它將換行符儲存在 that 的變數中shell code

在這裡,如果您想在該程式碼的變數中儲存換行符,您可以執行

* * * * * eval "$(printf 'nl="\n"')"; echo "blah${nl}blah"

但是,您可以將程式碼設置為 just sh,然後將程式碼輸入標準輸入:

* * * * * sh%nl='%'%echo "blah${nl}blah"

在那個中,cronwill run ,執行另一個sh -c sh的程序的標準輸入將是:sh``sh

nl='
'
echo "blah${nl}blah"

另一種選擇是告訴cron使用支持 ksh93 樣式$'...'的引號形式(如ksh93/ zsh/ bash)的 shell,而不是sh並執行以下操作:

SHELL=/bin/zsh
* * * * * nl=$'\n'; echo "blah${nl}blah"

引用自:https://unix.stackexchange.com/questions/631280