我不完全理解man cron
和第一个符号的处理%
。
与大多数有关文件中 % 的问题不同crontab
,我实际上会喜欢使用 % 作为换行符。我需要对第一个 % 做什么,这样它就不会被解释为文字“%”符号,或者 stdin 的更改/重定向?我不太明白它在做什么以及如果我不需要它该怎么办。
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。那是对的吗?
答案1
在 crontab 中,时间规范之后的部分和第一个未转义的部分组成了要传递到 shell 的代码(作为和%
后面的参数)。接下来的内容首先构成要通过其标准输入馈送到该 shell 的行。sh
-c
%
实际上,使用 crontab 行,例如:
* * * * * shell code%line 1%line 2
cron
每分钟执行与以下 shell 代码等效的操作:
printf '%s\n' 'line 1' 'line 2' | sh -c 'shell code'
所以你不能真正使用它来将换行符存储在该变量中shell code
。
在这里,如果您希望将换行符存储在该代码的变量中,您可以这样做
* * * * * eval "$(printf 'nl="\n"')"; echo "blah${nl}blah"
但是,您可以使代码只是sh
,然后将代码提供给 stdin:
* * * * * sh%nl='%'%echo "blah${nl}blah"
在其中,cron
将运行,并且执行另一个sh -c sh
进程的标准输入将是:sh
sh
nl='
'
echo "blah${nl}blah"
另一种选择是告诉使用支持 ksh93 样式引号形式(如// )cron
的 shell,而不是使用 and 执行以下操作:$'...'
ksh93
zsh
bash
sh
SHELL=/bin/zsh
* * * * * nl=$'\n'; echo "blah${nl}blah"