首页  > 计算机 >

bash的初始化文件

本文按署名·非商业用途·保持一致授权
作者:  ,发表于2009年01月18日15时25分 

写这篇文章,是因为和zik讨论过这个问题,并且他也简单总结了一下。我enhance一下这个总结。

* 下面这些信息可以man bash,搜索INVOCATION获得。我就是归纳了一下。
* (|)的意思为按顺序读取,有一个成功被读取就中止。逗号表示依次读取所有。
* bash和sh的区别只是名字上不同,sh是一个到bash的link。也就是说我这里实际上只是讨论bash的规则,和其他的shell无关。当然bash本身会去兼容某些shell的行为,下面的sh+就是一种兼容行为。
* login的意思,就是bash是被作为login shell启动(/etc/passwd)。你ssh连接一个远程主机,并登录,这时候启动的就是一个login shell。你在苹果或者ubuntu的图形界面下启动一个终端,这时候也是启动了一个login shell。或者bash带–login参数运行,算是个伪login shell
* 交互模式的意思,就是你能输入命令,然后能看到输出,然后又可以继续输入命令看到输出。直到你exit。如果你写了一个bash脚本,./my.sh,这个脚本就是以非交互模式启动,因为它只是执行完你的脚本命令,然后退出,你并不能在中间输入任何东西给bash(当然这个脚本可以启动一个交互式的程序让你玩)。
* 我这里只谈初始化,不谈logout

bash+login
/etc/profile,(~/.bash_profile|~/.bash_login|~/.profile)

bash+非login+交互模式
~/.bashrc

bash+非login+交互模式+–posix
$ENV

bash+非login+非交互模式(例如运行bash脚本)
$BASH_ENV

sh+login
/etc/profile,~/.profile

sh+非login+交互模式
$ENV

sh+非login,非交互模式
不读取任何文件

从上面可以看出,在login条件下(我们打开一个终端或者远程登录一台服务器,一般就是处于这个条件之下),只有/etc/profile和~ /.profile是都有可能会被加载的。所以,为了兼容所有环境。我的做法是,删除~/.bash_profile和~/.bash_login,只使用~/.profile。这样保证我的user login shell无论是sh还是bash,初始化文件都会被加载。

另外看个实例吧,假设我的用户的login shell是/bin/sh以及上面提到的所有文件都存在(当然这个不是我所用的环境)。那么有如下结果:
登录:加载/etc/profile,~/.bash_profile
shell>bash #加载~/.bashrc
shell>bash –login #加载/etc/profile,~/.bash_profile
shell>sh #加载$ENV
shell>sh –login #加载/etc/profile,~/.profile



发表评论

  本站文章若无注明,则以署名·非商业用途·保持一致授权
  桂ICP备05004302号 感谢WordPress提供本程序 本模板下载