Chinaunix首页 | 论坛 | 博客
  • 博客访问: 201378
  • 博文数量: 62
  • 博客积分: 725
  • 博客等级: 上士
  • 技术积分: 746
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-09 17:07
个人简介

exyz

文章分类

全部博文(62)

分类: LINUX

2013-02-05 21:18:02

一、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需要到环境变量


理清login shell与non-login shell

接下来在此想彻底理清bash的login shell与non-login shell
说老实话,到现在我还没用过login shell(没用过tty1~tty6的文字登入模式啦),也就是说,都是在X 介面下启动的终端而已,所以基本都是non-login shell~~

定义:
login shell:取得bash 时需要完整的登入流程,就称为login shell。举例来说,同tty1~tty6登入时,  需要输入用户名和密码,此时取得的bash就称为login shell

non-login shell:取得bash介面的方法不需要重复登入的动作。
举两个例子(1)以X window登入linux后,再以X 的图形化介面启动终端机,此时那个终端机并不需要再次的输入用户名和密码,那个bash的环境就称为non-login shell
(2)在原本的bash环境中再次下达bash这个指令,同样没有要求输入用户名和密码,那个第二个bash也是non-login shell


在这两个取得bash的情况中,所读取的设定档并不一样(以下引用鸟哥)

login shell 其實只會讀取這兩個設定檔:
  1. /etc/profile:這是系統整體的設定,你最好不要修改這個檔案;
  2. ~/.bash_profile 或 ~/.bash_login 或 ~/.profile:屬於使用者個人設定,你要改自己的資料,就寫入這裡
/etc/profile只有login shell会读,每個使用者登入取得 bash 時一定会读取的设定档! 所以如果你想要帮所有使用者设定整体环境,那就是改这里
同样,/etc/profile会去呼叫外部的设定资料,底下这些资料会依次被呼叫进来:(底下引自鸟哥)

/etc/inputrc:
其實這個檔案並沒有被執行啦!/etc/profile 會主動的判斷使用者有沒有自訂輸入的按鍵功能,如果沒有的話, /etc/profile 就會決定設定『INPUTRC=/etc/inputrc』這個變數!此一檔案內容為 bash 的熱鍵啦、[tab]要不要有聲音啦等等的資料! 因為鳥哥覺得 bash 預設的環境已經很棒了,所以不建議修改這個檔案!

/etc/profile.d/*.sh
:其實這是個目錄內的眾多檔案!只要在 /etc/profile.d/ 這個目錄內且副檔名為 .sh ,另外,使用者能夠具有 r 的權限, 那麼該檔案就會被 /etc/profile呼叫進來。在 CentOS 5.x 中,這個目錄底下的檔案規範了 bash 操作介面的顏色、 語系、ll 與 ls 指令的命令別名、vi 的命令別名、which 的命令別名等等。如果你需要幫所有使用者設定一些共用的命令別名時, 可以在這個目錄底下自行建立副檔名為 .sh 的檔案,並將所需要的資料寫入即可喔!

/etc/sysconfig/i18n
:這個檔案是由 /etc/profile.d/lang.sh 呼叫進來的!這也是我們決定 bash 預設使用何種語系的重要設定檔! 檔案裡最重要的就是 LANG 這個變數的設定啦

反正你只要記得,bash 的 login shell 情況下所讀取的整體環境設定檔其實只有 /etc/profile,但是 /etc/profile 還會呼叫出其他的設定檔,所以讓我們的 bash 操作介面變的非常的友善啦


个人设定:

~/.bash_profile (login shell 才會讀)

bash 在讀完了整體環境設定的 /etc/profile 並藉此呼叫其他設定檔後,接下來則是會讀取使用者的個人設定檔。 在 login shell 的 bash 環境中,所讀取的個人偏好設定檔其實主要有三個,依序分別是:

  1. ~/.bash_profile
  2. ~/.bash_login
  3. ~/.profile
其實 bash 的 login shell 設定只會讀取上面三個檔案的其中一個, 而讀取的順序則是依照上面的順序也 就是說,如果 ~/.bash_profile 存在,那麼其他兩個檔案不論有無存在,都不會被讀取。 如果 ~/.bash_profile 不存在才會去讀取 ~/.bash_login,而前兩者都不存在才會讀取 ~/.profile 的意思。 會有這麼多的檔案,其實是因應其他 shell 轉換過來的使用者的習慣而已
bash 設定檔的讀入方式比較有趣,主要是透過一個指令『 source 』來讀取的! 也就是說 ~/.bash_profile 其實會再呼叫 ~/.bashrc 的設定內容喔,login shell 環境下,最終被讀取的設定檔是『 ~/.bashrc 』這個檔案

~/.bashrc (non-login shell 會讀)
談完了 login shell 後,那麼 non-login shell 這種非登入情況取得 bash 操作介面的環境設定檔又是什麼? 當你取得 non-login shell 時,該 bash 設定檔僅會讀取 ~/.bashrc 而已啦
不过~/.bashrc会去呼叫/etc/bashrc.而这个/etc/bashrc主要有三个作用“
1.根据不同的UID,规范出UMASK的值
2.依据不同的UID ,规范出PS1, 也就是提示符的内容
3.呼叫/etc/profile.d/*sh目录中的内容
阅读(1312) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~