bash与环境变量

项目名称

文件名称

bash与环境变量

编制部门

后台运维

作者

丁正凯

当前版本

201807170922

受众范围

后台运维

文档控制

修改记录

日期

版本

修改类型

修改主要内容

作者

◆修改类型:A增加、B删除、C修改

审阅人

姓名

部门

职位

审阅签字

审阅时间

存档

存档时间

存放方式

存放地点、位置

备注

◆存放方式:A电子、B纸质

目录

1 参考 1

2 CentOS 5

2.1 interactive login shell 5

2.2 non-interactive login shell 5

2.3 interactive non-login shell 6

2.4 non-interactive non-login shell 6

3 Debian 7

3.1 interactive login shell 7

3.2 non-interactive login shell 7

3.3 interactive non-login shell 8

3.4 non-interactive non-login shell 8

4 测试与总结 8

4.1 配置方式 8

4.2 生效情况 8

4.2.1 CentOS 8

4.2.2 Debian 9

4.3 总结 9

  1. 参考

http://ahei.info/chinese-bash-man.htm

http://www.gnu.org/software/bash/manual/bashref.html

http://www.gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files

http://linux.vbird.org/linux_basic/0320bash.php#settings_bashrc

https://unix.stackexchange.com/questions/170493/login-non-login-and-interactive-non-interactive-shells

https://unix.stackexchange.com/questions/259617/are-there-non-interactive-login-shells

https://unix.stackexchange.com/questions/38175/difference-between-login-shell-and-non-login-shell

https://blog.csdn.net/wang_xijue/article/details/46820043

设置自动执行的任务遇到环境变量问题(如cron执行脚本找不到命令或脚本执行脚本找不到命令)没有执行成功时,检查环境变量配置的流程:

  1. 先判断是否是 login shell
  2. 再判断是否是 interactive shell
  3. CentOS
    1. interactive login shell

场景:输入用户名密码后取得的终端

  1. /etc/profile 最后调用 /etc/profile.d/*.sh
  2. /.bash_profile, ~/.bash_login, 和 ~/.profile, 从存在并且可读的第一个文件中读取并执行其中的命令。中间调用 ~/.bashrc——中间调用 /etc/bashrc 最后调用 /etc/profile.d/*.sh。

场景:输入用户名密码后取得的终端,执行类似bash xxx-script.sh或bash -c 'xx'。

  1. /etc/profile 最后调用 /etc/profile.d/*.sh
  2. .bash_profile, ~/.bash_login, 和 ~/.profile, 从存在并且可读的第一个文件中读取并执行其中的命令。中间调用 ~/.bashrc——中间调用 /etc/bashrc 最后调用 /etc/profile.d/*.sh。

图示同上interactive login shell。

场景:

  1. ~/.bashrc 中间调用 /etc/bashrc 最后调用 /etc/profile.d/*.sh。

场景:执行命令前没有任何通过登录获取终端或bash会话,如cron、开机启动的服务。注意和前3种类型的non-login区分。

使用BASH_ENV,不使用PATH寻找可执行文件。

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

  1. Debian

debian系统级的shell是dash(不是bash)

  1. /etc/profile

中间调用 /etc/bash.bashrc 和 /etc/profile.d/*.sh

  1. /.bash_profile, ~/.bash_login, 和 ~/.profile, 从存在并且可读的第一个文件中读取并执行其中的命令。中间调用 ~/.bashrc。

  1. /etc/profile

中间调用 /etc/bash.bashrc 和 /etc/profile.d/*.sh

  1. /.bash_profile, ~/.bash_login, 和 ~/.profile, 从存在并且可读的第一个文件中读取并执行其中的命令。中间调用 ~/.bashrc。

图示同上interactive login shell。

  1. /etc/bash.bashrc and ~/.bashrc。

使用BASH_ENV,不使用PATH寻找可执行文件。

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

  1. 测试与总结
    1. 配置方式

在/etc/profile.d/custom.sh配置export环境变量,配置alias别名。

alias

是否生效

interactive login shell

Ok

non-interactive login shell

ERR

interactive non-login shell

Ok

non-interactive non-login shell

ERR

export

是否生效

interactive login shell

Ok

non-interactive login shell

Ok

interactive non-login shell

Ok

non-interactive non-login shell

ERR

alias

是否生效

interactive login shell

OK

non-interactive login shell

ERR

interactive non-login shell

ERR

non-interactive non-login shell

ERR

export

是否生效

interactive login shell

OK

non-interactive login shell

OK

interactive non-login shell

OK

non-interactive non-login shell

ERR

export的环境变量,非交互-非登录shell不生效,如cron、开机启动的服务如tomcat。因此使用cron定时执行的脚本中需要先source该文件或脚本中先配置好环境变量、类似tomcat的有setenv.sh。

alias的别名,Debian非交互shell不生效,非登录shell不生效。CentOS非交互shell不生效。

针对Debian的alias可以考虑在用户的 .bashrc 或 /etc/bash.bashrc 其中之一添加代码如下

for i in /etc/profile.d/*.sh; do

if \[ \-r "$i" \]; then

    if \[ "$PS1" \]; then

        \. "$i"

    else

        \. "$i" >/dev/null

    fi

fi

done

效果如下图,注意红色线条

login shell

non-login shell