我使用这部分代码在 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/sh
crontab 中的具体设置会强制执行此行为。
如果您以交互方式使用 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