Linux 环境变量
/etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置.
/etc/bashrc: 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.
~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.严谨的说应该每次显示source 该环境变量,以免出现莫名其妙的问题,曾经在shell执行和数据库安装上都踩过坑。
~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取.
~/.bash_logout: 当每次退出系统(退出bash shell)时,执行该文件.
用户目录下.bashrc和.bash_profile的区别是?
从下面这段可以看出,会先检查/etc/bashrc这个文件,这里其实可以修改为用户目录下的bashrc。以此来起到和其他用户变量隔离的作用。这是个人见解,仅供参考
postgresql]$ more /home/gpadmin/.bashrc # .bashrc # User specific aliases and functions alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi source /usr/local/greenplum-cc-web-2.0.0-build-32/gpcc_path.sh GPPERFMONHOME=/usr/local/greenplum-cc-web-2.0.0-build-32 PATH=$GPPERFMONHOME/bin:$PATH LD_LIBRARY_PATH=$GPPERFMONHOME/lib:$LD_LIBRARY_PATH source /usr/local/greenplum-db/greenplum_path.sh
另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系.
更为直观的示图
bash的每种模式会读取其所在列的内容,首先执行A,然后是B,C。而B1,B2和B3表示只会执行第一个存在的文件:
+----------------+--------+-----------+---------------+ | | login |interactive|non-interactive| | | |non-login |non-login | +----------------+--------+-----------+---------------+ |/etc/profile | A | | | +----------------+--------+-----------+---------------+ |/etc/bash.bashrc| | A | | +----------------+--------+-----------+---------------+ |~/.bashrc | | B | | +----------------+--------+-----------+---------------+ |~/.bash_profile | B1 | | | +----------------+--------+-----------+---------------+ |~/.bash_login | B2 | | | +----------------+--------+-----------+---------------+ |~/.profile | B3 | | | +----------------+--------+-----------+---------------+ |BASH_ENV | | | A | +----------------+--------+-----------+---------------+
典型模式总结
non-interactive + non-login shell
创建这种shell典型有两种方式:
- bash script.sh
- ssh user@remote command
interactive + login shell
- 用户直接登陆到机器获得的第一个shell
- 用户使用 ssh user@remote 获得的shell
non-interactive + login shell
非交互式的登陆shell,这种是不太常见的情况。一种创建此shell的方法为: bash -l script.sh ,前面提到过-l参数是将shell作为一个login shell启动,而执行脚本又使它为non-interactive shell。
interactive + non-login shell
在一个已有shell中运行 bash,此时会打开一个交互式的shell,而因为不再需要登陆,因此不是login shell。
为了更好的理清这几种模式,下面我们对一些典型的启动方式各属于什么模式进行一个总结:
- 登陆机器后的第一个shell:login + interactive
- 新启动一个shell进程,如运行 bash :non-login + interactive
- 执行脚本,如 bash script.sh :non-login + non-interactive
- 运行头部有如 #!/usr/bin/env bash 的可执行文件,如 ./executable :non-login + non-interactive
- 通过ssh登陆到远程主机:login + interactive
- 远程执行脚本,如 ssh user@remote script.sh :non-login + non-interactive
- 远程执行脚本,同时请求控制台,如 ssh user@remote -t 'echo $PWD' :non-login + interactive
- 在图形化界面中打开terminal:
- Linux上: non-login + interactive
- Mac OS X上: login + interactive