如何處理 cron 命令中的第一個 ‘%’?
我不完全理解
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"
在那個中,
cron
will 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"