Bash脚本 - 如何获取脚本目录以便它在Cron中运行

时间:2012-01-31 22:13:35

标签: bash cron

我一直在研究一个从几个不同的位置/服务器运行的脚本(全部从svn检出)。要获取脚本的目录(用于在目录中生成文件),我一直在使用它:

script_dir="$( cd "$( dirname "$0" )" && pwd )"

这很好用,但似乎没有在crontab中执行。我已经确保脚本中没有使用相对路径,并且当使用目录的路径替换$ script_dir时,此脚本通过crontab工作。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

dirname可能不在cron作业的默认PATH中。我不知道你的系统,但在OS X上,dirname在/ usr / bin中,而不是在cron的默认路径中。如果这是问题,有3种简单的方法可以解决这个问题:

  1. 提供dirname命令的完整路径(以及您在脚本中使用的其他命令):script_dir="$( cd "$( /usr/bin/dirname "$0" )" && pwd )"
  2. 在脚本开头明确设置PATH:PATH=/usr/bin:/bin:/usr/sbin:/sbin(或类似的东西)
  3. 在crontab文件中明确设置PATH:PATH=/usr/bin:/bin:/usr/sbin:/sbin(确保此行之前运行脚本的条目)

答案 1 :(得分:0)

只是为了给它一个,你确定这条线不起作用吗? 调试cronjobs非常棘手。

crontab使用sh shell除非你改变它,如果你有来自另一个shell的任何东西,比如从bash命令重定向,它将不起作用。

尝试使用sh和空环境执行脚本:

env - sh <script>

我认为这是你可以模仿crontab行为的最接近的。 但路径是第一个问题,所以一定要把绝对路径放在那里。