在我的 crontab 中,我设置了以下 bash 函数并将其应用于我的工作。表示要在日志中添加时间戳。
adddate() {
while IFS= read -r line; do
printf '%s %s\n' "$(date)" "$line";
done
}
30 06 * * * root $binPath/zsh/test.zsh | adddate 1>>$logPath/log.csv 2>>$errorLogPath/error.txt
但是当我看到error.txt
bash 功能不能很好地工作时。
/bin/bash: adddate: command not found
这一切的根本原因在哪里呢?
如果有人有意见,请告诉我。
谢谢
答案1
Cron 不接受 shell 函数,创建一个类似的脚本
#!/bin/bash
adddate() {
while IFS= read -r line; do
printf '%s %s\n' "$(date)" "$line";
done
}
$binPath/zsh/test.zsh | adddate 1>>$logPath/log.csv 2>>$errorLogPath/error.txt
并将其放入 cron 中。
(我假设您在这里使用了$binPath
and$logPath
来解决这个问题。如果不是这种情况,您必须在脚本中设置它们)
设置SHELL=/bin/bash
在你的crontab
可能是使用 shell 函数的一种方式。
(我没有尝试过,如果它有效的话我会感到惊讶)。但即使它有效,我也肯定不会建议它。
答案2
您可以使用别名代替函数:
在您的主目录中添加 .profile 或 .bashrc 文件:
alias adddate="while IFS= read -r line; do printf '%s %s\n' "$(date)" "$line"; done"
然后在你的 crontab 中:
30 06 * * * shopt -s expand_aliases; root $binPath/zsh/test.zsh | adddate 1>>$logPath/log.csv 2>>$errorLogPath/error.txt
通常 crontab (换句话说,非交互式 shell)也不允许使用别名,但您可以通过 激活它shopt -s expand_aliases
。