更新:

更新:

我不完全理解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进程的标准输入将是:shsh

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

另一种选择是告诉使用支持 ksh93 样式引号形式(如// )cron的 shell,而不是使用 and 执行以下操作:$'...'ksh93zshbashsh

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

相关内容