【发布时间】:2016-03-02 11:14:48
【问题描述】:
我有一个 cron 作业来运行一个名为 sedcmd.sh 的 sed shell 来预处理一些 json 数据。当我在正确的目录中时,我使用
手动运行它. ./sedcmd.sh
而且它有效。外壳本身工作正常。 作为参考,里面的命令之一看起来像
sed -i '/^\s*$/d' /home/school/Desktop/Programs/rawjsondata.txt
我的 cronjob 看起来像
5 * * * * . ./home/school/Desktop/Programs/sedcmd.sh
我收到错误“未找到此类文件或目录”。我究竟做错了什么。我已经对任何随机拼写错误进行了三次检查。即使我给出了整个文件路径,我似乎也无法从任何其他目录运行 sedcmd.sh,所以它肯定是我做错了。我对解决方案的想法是
- 我应该将 sedcmd.sh 添加到我的 $PATH 或 bashrc 中,这样我就可以从任何地方调用它。我不知道该怎么做。 或者
- 弄清楚如何从 crontab 中正确调用它。我也不知道该怎么做。
【问题讨论】:
-
如果将 contrab 条目更改为
5 * * * * /home/school/Desktop/Programs/sedcmd.sh(不带点)怎么办? -
修复了它。为什么呢?我认为这些点是调用 shell 所必需的。
-
仅当您调用的是同一目录中的文件时。看看here
-
@JoaoMorais :您的建议是正确的,但您的理由是错误的。呼叫
. /path/to/scriptdir/sedcmd.sh是source /path/to/scriptdir/sedcmd.sh的别名。source或.在当前环境和任何 env 中运行指定的脚本。sedcmd.sh(在这种情况下)中设置的变量现在可用于当前的 shell 进程。如果 env cmds 类似于export var=value,则$var被导出到主进程的所有子 shell。 (但不是父母,好像经常希望的那样)。祝大家好运。 -
@Sam :总而言之,一般做法是在顶部的源脚本中设置项目特定变量,使用
. /path/to/scriptToSource或source /path/to/scriptToSource。通常避免使用像source ./scriptToSource这样的用法,因为脚本必须存在于进程的当前目录中。从 crontab 执行的脚本(如./script)很可能位于 crontab 条目所有者的 $HOME 目录中。所以你不能依赖它。祝你好运!