您的位置:首页 > 运维架构 > Shell

[学习笔记]login shell non-login shell 及其在LFS中的应用

2009-09-07 23:46 387 查看

一、login shell和non-login shell的区别:

login shell 和 non-login shell的最大区别在于读取环境变量的配置文件不同,当系统启动时或你开启一个新到终端登录系统时,系统通过调用/bin/login程序处理登录并在一个shell中显示命令行提示符,这个shell就是login shell;该shell程序可以是bash也可以是sh或csh,具体使用哪种shell可以在/etc/passwd中设置(/bin/login程序读取该文件决定使用哪种shell),例如:

maomaovv:x:500:500:maomaovv:/home/maomaovv:/bin/bash

指示maomaovv登录时使用bash

login shell(bash shell)按如下顺序执行解析配置文件:

/etc/profile

~/.bash_profile

~/.bashrc

/etc/bashrc

在login shell下执行如下命令可以从login shell切换到interactive non-login shell:

#bash

# su [用户名]

interactive non-login shell从其父进程上继承过来环境变量,并按如下顺序执行解析配置文件

/etc/bashrc

~/.bashrc

在interactive shell下执行脚本,将会启动non-interactive shell, non-interactive shell只能从其父进程处继承环境变量

测试:

echo “export VAR_TEST=maomaovv” >> /etc/profiles

source /etc/profiles

echo "ecport BASHRC_TEST=bashrc" >> /etc/bashrc

source /etc/bashrc

在xterm下:

[root@fedora-maomao maomaovv]# logout

bash: logout: not login shell: use `exit' // 在interactive non-login shell下

[maomaovv@fedora-maomao ~]$ echo $VAR_TEST // 没有执行 /etc/profiles,从其父进程继承过来

[maomaovv@fedora-maomao ~]$ echo $BASHRC_TEST //执行了/etc/bashrc

bashrc

但是在2号终端上表现出不同的效果:

fedora-maomao login: maomaovv

Password: // interactive login shell

[maomaovv@fedora-maomao~]$ echo $VAR_TEST //执行了/etc/profiles

maomaovv

[maomaovv@fedora-maomao ~]$ echo $BASHRC_TEST //执行了/etc/bashrc

bashrc

[maomaovv@fedora-maomao ~]$ su root //切换到root用户

Password:

[root@fedora-maomao maomaovv]$ logout //非login shell

bash: logout: not login shell: use `exit'

[root@fedora-maomao~]$ echo $VAR_TEST //从其父进程继承过来

maomaovv

[root@fedora-maomao ~]$ echo $BASHRC_TEST //从其父进程继承过来

bashrc

[root@fedora-maomao ~]$ su - maomaovv //切换到用户maomaovv,并开启login shell

[maomaovv@fedora-maomao~]$ echo $VAR_TEST //从其父进程继承过来

maomaovv

[maomaovv@fedora-maomao ~]$ echo $BASHRC_TEST //从其父进程继承过来

bashrc

[maomaovv@fedora-maomao maomaovv]$ logout //证实为login shell

[root@fedora-maomao maomaovv]$

二、login shell在LFS中的应用:

在LFS手册中我们为了创建一个全新到操作系统,在开始编译任何工具之前需要以lfs帐号登录并清空所有不必要到环境变量,LFS是通过以下几个步骤达到该目的的:

1. su - lfs

切换到lfs用户,并打开login shell,此时该shell到环境变量从父进程继承过来,并会依次执行lfs帐号根目录下的.bash_profile和.bashrc配置文件,由于lfs是我们全新创建到一个用户,这两个配置文件都不存在。

2. 配置~/.bash_profile未摒弃从父进程继承来的环境变量做准备:

cat > ~/.bash_profile << "EOF"

exec env -i HOME=$HOME TERM=$TERM PS1='/u:/w/$ ' /bin/bash

EOF

“exec env - i ...... /bin/bash” 这一句指示启动一个bash,该bash只有两个环境变量HOME和TERM,这两个环境变量均由父进程继承而来,该语句在第四步执行

3. 配置lfs自身要用到的环境变量:

cat > ~/.bashrc << "EOF"

set +h

umask 022

LFS=/mnt/lfs

LC_ALL=POSIX

LFS_TGT=$(uname -m)-lfs-linux-gnu

PATH=/tools/bin:/bin:/usr/bin

export LFS LC_ALL LFS_TGT PATH

EOF

4. 执行:

source ~/.bash_profile

执行该条语句时,我们仍然位于su - lfs后到login shell中,此语句调用 “exec env - i ...... /bin/bash”开启一个全新到环境变量几乎为空的non-login shell,

该shell再执行~/.bashrc 设置lfs需要到环境变量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐