linux 环境变量和Bash

linux环境变量与Bash
参考资料:
http://blog.csdn.net/ddviplinux/article/details/4280433
http://blog.sina.com.cn/s/blog_5420e00001017z66.html
http://www.cnblogs.com/cxz2009/archive/2010/11/04/1868987.html
http://www.cnblogs.com/napoleon_liu/archive/2011/04/01/2001886.html
http://www.cnblogs.com/growup/archive/2011/07/02/2096142.html
一.环境变量简介
Linux是一个多用户的操作系统。每个用户登录系统后,都会有一个专用的运行环境。通常每个用户默认的环境都
是相同的,这个默认环境实际上就是一组环境变量的定义。
环境变量是全局的,设置好的环境变量可以被所有当前用户所运行的程序所使用。
用户可以对自己的运行环境进行定制,其方法就是修改相应的系统环境变量。
常见的环境变量:
$PATH:决定了shell将到哪些目录中寻找命令或程序
$HOME:当前用户主目录
$MAIL:是指当前用户的邮件存放目录。
$SHELL:是指当前用户用的是哪种Shell。
$HISTSIZE:是指保存历史命令记录的条数
$LOGNAME:是指当前用户的登录名。
$HOSTNAME:是指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。
$LANG/LANGUGE:是和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。
$PS1:是基本提示符,对于root用户是#,对于普通用户是$,也可以使用一些更复杂的值。
$PS2:是附属提示符,默认是“>”。可以通过修改此环境变量来修改当前的命令符,比如下列命令会将提示符
              修改成字符串“Hello,My NewPrompt :) ”。# PS1=" Hello,My NewPrompt :) "
$IFS:  输入域分隔符。当shell读取输入时,用来分隔单词的一组字符,它们通常是空格、制表符和换行符。
$0:     shell脚本的名字。
二.Bash(Bourne-Again Shell)简介
Bash是许多Linux平台的内定Shell,事实上,还有许多传统UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh
等等。Shell Script大致都类同,当您学会一种Shell以后,其它的Shell会很快就上手。
大多数的时候,一个Shell Script通常可以在很多种Shell上使用。
通常而言,shell的功能是从终端或其它输入取得命令行,将其解析为一系列操作指令,调用系统内核或相应的
外部程序执行,然后将执行结果返回给终端或其它输出。因此,实现一个简单的shell是一项容易的工作。
但bash的功能不仅限于此,它支持用管道和重定向协同执行命令,提供了强大的脚本编程能力,
具备作业管理功能。一般的Linux发行版中,bash的可执行文件往往是/bin中最大的几个实用程序之一,
客观反映了它的复杂性。
三.Bash实现原理简介
bash使用GNU Readline库处理用户命令输入,Readline提供类似于vi或emacs的行编辑功能。
bash运行时的调度中心是其主控循环。主控循环的功能较为简单,它循环读取用户(或脚本)输入,传递给
语法分析器,同时处理下层递归返回的错误。
语法分析器对文本形式的输入首先进行通配符、别名、算术和变量展开等工作,然后通过命令生成器得到
规范的命令结构,并由专门的重定向处理机制填写重定向语义,交由命令执行器执行。命令执行器依据
命令种类不同,执行内部命令函数、外部程序或文件系统调用。在命令执行过程中,执行器要对系统信号
进行捕获和处理。在支持作业管理的操作系统中,命令执行器将进程信息加入作业控制机制,并允许用户
使用内部命令或键盘信号来启停作业。如果在不支持作业管理的操作系统中编译bash,会使用另一套接口
相同的机制对进程信息进行简单的维护。
四.Shell和环境变量的关系
环境变量是和Shell紧密相关的,环境变量是通过Shell命令来设置的。用户登录系统后就启动了一个Shell。
对于Linux来说一般是bash,但也可以重新设定或切换到其它的 Shell。
设置好的环境变量又可以被所有当前用户所运行的程序所使用。对于bash这个Shell程序来说,
可以通过变量名来访问相应的环境变量。
Linux 的环境变量具有继承性,即子shell 会继承父shell 的环境变量。
当前shell中的变量也叫本地变量,很显然本地变量中肯定包含环境变量。Linux 的本地变量的非环境变量
不具备继承性。
五.环境变量的设置
在Ubuntu中有如下几个文件可以设置环境变量
1./etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,
包含了对shell和其他一些实用程序起作用的重要环境变量的初始设置。当用户第一次登录时,该文件被执行。
它是为所有用户定制环境变量.
2./etc/environment:在登录时操作系统使用的第二个文件,系统在读取你自己的profile前, 设置此文件中的
环境变量.它也是为所有用户定制环境变量.
3./etc/base.bashrc: 每个使用bash 的用户在登陆以后执行完/etc/profile 中内容以后都会执行此文件,在
新开一个bash的时候也会执行此文件。因此,如果你想让每个使用bash的用户每新开一个bash和每次登陆都
执行某些操作,或者给他们定义一些新的环境变量,就可以在这个里面设置。
它是为所有用户的bash shell定制环境变量。
4.~/.profile:在登录时用到的第三个文件是.profile文件,每个用户都可使用该文件输入专用于自己
使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。
它是为当前用户定制环境变量。
5、~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取.
它是为当前用户的bash shell定制环境变量。
几个环境变量的优先级:
1>2>4
以上环境变量设置方式的区别如下:
/etc/profile  /etc/environment
全局用户,应用于所有的Shell及其他需要使用环境变量的应用程序。仅在登陆时执行一次。
~/.profile
当前用户,应用于所有的Shell及其他需要使用环境变量的应用程序。仅在登陆时执行一次。
/etc/bash.bashrc
全局用户,仅应用于Bash Shell。登录时以及每次打开新的shell时都会执行
~/.bashrc
当前用户,仅应用于Bash Sell。登录时以及每次打开新的shell时都会执行。
用户登录后加载profile和bashrc的流程如下:
1)/etc/profile——————>/etc/profile.d/*.sh
2)~/.profile——————>~/.bashrc——————>/etc/bash.bashrc
说明:
bash首先执行/etc/profile脚本,/etc/profile脚本先依次执行/etc/profile.d/*.sh
随后bash会执行用户主目录下的.profile脚本,.profile脚本会执行用户主目录下的.bashrc脚本,
而.bashrc脚本会执行/etc/bashrc脚本。
至此,所有的环境变量和初始化设定都已经加载完成.
bash随后调用terminfo和inputrc,完成终端属性和键盘映射的设定.
/etc/bash.bashrc 和 ~/.bashrc的区别:
/etc/bashrc是被每个用户执行的,而~/.bashrc只被当前用户执行。
/etc/bashrc只有root用户能更改,而~/.bashrc是各个用户私有的文件。。
/etc/bashrc文件则是共享的,整个Linux中只有一份。各个用户有自己独立的".bashrc"文件,可以                                                                                                                                           根据需要自行更改,而不会互相干扰。更改/etc/bashrc会影响到所有用户,这个文件一般是root用户管理的。
六.一些Shell内置命令
1.source命令
source FileName
作用:在当前bash环境下读取并执行FileName中的命令,使环境变量生效。
注:该命令通常用命令“.”来替代。
例如:
source .profile
source .bashrc
2.export命令
用于把变量变成当前shell和其子shell的环境变量,存活期是当前的shell及其子shell,因此重新登陆或者关闭当前
shell及其子shell后,它所设定的环境变量就消失了。
3.env和printenv
这两个变量用于打印所有的环境 变量:
4.set
用于显示与设置当前本地 变量。单独一个set 就显示了当前环境的所有的变量,它肯定包括环境变量和一些非环境变量
5.unset
用于清除变量。不管这个变量是环境变量还是本地变量,它都可以清除。
七.shell 脚本第一行#!/bin/bash
#!告诉系统文件的执行需要指定一个解释器。
#!是两个字节的魔法数字,是用来指定文件类型的特殊标记。
#!后面接的是一个路径名,这个路径名指定了解释脚本中命令的程序。这个指定的程序从头开始解释并执行脚本中的命令。
这个指定的程序就叫做命令解释器。
chmod u+rx  scriptname 只给脚步所有者可读可执行权限。



你可能感兴趣的:(linux 环境变量和Bash)