Shell的环境变量
bash是Bourne Shell的GNU扩展,除了继承了sh的所有特点以外,还增加了很多特性和功能。由login启动的bash是作为一个登录shell启动的,它继承了getty设置的TERM、PATH等环境变量,其中PATH
对于普通用户为"/bin:/usr/bin:/usr/local/bin",
对于root用户为"/sbin:/bin:/usr/sbin:/usr/bin"。
bash作为登录shell,它将首先寻找/etc/profile脚本文件,并执行它;
然后如果存在~/.bash_profile,则执行它,否则执行 ~/.bash_login,如果该文件也不存在,则执行~/.profile文件。然后bash将作为一个交互式shell执行~/.bashrc文件(如果存在的话),很多系统中,~/.bashrc都将启动/etc/bashrc作为系统范围内的配置文件。
系统登录时,会检查的文档:
1. /etc/profile:首先,系统会检查这个文件,以定义如下这些变量:PATH、USER、LOGNAME、MAIL、HOSTNAME、HISTSIZE、INPUTRC。还指定了 umask 和 ulimit 的设定,ulimit是用来限制一个 shell 能建立的进程数量,以避免系统资源被无限制的消耗。最后,它还会检查并执行 /etc/profile.d/*.sh 那些 script,有兴趣的话可以追踪看看。
2. ~/.bash_profile:定义 USERNAME、BASH_ENV、PATH。其中的 PATH 除了现有的 $PATH 之外,还会再加入使用者相关的路径,你会发现 root 和普通帐号的路径是不一样的;而 BASH_ENV 呢,仔细点看,是下一个要检查的文档:
3. ~/.bashrc: 首先是alias (别名)设定。然后有一行:. /etc/bashrc 。在 shell script 中,用一个小数点后跟一个空格再指向另外一个 script,意思是同时执行那个 script 并采用那里的变数设定。
4. /etc/bashrc:基本上,这里的设定,是所有使用者在获得 shell 的时候都会采用的。这里指定了一些 terminal 设定,以及 shell 提示字符等等。
5. ~/.bash_login:如果 ~/.bash_profile 不存在,则使用这个文档。
6. ~/.profile:如果 ~/.bash_profile 和 ~/.bash_login 都不存在,则使用这个文档。
7. ~/.bash_logout:这个文档通常只有一个命令:clear,也就是把屏幕显示的内容清掉。如果要在登出 shell 的时候,执行一些动作,例如:清空临时文档(假如你使用了临时文档)、还原某些设定、或是执行某些备份之类的。
你可以通过修改上面这些文件,来调整你进入shell后的变数值。一般使用者可以修改其家目录( ~/ )中的文件,以进行个人化的设定;而作为 root,你可以修改 /etc/下面的文件,设定大家共用的变数值。至於 bash 的变数值如何设定?有哪些变数?各变数的功能如何?你可以执行 man bash 参考手册资料。
一旦修改了 /etc/profile 或 ~/.bash_profile 文件,其新设定要在下次登录的时候才生效。如果你不想退出,又想使用新设定,那可以用 source 命令来抓取:source ~/.bash_profile
不同的shell设置环境变量也不相同。举个例子, 在如tcsh 和 csh这样的C-Style shell, 您必须使用setenv去设置环境变量。 而在如sh和bash这样的Bourne shell, 您必须使用export去设置当前环境变量。
举个例子,要去设置或改变EDITOR环境变量, 在csh或tcsh下将EDITOR设为 /usr/local/bin/emacs:
需要: % setenv EDITOR /usr/local/bin/emacs
而在Bourne shell下,则是:
% export EDITOR="/usr/local/bin/emacs
Shell的系统变量
Shell常用的系统变量并不多,但却十分有用,特别是在做一些参数检测的时候。下面是Shell常用的系统变量
表示方法 描述
$n $1 表示第一个参数,$2 表示第二个参数 ...
$# 命令行参数的个数
$0 当前程序的名称
$? 前一个命令或函数的返回码
$* 以"参数1 参数2 ... " 形式保存所有参数
$@ 以"参数1" "参数2" ... 形式保存所有参数
$$ 本程序的(进程ID号)PID
$! 上一个命令的PID