几句话说清Bash Shell环境变量

一、环境变量的种类

环境变量在Linux系统中的重要性不必多说,以下就以CentOS7为例,详细阐述系统的环境变量。当用户登录Linux系统启动一个bash shell时,系统默认会在几个文件中查找命令,这些文件就被称为环境文件。bash shell查找的环境文件取决于启动bash shell的方式。bash shell的启动方式可分为以下3种:
1. 用户登陆时作为默认登陆shell。
2. 作为非登陆shell的交互式shell(比如登陆后通过bash启动的子shell)。
3. 作为运行脚本的非交互shell。
以下就上述3种shell的环境变量文件查找进行详细说明。

二、3种shell的环境变量文件

1.登陆shell
当一个用户登陆Linux系统时,首先会检查/etc/profile文件(也会根据该文件的设置检查/etc/profile.d目录下的所有文件),/etc/profile文件是系统上默认的bash shell主启动文件,每个登录用户都会执行这个启动文件。
其次,会检查用户的专属启动文件,大多数Linux发行版只用到下面4个启动文件中的1~2个,这4个启动文件起到一个共同的作用:定义用户专属的环境变量。
(1) $HOME/.bash_profile
(2) $HOME/.bashrc
(3) $HOME/.bash_login
(4) $HOME/.profile
通常shell会按照下列顺序,找到第一个被找到的文件,余下的则会被忽略:
(1) $HOME/.bash_profile
(2) $HOME/.bash_login
(3) $HOME/.profile
可以发现,上述3个文件中并没有$HOME/.bashrc,这是因为该文件通常通过其他文件运行。

[[email protected] ~]# vim .bash_profile   

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

可以看到$HOME/.bash_profile其实是读取了$HOME/.bashrc文件。
2.交互式shell进程
当你的shell不是登陆系统时启动的(比如在系统内输入bash命令启动的子shell),此时启动的shell则成为交互式shell,因为该shell同样可以提供一个命令提示符来输入命令。此时与登陆shell的区别在于:不会检查
/etc/profile文件和/etc/profile.d目录下的所有文件,只会按顺序检查
(1) $HOME/.bash_profile
(2) $HOME/.bash_login
(3) $HOME/.profile
通常情况下,只检查$HOME/.bashrc文件。
3.非交互式shell
系统在执行脚本时用到的就是这种shell,他没有命令提示符,bash会通过BASH_ENV环境变量来检查要启动的文件,但CentOS系统中默认该变量为空

[[email protected] ~]# echo $BASH_ENV

[[email protected] ~]# 

此时的环境变量则为继承父shell的(脚本是当前shell中启动的一个子进程),需要注意的是:如果父shell中定义但未导出的环境变量属于局部变量,子shell不能继承。

三、总结

通过前文知道了环境变量文件启动的条件,通常情况下,个人永久环境变量存放在$HOME/.bashrc下,这一点适用于所有类型的shell进程;对于全局变量(所有linux用户都需要用到的变量)可以放在/etc/profile文件中,但建议存放在/etc/profile.d目录下一个以.sh结尾的文件中,它的好处是当系统版本升级时,/etc/profile文件会随之更新,定制的变量设置则会清空。

原文地址:http://blog.51cto.com/arkling/2322362

时间: 2024-10-08 22:46:07

几句话说清Bash Shell环境变量的相关文章

bash shell环境变量

$* 将所有命令行参数当做单个文本值包含 [email protected] 将所有命令行参数当做独立的文本值包含 $# 命令行参数数目 $? 最近使用的前端进程的退出状态码 $- 当前命令选项标记 $$ 当前shell的进程ID(PID) $! 最近执行的后台进程PID $0 来自命令行的命令名称 $_ shell的绝对路径名 BASH 用来调用shell的全文件名 BASH_ARGC 当前子函数中的参数数目 BASH_ARGV 含有所有指定命令行参数的数组 BASH_COMMAND 当前正在

Linux编程 12 (默认shell环境变量, PATH变量重要讲解)

一 .概述 默认情况下, bash shell会用一些特定的环境变量来定义系统的环境.这些默认环境变量可以理解是上篇所讲的系统全局环境变量. 1.1 bash  shell支持的Bourne变量 Bourne shell 是 UNIX 最初使用的 shell.下面例举几个常用的变量名. 变量名 描述 HOME 当前用户的主目录 PATH Shell查找命令的目录列表,由冒号分隔 PS1 Shell命令行界面的主提示符 PS2 Shell命令行界面的次提示符 如下图所示:使用echo 输出该变量名

linux基础——bash shell环境配置

想要用好bash shell,首先得搞清楚bash shell环境的配置,只有配置好了,我们用起来才会得心应手,要想配置好,必须了解清楚bash配置文件的类型,再根据实际需求做一些相应的添加或修改就可以了.一.bash的配置文件(一)按生效范围划分:全局配置.个人配置 1.全局配置:  /etc/profile  /etc/profile.d/*.sh  /etc/bashrc 2.个人配置:  ~/.bash_profile  ~/.bashrc (二)按功能划分:profiile类.bash

Bash shell和变量详解

本文的结构:bash shell简介-->变量和变量操作.数组-->bash的环境配置文件分析 什么是shell: 操作系统是一组软件,用于控制整个硬件和管理系统活动,若直接使用操作系统,操作不当会导致系统崩溃,用户不可随意操作,所以通过"shell"将我们输入的命令与内核通信,让内核准确的控制硬件工作 shell是在操作系统上开发的应用程序,是用户可操作的最外层,也就是"shell"壳 什么是bash Bourne Again SHell,Bourne

bash的环境变量配置文件

日期: 2015年08月30日 bash的配置文件 bash的配置文件用来配置bash的使用环境,在系统中保存这诸多事先定义好的变量 bash的环境变量常见的有: PATH:命令搜索路径 HISTFILE:命令历史的保存位置 SHELL:当前用户使用的 HOME:当前用户的家目录 变量的类型: 本地变量:只对当前shell进程有效,对其子shell以及其它shell都无效: 定义变量: [set]Var_Name="Value" 引用变量: ${Var_Name} 撤销变量: unse

学习鸟哥私房菜--linux bash 的环境变量ps1设置

bash里边的变量ps1是用户平时的提示符,系统默认为[[email protected] 工作目录]$.关于ps1的相关介绍详见:http://www.cnblogs.com/starspace/archive/2009/02/21/1395382.html 文章里边介绍了要想ps1的修改在重启有效需要将它写入~/.bash_profile中,但是这是针对login shell的(即各种tty终端界面等),对于进入xwindow启动的命令行终端这样的nonlogin shell就不管用了,这是

Shell环境变量以及set,env,export的区别

shell环境变量的分类以及set env export的区别: set:显示(设置)shell变量 包括的私有变量以及用户变量,不同类的shell有不同的私有变量 bash,ksh,csh每中shell私有变量都不一样 env:显示(设置)用户变量变量 export:显示(设置)当前导出成用户变量的shell变量. 举个例子来讲: [www.linuxidc.com@linuxidc ~]$ aaa=bbb –shell变量设定 [www.linuxidc.com@linuxidc ~]$ e

Shell 环境变量 & 参数变量

环境变量 $HOME 当前用户的家目录 $PATH 以冒号分隔的用来搜索命令的目录列表 $PS1 命令提示符,通常是$字符,但在bash中,可以使用一些更复杂的值.例如,字符串[\[email protected]\h \w]$就是一个流行的默认值,它给出用户名.机器名和当前目录名,当然也包括一个$提示符. $SP2 二级提示符,用来提示后续的输入,通常是>字符 $IFS 输入域提示符.当shell读取输入时,它给出用来分隔单词的一组字符,它们通常时空格.制表符和换行符 $0 shell脚本的名

linux使用c shell 、b shell 环境变量的问题

(睡醒午觉后,头脑特别清晰,于是整理一篇把曹同学的昨天问题解答了^_^,收集资料的过程,也是学习的过程) 背景: 昨天快下班时,每次赶燕郊班车的曹同学都会准时跑掉,可是都已经快7点了,曹同学还在座位无动于衷,这很反常,过了一小会,曹同学跑过来. 曹同学:我犯错误了~~~把一台linux机器搞挂了~~~ me:10.10.0.5?告警中层? 曹同学:是的 me:挂了是什么情况? 曹同学:把mqadmin用户改成c shell后,所有命令都失效了... me:(觉得很神奇,但只要不是丢文件,只是登录