2012-01-31 102 views
0

我一直在努力从一个不同的位置/服务器上运行的脚本(全部从svn检出)。要获得脚本目录(用于生成目录中的文件),我一直在使用这样的:Bash脚本 - 如何获取脚本目录,以便它在Cron运行

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

这个伟大的工程,但似乎并没有在crontab来执行。我已经确保脚本中没有相对路径,并且此脚本通过crontab工作,而将$ script_dir替换为该目录的路径。

有什么想法?

+0

'script_dir = $(dirname“$ 0”)''有什么问题? – tripleee 2012-01-31 22:17:56

回答

2

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

  1. 给(你在脚本中使用和其它命令)的完整路径的目录名称命令:script_dir="$(cd "$(/usr/bin/dirname "$0")" && pwd)"
  2. 明确设置PATH在开头的脚本:PATH=/usr/bin:/bin:/usr/sbin:/sbin(或类似的东西)
  3. 精确设置PATH在crontab文件:PATH=/usr/bin:/bin:/usr/sbin:/sbin(确保这条线是运行脚本中的条目)
+0

这个伎俩,谢谢! – zvxr 2012-02-03 18:52:17

0

只要给它一个,但你确定这条线不工作? 调试cronjobs非常棘手。

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

尝试使用sh和一个空的环境中执行脚本:

env - sh <script> 

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