31

这是我的 cron 工作:

plee@dragon:~$ crontab -l
* * * * * /bin/bash -l -c 'source ~/.bashrc; echo $EDITOR > /tmp/cronjob.test'

和里面的~/.bashrc文件,我有export EDITOR=vim,但在最终的/tmp/cronjob.test文件中,它仍然是空的?

那么如何获取环境变量(在.bashrc文件中设置)并在我的 cron 作业中使用它?

plee@dragon:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04 LTS
Release:        12.04
Codename:       precise
plee@dragon:~$ uname -a
Linux dragon 3.2.0-26-generic-pae #41-Ubuntu SMP Thu Jun 14 16:45:14 UTC 2012 i686 i686 i386 GNU/Linux

如果使用这个:

* * * * * /bin/bash -l -c -x 'source ~/.bashrc; echo $EDITOR > /tmp/cronjob.test' 2> /tmp/cron.debug.res

/tmp/cron.debug.res

...
++ return 0
+ source /home/plee/.bashrc
++ '[' -z '' ']'
++ return
+ echo

顺便说一句,该.bashrc文件是 Ubuntu 12.04 附带的默认文件,除了我添加了一行export EDITOR=vim.

如果我不使用 cron 作业,则直接在命令行上执行此操作:

source .bashrc; echo $EDITOR # Output: vim
4

3 回答 3

48

source ~/.bashrc不工作的原因是你的内容~/.bashrc(默认来自 Ubuntu 12.04)。如果您查看它,您将在第 5 行和第 6 行看到以下内容:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

PS1变量是为交互式 shell 设置的,因此在运行时它不存在 via cron,即使您将其作为登录 shell 执行。由以下文件生成的文件内容证实了这一点/bin/bash -l -c -x 'source ~/.bashrc; echo $EDITOR > /tmp/cronjob.test'

+ source /home/plee/.bashrc
++ '[' -z '' ']'
++ return

要进行source ~/.bashrc工作,请注释掉检查PS1变量是否存在的行~/.bashrc

#[ -z "$PS1" ] && return

这将bash执行~/.bashrcvia的全部内容cron

于 2013-03-22T15:27:47.483 回答
11

@alex 提供的答案是正确的,但在 Ubuntu 13.10 中,代码已稍作修改。没有 $PS1 变量,但在第 6-9 行有一个代码

case $- in 
   *i*) ;;       
   *) return;; 
esac

只需注释掉返回工作的行。即下面的代码有效

case $- in 
   *i*) ;;       
#   *) return;; 
esac
于 2014-12-08T10:28:56.543 回答
1

我刚刚尝试了一个.env_setup_rc只有一行的文件文件export EDITOR=vim,令人惊讶的是它正在工作。

所以我猜这.bashrc与 cron job bash 命令有冲突。

于 2013-03-21T21:52:53.330 回答