LinuxSir.cn,穿越时空的Linuxsir!

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

关于login shell和non-login shell

[复制链接]
发表于 2007-12-4 16:42:57 | 显示全部楼层 |阅读模式
假设先以root用户登录
1、用su - oracle切换到oracle用户,那么使用的是login shell,登录进程或者说shell会重新读取/etc/profile和~/.bash_profile来应用新的环境变量。
2、用su oracle切换到oracle用户,那么使用的是non-login shell,此时shell不会读取/etc/profile和~/.bash_profile,而是读取~/.bashrc来应用新的环境变量。

欢迎大家讨论我的2种观点是否正确。
发表于 2007-12-12 20:34:05 | 显示全部楼层
使用下面的命令来验证:
strace -fa -o /tmp/checklogin.log  -e trace=open su - oracle
strace -fa  -o /tmp/checknologin.log -e trace=open su oracle

然后分别查看/tmp/checklogin.log和/tmp/checknologin.log看看他们打开了哪些文件,就可以验证了
回复 支持 反对

使用道具 举报

发表于 2007-12-13 21:47:47 | 显示全部楼层
login shell 也会读取.bashrc文件, "vim .bashrc"会发现 "if [ -f ~/.bashrc ]; then . ~/.bashrc   fi",你可以在.bashrc文件中设一个变量,su 及 su - 后,看看能否显示此变量.
      你也可用exit命令试,  如果是login shell,则会清屏. 或者试logout, non-login shell 的话不能使用.
回复 支持 反对

使用道具 举报

发表于 2007-12-13 22:59:18 | 显示全部楼层
Post by xlq;1795386
[color="Red"]login shell 也会读取.bashrc文件, "vim .bashrc"会发现 "if [ -f ~/.bashrc ]; then . ~/.bashrc   fi",你可以在.bashrc文件中设一个变量,su 及 su - 后,看看能否显示此变量.
      你也可用exit命令试,  如果是login shell,则会清屏. 或者试logout, non-login shell 的话不能使用.
这不见得,不同发行版的启动配置略有不同

一般是 login shell 读取 /etc/profile 或者 ~/.bash_profile,而 non-login shell 则透过 ~/.bashrc 去读入 /etc/bashrc
回复 支持 反对

使用道具 举报

发表于 2008-11-11 23:45:51 | 显示全部楼层
login shell启动时并不执行.bashrc,但是惯例上会在.bash_profile显示调用.bashrc
回复 支持 反对

使用道具 举报

发表于 2008-11-12 16:17:08 | 显示全部楼层
前段时间看了下BLFS6.3手册中相关章节
The Bash Shell Startup Files
本人理解如下 如有误请指出
1. 交互-登录-shell :
使用login读取/etc/passwd文件成功登录
读取文件:/etc/profile以及~/.bash_profile配置shell
BLFS手册中的/etc/profile会调用执行/etc/profile.d/目录下的所有 *.sh脚本文件
2. 交互-非登录-shell:
使用shell程序开启命令行 比如/bin/bash 或使用 /bin/su
或者在图形模式下启用konsole,xterm等终端程序.
读取文件~/.bashrc
而BLFS以及大多数发行版都会使用~/.bashrc调用/etc/bashrc
3.非交互-shell
通常存在于shell脚本运行时
这时shell的环境变量来自于对父shell的继承.

4.关于~/.bash_logout
当用户从一个 交互-登录-shell退出时执行才会执行
BLFS没有在这个脚本中加入清屏命令
因为/etc/issue中已经有clear命令了

但是我本人不喜欢issue这个字眼(在我眼里是bug的代名词)
所以我把clear加入用logout来清屏
回复 支持 反对

使用道具 举报

发表于 2008-11-12 19:18:11 | 显示全部楼层
/etc 向来就是 Linux 里最乱七八糟的地方,其下的配置文件不同发行版各出奇谋,全不统一,完全没有标准可言

不同发行版的载入方式不尽相同,这不足为奇
回复 支持 反对

使用道具 举报

发表于 2008-11-12 20:06:03 | 显示全部楼层
对于/etc下的配置文件 我到觉得 FreeBSD 做得不错, port安装的 全在 /usr/local下面, 对了, 不知道 Debian 可不可以配置 apt-get dpkg 安装的程序在 /usr/local下面。
回复 支持 反对

使用道具 举报

发表于 2008-11-12 20:24:40 | 显示全部楼层
Post by d00m3d;1795432
这不见得,不同发行版的启动配置略有不同

一般是 login shell 读取 /etc/profile 或者 ~/.bash_profile,而 non-login shell 则透过 ~/.bashrc 去读入 /etc/bashrc


是阿, login shell 读取 /etc/profile 和 ~/.bash_profile , 并且是 先读入 profile 后读入 .bash_profile, 2个文件必读, 至于 bash.bashrc 和 .bashrc 则看 profile 和 .bash_profile 是否明确指定读。

而 non-login shell 也是先要读取系统的 bashrc 并非透过.bashrc 读/etc/bashrc, 然后才读取 ~/.bashrc.
回复 支持 反对

使用道具 举报

发表于 2008-11-13 10:18:54 | 显示全部楼层
Post by d00m3d;1795432
这不见得,不同发行版的启动配置略有不同

一般是 login shell 读取 /etc/profile 或者 ~/.bash_profile,而 non-login shell 则透过 ~/.bashrc 去读入 /etc/bashrc
Post by zyl19861126;1907709
是阿, login shell 读取 /etc/profile 和 ~/.bash_profile , 并且是 先读入 profile 后读入 .bash_profile, 2个文件必读, 至于 bash.bashrc 和 .bashrc 则看 profile 和 .bash_profile 是否明确指定读。

而 non-login shell 也是先要读取系统的 bashrc 并非透过.bashrc 读/etc/bashrc, 然后才读取 ~/.bashrc.


系统中是通过什么来控制该读取哪个文件的呢?环境变量还是?
不成是login shell肯定是要读取profile,然后读取.bash_profile,而non-login shell读取的一定是bashrc。
然后在这些一定要读取的文件里面去控制还要读取哪些文件?
回复 支持 反对

使用道具 举报

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

本版积分规则

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