2013-03-21 92 views
21

這裏設置爲我的cron作業:cron作業沒有得到環境變量的.bashrc

[email protected]:~$ crontab -l 
* * * * * /bin/bash -l -c 'source ~/.bashrc; echo $EDITOR > /tmp/cronjob.test' 

和內部~/.bashrc文件,我已經export EDITOR=vim,但在最後/tmp/cronjob.test文件,它仍然是空的?

那麼如何獲取環境變量(在.bashrc文件中設置)並將其用於我的cron作業?

[email protected]:~$ lsb_release -a 
No LSB modules are available. 
Distributor ID: Ubuntu 
Description: Ubuntu 12.04 LTS 
Release:  12.04 
Codename:  precise 
[email protected]:~$ 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 
+0

如果你把'cat〜/ .bashrc'放到臨時文件中會發生什麼? – Alex 2013-03-21 21:13:29

+0

'cat〜/ .bashrc'是什麼意思?它有一行:'export EDITOR = vim'。我在問爲什麼'echo'命令不會選擇'$ EDITOR'環境變量。 – 2013-03-21 21:17:01

+0

對不清楚,在cron條目中,而不是文件的'source',使用'cat'來確認它可以被'cron'讀取。 – Alex 2013-03-21 21:22:00

回答

41

source ~/.bashrc無法正常工作的原因是您的~/.bashrc(Ubuntu 12.04中的默認值之一)中的內容。如果你在這看你會看到線5和6如下:

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

PS1變量被設置爲一個交互的shell,所以當通過cron運行它的缺席,即使您正在執行它作爲登錄shell 。這是通過產生的文件的內容證實了/bin/bash -l -c -x 'source ~/.bashrc; echo $EDITOR > /tmp/cronjob.test'

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

爲了source ~/.bashrc工作,註釋掉在~/.bashrc檢查的PS1變量的存在行:

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

這將使bash執行~/.bashrc的全部內容通過cron

+6

或者在爲''.bashrc'文件創建源文件之前將'$ PS1'設置爲某個任意值;這樣你就不必改變'.bashrc'。 – 2013-03-26 00:41:58

+0

這對我有效 - 我不知道爲什麼它是這樣設置的,但它似乎已經完成了嘗試其他東西幾個小時後的伎倆! – Avishai 2013-07-23 00:49:04

+0

由於某種原因,這對Debian來說不起作用。我仍然沒有在cronjobs中獲得我的'〜/ .bashrc'。 – chovy 2014-11-08 10:36:12

1

我只是想一個文件.env_setup_rc文件只有一行export EDITOR=vim,令人驚訝它的工作。

所以我想.bashrc與cron job bash命令衝突。

8

@alex提供的答案是正確的,但在Ubuntu 13.10代碼已被修改了一些。沒有$ PS1變量,但是在第6-9行中有一個代碼

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

只是註釋掉返回工作的行。即下面的代碼工作

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