当我通过 crontab 启动脚本时出现错误排版:未找到?

当我通过 crontab 启动脚本时出现错误排版:未找到?

我使用这部分代码在 script.sh 的配置中设置默认值

# Copyright (c) 2015 
# Licence MIT ( http://choosealicense.com/licenses/mit/ ).
#!/bin/sh

typeset -A config # init array
config=( # set default values in config array
    # chemin du dossier de log
    [log]=$SCRIPTPATH"/logs"
    # chemin du dossier local 
    [local]=""
)

当我使用 shell 控制台启动脚本时,一切正常并且正常工作,但如果我想使用 crontab 安排启动,我会收到错误

/var/********/script.sh: 148: /var/********/script.sh: typeset: not found
/var/********/script.sh: 149: /var/********/script.sh: Syntax error: "(" unexpected

这是我的 crontab 行

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

* * * * * root /var/********/script.sh -c file.conf > /dev/null 2> /var/********/errors.log

你能解释一下为什么吗?谢谢

答案1

您的脚本假设它在支持数组的 shell 下运行,例如 bash 或 ksh。缺少 she-bang 行意味着 cron(默认情况下)将调用 /bin/sh 来执行脚本。SHELL=/bin/shcrontab 中的具体设置会强制执行此行为。

如果您以交互方式使用 bash,请将 bash 指定为 she-bang 行——第一行必须是:

#!/bin/bash

不是第二行或后续行。

或者,通过设置以下方式在 cron 作业中专门调用 bash:

SHELL=/bin/bash

或与:

* * * * * root bash /var/********/script.sh -c file.conf > /dev/null 2> /var/********/errors.log

相关内容