Ste*_*ven 3 linux shell scripting environment-variables
原谅我的无知,但我对shell脚本和在Linux中使用环境变量有些新意.
我有一个执行MySQL数据库备份的脚本.我在脚本中有以下几行用于记录数据库的成功转储:
output=`date; echo "Database export successful from $ENV_HOSTNAME to $BACKUP_HOSTNAME"`
echo $output >> /var/log/errorLog
Run Code Online (Sandbox Code Playgroud)
我在/ etc/profile中定义了变量(ENV_HOSTNAME和BACKUP_HOSTNAME),如下所示:
export ENV_HOSTNAME="env1.somename.com"
export BACKUP_HOSTNAME="env2.somename.com"
Run Code Online (Sandbox Code Playgroud)
当我调用printenv时,我可以看到列出的这些变量,并且当我运行此脚本(以root身份)时,变量值正确显示在日志文件中.但是,当我将此脚本设置为使用cron运行时,变量值不会出现在日志文件中.我知道脚本运行是因为我可以看到日期和字符串的其余部分,但变量是空白的:
Fri Nov 6 22:31:05 EST 2009 Database export successful from to
Run Code Online (Sandbox Code Playgroud)
我确定我在这里遗漏了一些简单的东西,所以请提前感谢您的帮助.
有你的问题:cron没有运行/ etc/profile.
cron只用很少的环境设置启动; 你需要的任何其他东西,你必须自己设置,所以习惯上让cron调用脚本来处理设置,然后是主要动作.
天儿真好,
当cron执行它时,它只给你一组最小的env.瓦尔.
一个技巧是创建一个包含要设置的变量的shell脚本,然后让所有cron脚本在启动时获取该脚本.
例如,在正在运行的cron脚本的顶部添加以下内容.
. my_cronenv.sh
您的shell脚本my_cronenv.sh应该导出您要为cron作业设置的所有变量.
编辑:忘了说这个的另一大优点是你只需要更改一个脚本,如果你正在运行你的cronjobs的环境发生了变化,而不是必须搜索一堆cron脚本来制作相同的编辑.
另一件事是养成一直提到你的环境的习惯是个好主意.使用大括号的vars.例如,$ {ENV_HOSTNAME}而不是$ ENV_HOSTNAME.
养成这种习惯意味着当你使用环境变量的值时,你不会被抓住.例如,$ {ENV_HOSTNAME} _RSV将按预期扩展,而不是$ ENV_HOSTNAME_RSV.注意在某些系统上,单个字母变量可以在没有括号的情况下按预期工作,但我发现更好地养成习惯.它还使您的shell脚本的任何未来读者都明白您的意图.
干杯,