bash配置文件实验报告
时间:2004-01-13
来源:互联网
近来用man bash看了看bash的文档,其中在Files部分提到:
/etc/profile The systemwide initialization file, executed for login shells 系统全程的初始化文件,为登录的shell所执行 ~/.bash_profile The personal initialization file, executed for login shells 个人的初始化文件,为登录的shell所执行 ~/.bashrc The individual per-interactive-shell startup file 个人的交互式shell的起始文件 ~/.bash_logout The individual login shell cleanup file, executed when a login shell exits 个人登录shell的清理文件,当登录shell退出时执行
为了直观理解manpage中提到的各种情况,我设计了几个简单的实验来进行验证。
第一步:建立各个对应文件,即在用户目录下分别建立 .bash_profile, .profile, .bashrc和 .bash_logout。假如已经有这些文件了,请先做好备份。每个文件的内容只有一行,命令如下:
echo 'echo hello from .bash_profile' > .bash_profile echo 'echo hello from .profile' > .profile echo 'echo hello from .bashrc' > .bashrc echo 'echo hello from .bash_logout' > .bash_logout
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。
作者: windrose 发布时间: 2004-01-13
作者: struggle 发布时间: 2004-01-14
if test x"$DISPLAY" = x"" then startx fi
作者: windrose 发布时间: 2004-01-14
作者: 用户名 发布时间: 2004-01-15
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
作者: windrose 发布时间: 2004-04-06
==========
知道了,改.bash_profile就行了。
多谢版主!
作者: BBDD 发布时间: 2004-04-11
请问怎样使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的一段设置却生效了?
作者: hupeng923 发布时间: 2004-06-08
.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。
作者: qianzheng82 发布时间: 2004-06-08
最初由 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的一段设置却生效了? |
作者: guccio 发布时间: 2004-06-08
作者: hupeng923 发布时间: 2004-06-08
作者: guccio 发布时间: 2004-06-09
作者: hupeng923 发布时间: 2004-06-09
作者: windrose 发布时间: 2004-06-09
可我还是不明百为什么打开虚拟终端后/etc/profile里的shell prompt没有被执行而其它的设置被执行了:ask
作者: hupeng923 发布时间: 2004-06-09
作者: windrose 发布时间: 2004-06-09
作者: hupeng923 发布时间: 2004-06-09
作者: guccio 发布时间: 2004-06-09
另外我测试了一下,得到这个结果:
"$SHELL" = "/bin/sh"
作者: hupeng923 发布时间: 2004-06-09
作者: guccio 发布时间: 2004-06-09
作者: hupeng923 发布时间: 2004-06-09
最初由 windrose 发表 前一段时间,有兄弟提出为什么打开终端后.bashrc文件没有被执行,结果引发了一场讨论。详见:http://www.linuxsir.org/bbs/showthre...threadid=69247 近来用man bash看了看bash的文档,其中在Files部分提到:
代码:
/etc/profile The systemwide initialization file, executed for login shells 系统全程的初始化文件,为登录的shell所执行 ~/.bash_profile The personal initialization file, executed for login shells 个人的初始化文件,为登录的shell所执行 ~/.bashrc The individual per-interactive-shell startup file 个人的交互式shell的起始文件 ~/.bash_logout The individual login shell cleanup file, executed when a login shell exits 个人登录shell的清理文件,当登录shell退出时执行 为了直观理解manpage中提到的各种情况,我设计了几个简单的实验来进行验证。 第一步:建立各个对应文件,即在用户目录下分别建立 .bash_profile, .profile, .bashrc和 .bash_logout。假如已经有这些文件了,请先做好备份。每个文件的内容只有一行,命令如下:
代码:
echo 'echo hello from .bash_profile' > .bash_profile echo 'echo hello from .profile' > .profile echo 'echo hello from .bashrc' > .bashrc echo 'echo hello from .bash_logout' > .bash_logout 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。 |
不过上面的工作还是很好的,辛苦了,呵呵。
多读读文档很多时候事半功倍。
作者: rainman_sl 发布时间: 2004-08-15
作者: hzbiz 发布时间: 2005-02-17
作者: redspider 发布时间: 2005-02-18
作者: windrose
举一个应用的例子。我一直是用init 3(文本模式)启动和登录系统的,但往往登录之后就启动X window,只是偶尔再回到文本界面。可能有兄弟会说,为什么不用init 4(图形登录)?我觉得如果用了init 4,假如想返回纯文本界面,还要再修改inittab,到底不是很方便。于是创建了 ~/.bash_profile,添加如下内容:
代码:
if test x"$DISPLAY" = x"" then startx fi |
windrose老大,我对你的应用实例不太理解。在退出X后还是会在登陆文本界面读取~/.bash_profile时选择进入x的呀?
是我哪里概念不清么?
作者: taurusivy 发布时间: 2006-02-09
windrose兄不是说“执行它所找到的第一个”么?slk下/etc/profile是存在的呀,那就应该只执行这个才对吧?为什么会打印~/,bash_profile呢?
呵呵,刚开始学shell,老大别打偶:)
作者: taurusivy 发布时间: 2006-02-09
sorry,我写得有点混淆。首先/etc/profile一定是会被执行的,然后bash再找其它的文件,并执行那个列表中它找到的第一个。
作者: windrose 发布时间: 2006-02-09
作者: taurusivy
windrose老大,我对你的应用实例不太理解。在退出X后还是会在登陆文本界面读取~/.bash_profile时选择进入x的呀?
是我哪里概念不清么? |
作者: windrose 发布时间: 2006-02-09
作者: windrose
bash将首先执行/etc/profile文件,然后依次查找 ~/.bash_profile, ~/.bash_login, ~/.profile文件,并执行它所找到的第一个。
sorry,我写得有点混淆。首先/etc/profile一定是会被执行的,然后bash再找其它的文件,并执行那个列表中它找到的第一个。 |
作者: taurusivy 发布时间: 2006-02-11
作者: windrose
bash将首先执行/etc/profile文件,然后依次查找 ~/.bash_profile, ~/.bash_login, ~/.profile文件,并执行它所找到的第一个。
我写得有点混淆。首先/etc/profile一定是会被执行的,然后bash再找其它的文件,并执行那个列表中它找到的第一个。 |
作者: dgkgnrt 发布时间: 2006-11-25
作者: dgkgnrt
直接从文本进入X后打开的虚拟终端中的非交互式shell是不是应该查找~/.bashrc 文件? 用户的shell是不是也应该先定为bash ,而不能是sh或csh等等? 我实在是不清楚,只好厚脸皮再问一下.
|
这里说的是bash,一般sh是指向bash的符号链接,csh是怎么样的情况请看csh的文档。
作者: windrose 发布时间: 2006-11-25
作者: windrose
你可以按我前面说的试验方法试试。
这里说的是bash,一般sh是指向bash的符号链接,csh是怎么样的情况请看csh的文档。 |
作者: dgkgnrt 发布时间: 2006-11-25
应该是">"应该改为">>",
[test@localhost ~]$ echo "echo hello from .bash_profile" > .bash_profile
[test@localhost ~]$ vi .bash_profile
[test@localhost ~]$ cat .bash_profile
echo hello from .bash_profile
[test@localhost ~]$ sh restore_profile.sh
[test@localhost ~]$ echo "echo hello from .bash_profile" >> .bash_profile
[test@localhost ~]$ cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:$HOME/123:
export PATH
unset USERNAME
export LANG=en_US
echo "Hello from .bash_profile"
echo hello from .bash_profile
[test@localhost ~]$ source .bash_profile
Hello from .bash_profile
hello from .bash_profile
有一个是我之前加上去的,所以。。。
不过这确实是个好贴继续顶住!
不要怪我太菜,提出这样显而易见的问题。
见笑了,各位兄弟。
作者: lxy_bhbh 发布时间: 2007-01-15
>> 则是在文件最后添加重定向的内容
该用哪一个要看具体的需要
作者: windrose 发布时间: 2007-01-16
echo 'echo hello from .bash_profile' > .bash_profile
echo 'echo hello from .profile' > .profile
echo 'echo hello from .bashrc' > .bashrc
echo 'echo hello from .bash_logout' > .bash_logout
那.bash_profile,.profile,.bashrc,.bash_logout都只有一个内容了,那bash还能用吗?
好像路径就没了。
作者: lxy_bhbh 发布时间: 2007-01-17
只有一行内容,其实是有意为之,方便说明问题。
作者: windrose 发布时间: 2007-01-17
有时间我再看看slackware
:)
作者: lxy_bhbh 发布时间: 2007-01-18
作者: lxy_bhbh
哦,我用的是Fedora 不好意思,搜帖子的时候,搜到这了。。。
有时间我再看看slackware :) |
---我感到在slackware与在fedora中原理是一样的吧。
作者: dgkgnrt 发布时间: 2007-01-19
作者: dgkgnrt
实验的目的是为了了解并正确运用bash。
---我感到在slackware与在fedora中原理是一样的吧。 |
作者: lxy_bhbh 发布时间: 2007-01-19
作者: lxy_bhbh
对,都是bash,但是,不同的是fedora中一旦有用户,就会在该用户的home下,生成.bash_profile,.bash_logout等,里面是有内容的。而按windrose 兄的意思好像是"实际上这些文件在slackware安装之后,用户目录中并不存在。"所以,认为slackware和fedora在bash文件上还是有点区别的。。。
|
作者: windrose 发布时间: 2007-01-19
作者: windrose
举一个应用的例子。我一直是用init 3(文本模式)启动和登录系统的,但往往登录之后就启动X window,只是偶尔再回到文本界面。可能有兄弟会说,为什么不用init 4(图形登录)?我觉得如果用了init 4,假如想返回纯文本界面,还要再修改inittab,到底不是很方便。于是创建了 ~/.bash_profile,添加如下内容:
代码:
if test x"$DISPLAY" = x"" then startx fi |
作者: euler 发布时间: 2007-01-19
就算没做,我用的也是个测试用的帐号,删掉再重建都可以。
不过,我想你那样做的时候发现这个变化:
[test@localhost ~]$ cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:$HOME/123:
export PATH
unset USERNAME
export LANG=en_US
echo "Hello from .bash_profile"
[test@localhost ~]$ echo 'hello from profile' > .bash_profile
[test@localhost ~]$ source .bash_profile
-bash: hello: command not found
[test@localhost ~]$exit
Last login: Fri Jan 19 13:46:02 2007
-bash: hello: command not found
-bash-3.00$ cat .bash_profile
“-bash: hello: command not found”所以,我才怀疑。。。
不过现在知道了是仍然可用的。
但是,为什么会出现这个呢?我实在搞不懂。
作者: lxy_bhbh 发布时间: 2007-01-19
作者: lxy_bhbh
[test@localhost ~]$ echo 'hello from profile' > .bash_profile
|
作者: windrose 发布时间: 2007-01-19
不好意思,太大意了。。。
作者: lxy_bhbh 发布时间: 2007-01-19
作者: windrose
举一个应用的例子。我一直是用init 3(文本模式)启动和登录系统的,但往往登录之后就启动X window,只是偶尔再回到文本界面。可能有兄弟会说,为什么不用init 4(图形登录)?我觉得如果用了init 4,假如想返回纯文本界面,还要再修改inittab,到底不是很方便。于是创建了 ~/.bash_profile,添加如下内容:
代码:
if test x"$DISPLAY" = x"" then startx fi |
我自己實際是寫如下,不然每次ctrl + alt + F2 - F6又啟動一次startx.
test "$(tty)" = "/dev/vc/1" -a x"$DISPLAY" = x"" -a "$(pgrep startx)" = "" #X11不在且在vc1就跑
作者: jiuny0209 发布时间: 2009-05-16
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28