忒修斯之船分享 http://blog.sciencenet.cn/u/shixiangwang

博文

[转载]login shell与non-login shell的区别

已有 5926 次阅读 2017-3-4 12:49 |个人分类:Python & Linux|系统分类:科研笔记|关键词:Shell,Bash,Linux| Linux, Shell, bash |文章来源:转载

Bash有几种不同的运行模式,login shell与non-login shell,interactive shell与non-interactive shell(比如执行shell脚本)。这两种分类方法是交叉的,也就是说一个login shell可能是一个interactive shell,也可能是个non-interactive shell。

在下列情况下,我们可以获得一个login shell:

  1. 登录系统时获得的顶层shell,无论是通过本地终端登录,还是通过网络ssh登录。这种情况下获得的login shell是一个交互式shell。

  2. 在终端下使用--login选项调用bash,可以获得一个交互式login shell。

  3. 在脚本中使用--login选项调用bash(比如在shell脚本第一行做如下指定:#!/bin/bash --login),此时得到一个非交互式的login shell。

  4. 使用"su -"切换到指定用户时,获得此用户的login shell。如果不使用"-",则获得non-login shell。

login shell与non-login shell的主要区别在于它们启动时会读取不同的配置文件,从而导致环境不一样。login shell启动时首先读取/etc/profile全局配置,然后依次查找~/.bash_profile、~/.bash_login、~/.profile三个配置文件,并且读取第一个找到的并且可读的文件。login shell退出时读取并执行~/.bash_logout中的命令。

交互式的non-login shell启动时读取~/.bashrc资源文件。非交互式的non-login shell不读取上述所有配置文件,而是查找环境变量BASH_ENV,读取并执行BASH_ENV指向的文件中的命令。

如果使用命令"sh"调用bash,bash会尽可能保持向后兼容。作为login shell启动时,bash依次读取/etc/profile和~/.profile配置文件。作为non-login shell启动时,bash读取环境变量ENV指向的文件。

通常我们要定制一些配置时,将配置写在~/.bashrc中,然后在~/.bash_profile中读取~/.bashrc,这样可以保证login shell和交互式non-login shell得到相同的配置。至于/etc/profile就不要轻易去改啦,毕竟会影响系统全局的配置。


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

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只能从其父进程处继承环境变量

理清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目录中的内容


参考网址:

http://www.cnblogs.com/qcly/p/3273373.html

http://blog.chinaunix.net/uid-23842323-id-2656618.html



http://blog.sciencenet.cn/blog-3238131-1037461.html

上一篇:文章憎命达——我在深夜的一次细思回想
下一篇:[转载]login shell与non-login shell的区别

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备14006957 )

GMT+8, 2019-12-8 01:46

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部