'which' 命令通过 cron 不返回任何内容,但通过控制台运行

'which' 命令通过 cron 不返回任何内容,但通过控制台运行

我在 haXe + Neko 中编写了一个小实用程序,需要执行一些 GIT 命令。为了避免对 GIT 可执行文件的路径进行硬编码,我想使用哪个命令来查找它的位置。从控制台手动运行时,一切都按预期工作,但当应用程序在 cron 作业上运行时则不然。

我知道环境受限(这里或者这里),当您使用 cron 运行脚本时,但仍然惊讶地发现它不起作用:

/usr/bin/which git >> /home/user/git.txt

文本文件已创建,但内容为空。再次,从控制台运行时,它按预期工作。

有什么想法吗?我正在运行 OS X Leopard,希望这能有所帮助。

谢谢 : )

胡安

答案1

如果“which”可以找到可执行文件,那么运行 cron 命令的 shell 解释器也可以找到。所以我不明白你为什么要为此使用“which”。但也许你有一些不明显的原因。

'which' 命令使用 $PATH 中列出的目录来搜索命令的第一次出现。很可能 PATH 的设置与您所想的并不相符。尝试将 '/usr/bin/env >> /home/user/you/env.txt' 添加到您的 crontab 中,以便今天(一分钟后)运行。然后查看 /home/user/you/env.txt 以查看 PATH 的设置。如果该 PATH 不适合您,您可能必须将所有命令放在一个小的 shell 脚本中,您可以在其中自行设置 PATH。您还可以在该 env.txt 文件中查找其他导出的环境变量,因为这可能会派上用场,具体取决于您想通过 crontab 执行的操作。

答案2

git 实际位于哪里(即,如果您/usr/bin/which git从控制台运行,它会打印什么)?如果它不在 $PATH 目录中(在我的 Snow Leopard 机器上只是 /usr/bin 和 /bin),则/usr/bin/which找不到它,您需要对其进行硬编码或添加一行,例如

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

到 crontab 文件。

答案3

这能起到作用吗?

/usr/bin/env  git

env 命令负责查找命令,并且它本身始终位于 /usr/bin 中(我被告知...)这是 Python 脚本中的一个常见技巧,由于不同的发行版将 python 放在不同位置,所以这是必要的,但没有人愿意费力寻找位置。

相关内容