LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: windrose

bash配置文件实验报告

[复制链接]
发表于 2004-8-15 17:03:42 | 显示全部楼层

回复: bash配置文件实验报告

最初由 windrose 发表
前一段时间,有兄弟提出为什么打开终端后.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。


其实就是 login shell 和 非 login shell  的区别,bash 手册里写的很清楚。

不过上面的工作还是很好的,辛苦了,呵呵。
多读读文档很多时候事半功倍。
发表于 2005-2-17 08:38:34 | 显示全部楼层
我想问一下,此贴的注要用意是什么呢??
回复 支持 反对

使用道具 举报

发表于 2005-2-17 21:48:22 | 显示全部楼层
顶一下
回复 支持 反对

使用道具 举报

发表于 2006-2-9 00:43:41 | 显示全部楼层
Post by windrose
举一个应用的例子。我一直是用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就可以了。



windrose老大,我对你的应用实例不太理解。在退出X后还是会在登陆文本界面读取~/.bash_profile时选择进入x的呀?
是我哪里概念不清么?
回复 支持 反对

使用道具 举报

发表于 2006-2-9 00:46:42 | 显示全部楼层
根据bash的manpage,此时启动的是登录shell,bash将首先执行/etc/profile文件,然后依次查找 ~/.bash_profile, ~/.bash_login, ~/.profile文件,并执行它所找到的第一个。在我们当前的实验中,它应该执行的是 .bash_profile,因此屏幕应该显示 hello from .bash_profile

windrose兄不是说“执行它所找到的第一个”么?slk下/etc/profile是存在的呀,那就应该只执行这个才对吧?为什么会打印~/,bash_profile呢?
呵呵,刚开始学shell,老大别打偶:)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-9 11:45:44 | 显示全部楼层
bash将首先执行/etc/profile文件,然后依次查找 ~/.bash_profile, ~/.bash_login, ~/.profile文件,并执行它所找到的第一个。

sorry,我写得有点混淆。首先/etc/profile一定是会被执行的,然后bash再找其它的文件,并执行那个列表中它找到的第一个。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-9 11:47:06 | 显示全部楼层
Post by taurusivy
windrose老大,我对你的应用实例不太理解。在退出X后还是会在登陆文本界面读取~/.bash_profile时选择进入x的呀?
是我哪里概念不清么?


从X退到文本界面不会再执行 ~/.bash_profile,因为此时并没有开始一个新的bash进程
回复 支持 反对

使用道具 举报

发表于 2006-2-10 19:19:46 | 显示全部楼层
Post by windrose
bash将首先执行/etc/profile文件,然后依次查找 ~/.bash_profile, ~/.bash_login, ~/.profile文件,并执行它所找到的第一个。

sorry,我写得有点混淆。首先/etc/profile一定是会被执行的,然后bash再找其它的文件,并执行那个列表中它找到的第一个。


明白,谢谢!
回复 支持 反对

使用道具 举报

发表于 2006-11-25 00:34:26 | 显示全部楼层
Post by windrose
bash将首先执行/etc/profile文件,然后依次查找 ~/.bash_profile, ~/.bash_login, ~/.profile文件,并执行它所找到的第一个。

    我写得有点混淆。首先/etc/profile一定是会被执行的,然后bash再找其它的文件,并执行那个列表中它找到的第一个。

   直接从文本进入X后打开的虚拟终端中的非交互式shell是不是应该查找~/.bashrc  文件? 用户的shell是不是也应该先定为bash ,而不能是sh或csh等等? 我实在是不清楚,只好厚脸皮再问一下.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-25 10:37:13 | 显示全部楼层
Post by dgkgnrt
直接从文本进入X后打开的虚拟终端中的非交互式shell是不是应该查找~/.bashrc  文件? 用户的shell是不是也应该先定为bash ,而不能是sh或csh等等? 我实在是不清楚,只好厚脸皮再问一下.


你可以按我前面说的试验方法试试。
这里说的是bash,一般sh是指向bash的符号链接,csh是怎么样的情况请看csh的文档。
回复 支持 反对

使用道具 举报

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

本版积分规则

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