您的位置:首页 > 运维架构 > Linux

Crontab任务执行脚本source无法获取环境变量

2017-09-01 10:38 225 查看
最近在使用Linux的过程中,需要通过crontab任务启动一个脚本,并且在脚本中需要使用到本地的环境变量。查了很多的网上资料,都说使用“source”或者“.”就可以了,如下所示:

#! /bin/bash
source ~/.bashrc
......


但是,实际执行过程中发现,并没有获取到对应的环境变量。经过好几天排查发现,在.bashrc文件开始的地方发现这样几行代码(不同的Linux系统可能有不同的实现,但都是相同的用处。):

# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac


这几行代码的意思是,如果不是用交互式方式执行该文件,则直接退出。默认情况下,用crontab任务启动脚本是关闭该交互式选项的。因此,当使用crontab任务执行脚本时,会直接return,因此不会执行.bashrc之后的代码。有两种办法解决:

直接注释掉.bashrc中的几行代码。这样做,之后所有的crontab任务都可以直接使用source来获取.bashrc中设置的环境变量,但是可能会对其他地方的产生影响,毕竟.bashrc中设置的环境变量可能会覆盖掉其他的环境变量;

可以在crontab执行的脚本中,手动设置交互式方式选项为打开状态,如下所示。不过这种方式只对当前脚本有效。

#! /bin/bash

set -i

source ~/.bashrc

......


PS:通过在命令行输入“shopt”命令,可以看到当前shell的相关配置项。可以通过set命令对这些选项进行设置on/off。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux