LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 18190|回复: 43

bash配置文件实验报告

[复制链接]
发表于 2004-1-13 15:44:18 | 显示全部楼层 |阅读模式
前一段时间,有兄弟提出为什么打开终端后.bashrc文件没有被执行,结果引发了一场讨论。详见:http://www.linuxsir.cn/forum.php?mod=viewthread&tid=69247

近来用man bash看了看bash的文档,其中在Files部分提到:

  1.        /etc/profile
  2.               The  systemwide  initialization  file, executed for login shells
  3.               系统全程的初始化文件,为登录的shell所执行
  4.        ~/.bash_profile
  5.               The  personal  initialization  file,  executed  for login shells
  6.               个人的初始化文件,为登录的shell所执行
  7.        ~/.bashrc
  8.               The individual per-interactive-shell startup file
  9.               个人的交互式shell的起始文件
  10.        ~/.bash_logout
  11.               The  individual  login shell cleanup file, executed when a login shell exits
  12.               个人登录shell的清理文件,当登录shell退出时执行
复制代码

文档的Invocation部分详细解释了在哪种情况下调用哪个配置文件,其中提到如果用sh命令来调用bash时还可能会用到 ~/.profile 文件。
为了直观理解manpage中提到的各种情况,我设计了几个简单的实验来进行验证。

第一步:建立各个对应文件,即在用户目录下分别建立 .bash_profile, .profile, .bashrc和 .bash_logout。假如已经有这些文件了,请先做好备份。每个文件的内容只有一行,命令如下:

  1. echo 'echo hello from .bash_profile' > .bash_profile
  2. echo 'echo hello from .profile' > .profile
  3. echo 'echo hello from .bashrc' > .bashrc
  4. echo 'echo hello from .bash_logout' > .bash_logout
复制代码


第二步:设置用文本界面启动,用root身份编辑 /etc/inittab文件,把以id开头的一行改为:
id:3:initdefault:

第三步:退出当前用户,此时会进入文本登录界面。

实验一:
1.输入用户名和密码进行登录。
根据bash的manpage,此时启动的是登录shell,bash将首先执行/etc/profile文件,然后依次查找 ~/.bash_profile, ~/.bash_login, ~/.profile文件,并执行它所找到的第一个。在我们当前的实验中,它应该执行的是 .bash_profile,因此屏幕应该显示 hello from .bash_profile
2.输入:
logout
屏幕应显示 hello from .bash_logout。由于当前是个登录shell,所以退出时会执行 .bash_logout

实验二:
1.在文本登录界面登录,然后输入命令:
sh
屏幕上只会出现另一个命令行提示符。manpage中说,当以sh调用bash时,bash只会执行最简化的启动步骤,不读入任何配置文件。
2.输入:
logout
屏幕出现 bash: logout: not login shell: use `exit' ,说明我们当前的shell不是一个登录shell;
3.输入:
exit
屏幕显示exit,然后回到最初的登录shell
由于我们用sh命令启动的shell不是登录shell,所以它退出时不会执行.bash_logout
4.输入:
sh --login
屏幕显示hello from .profile。看看manpage,--login选项用来启动一个登录shell,此时用sh调用bash,它将会执行/etc/profile以及 ~/.profile,这正是我们得到的结果。
5.输入:
logout
屏幕显示 hello from .bash_logout
由于我们退出的是一个登录shell,所以执行了.bash_logout

实验三:
1.输入:
bash
屏幕显示 hello from .bashrc。因为当前用bash命令启动的不是登录shell,所以执行了.bashrc
2.输入:
logout
屏幕出现 bash: logout: not login shell: use `exit' ,说明我们当前的shell不是一个登录shell;
3.输入:
exit
屏幕显示exit,然后回到最初的登录shell
由于不是登录shell,所以它退出时不执行.bash_logout
4.输入:
bash --login
屏幕显示hello from .bash_profile。--login选项用来启动一个登录shell,此时bash的表现与实验一相同。
5.输入:
logout
屏幕显示 hello from .bash_logout
由于我们退出的是一个登录shell,所以执行了.bash_logout

小结:以上的简单实验直观地显示了bash在何种情况下将执行哪个配置文件,但实际上bash的行为还受到启动选项和一些环境变量的影响,情况将会很复杂。若需要深入研究请认真研读manpage。
发表于 2004-1-13 21:15:22 | 显示全部楼层
windrose兄辛苦了,最近做了很多基础shell的东西。
 楼主| 发表于 2004-1-14 17:06:19 | 显示全部楼层
举一个应用的例子。我一直是用init 3(文本模式)启动和登录系统的,但往往登录之后就启动X window,只是偶尔再回到文本界面。可能有兄弟会说,为什么不用init 4(图形登录)?我觉得如果用了init 4,假如想返回纯文本界面,还要再修改inittab,到底不是很方便。于是创建了 ~/.bash_profile,添加如下内容:

  1. if test x"$DISPLAY" = x""
  2. then
  3. startx
  4. fi
复制代码

这样,我从shell登录之后,直接就启动X window。假如想回到文本界面,只要退出X就可以了。
发表于 2004-1-15 07:30:09 | 显示全部楼层
有意思
 楼主| 发表于 2004-4-6 17:42:03 | 显示全部楼层

BASH最常见的激活模式(转贴)

Bash最常见的激活模式是交互式和非交互式:
    1.交互式激活
    指其标准输入和输出都连接在终端上.又分为三种类型:login,非login,posix
    以及受限的shell.
    确定一个shell是否是交互式的可以通过检测$PS1环境变量.
    (1) 当Bash作为login shell被激活时,它将依次读取并执行以下文件:
    /etc/profile,~/.bash_profile,~/.bash_login,~/.profile
    使用--noprofile选项激活Bash可以禁止其读任何初始化文件
    在退出时执行 ~/.bash_logout 文件
    (2) 当Bash作为非login shell被激活时,它将读取并执行~/.bashrc
    使用--norc选项激活Bash可以禁止执行任何初始化文件,使用
    --rcfile file可以指定执行的初始化文件.
    (3) 当Bash作为posix模式被激活时,它将先检查$ENV变量是否定义.
    若定义,Bash读取并执行有$ENV变量扩展而得到的文件,否则不再
    执行任何初始化文件。
    (4) 当Bash作为受限模式被激活时,它除了禁止某些操作以外,其他行为
    于其他模式相同.受限操作有:改变目录,修改$SHELL和$PATH变量,
    运行exec,以绝对路径运行程序以及使用重定向.Bash 1.x中不包含
    受限模式.
    2.非交互式激活
    主要用来运行Shell脚本.启动后,Bash检查$BASH_ENV变量,若定义,
    这执行该变量指定文件中包含的命令.
    Bash 的激活选项
    -c string 该选项表明string中包含了一条命令.如 bash -c ls ~
    -i 使Bash以交互式方式运行
    -r 使Bash以受限方式运行
    --login 使Bash以登录Shell方式运行
    --posix 使Bash遵循POSIX标准
    --verbose 使Bash显示所有其读入的输入行
    --help 打印Bash的使用信息
    --version 打印版本信息
    --noprofile
    --norc
    --rcfile file
发表于 2004-4-11 15:28:23 | 显示全部楼层
那么如果我要修改登录后的环境变量,比如LC_ALL之类的,该改哪个文件呢?

==========

知道了,改.bash_profile就行了。
多谢版主!
发表于 2004-6-8 09:09:41 | 显示全部楼层
我看得不是很明白。
请问怎样使X-windows里的虚拟终端以“登陆shell”的方式运行呢?

我启动虚拟终端(gnome-ternima、mlterm等等)后,终端提示符是“sh-2.05b$”,/etc/profile里关于shell prompt的一段设置没生效(没有显示成“hupeng923@slackware:~$”这样)可是其它的设置生效了,比如java变量、XIM等等,也就是说/etc/profile文件部分被执行?那么此时的x-windows的虚拟终端是哪种shell呢,login shell还是no login shell?为什么在纯控制台模式下,/etc/profile里关于shell prompt的一段设置却生效了?
发表于 2004-6-8 10:18:43 | 显示全部楼层
.bash_profile, .bash_logout 和 .bashrc文件

.bash_profile 只被 登录shell 读取并执行。如果你通过在命令行上键入一个 bash 启动一个新的 shell,这就会试图读取 .bashrc 中的命令。如果需要在登录shell 和启动一个 子shell 命令时进行一样的操作,可以在 .bash_profile 中使用 source 命令执行 .bashrc。如果 .bashrc 不存在,那么启动一个子 shell 时就没有命令被执行。

文件 .bash_logout 在每次 登录shell 退出时被读取并执行。它提供了定制用户环境的功能。如果要执行诸如删除账号内临时文件或记录登录系统所花时间等命令,则可将这些命令放在 .bash_logout 内。该文件不必一定存在于账号内--如果不存在,则退出时不再执行其他命令。

bash 允许有 .bash_profile 的两个同义文件:来源于 C shell文件 .login 的 .bash_login 以及来源于 Bourne shell 和 Korn shell 文件 .profile 的 .profile。登录时三者中只有一个被读取,如果用户根目录下 .bash_profile 不存在,则 bash 查找 .bash_login,如果它也不存在,则查找 .profile。
发表于 2004-6-8 12:51:28 | 显示全部楼层
最初由 hupeng923 发表
我看得不是很明白。
请问怎样使X-windows里的虚拟终端以“登陆shell”的方式运行呢?

我启动虚拟终端(gnome-ternima、mlterm等等)后,终端提示符是“sh-2.05b$”,/etc/profile里关于shell prompt的一段设置没生效(没有显示成“hupeng923@slackware:~$”这样)可是其它的设置生效了,比如java变量、XIM等等,也就是说/etc/profile文件部分被执行?那么此时的x-windows的虚拟终端是哪种shell呢,login shell还是no login shell?为什么在纯控制台模式下,/etc/profile里关于shell prompt的一段设置却生效了?


正确的习惯应该让/etc/profile的内容保持缺省原样,然后本用户的相关个性设置比如prompt方式和alias等等放到~/.bash_profile里,然后为了使x下的终端跟登陆shell一致,做一个~/.bashrc符号链接到~/.bash_profile即可。
发表于 2004-6-8 19:29:10 | 显示全部楼层

那x-windows的虚拟终端到底是哪种shell,login的还是非login的?

rt
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表