交互式與非交互式的區別

交互式與非交互式shell /登錄shell于非登錄shell

外網連不上,教室裝修太吵,相關資料找不到,云云不知所云,托托癥又犯了交互式與非交互式的區別

登錄shell_非登錄shell
//
.bash_profile .bashrc profile 文件的作用的執行順序
http://blog.csdn.net/robertaqi/archive/2010/04/04/5449763.aspx
登陸shell與交互式非登陸shell的區別
Linux中的shell
 1.登錄shell
  所謂登錄shell,指的是當用戶登錄系統時所取的那個   shell。登錄shell屬于交互式shell。
 登錄shell將查找4個不同的啟動文件來處理其中的命令。 bash shell處理文件的順序如下:
 1: /etc/profile
 2:/etc/profile.d等待配置文件
 3: $HOME/.bash_profile
 4: $HOME/.bash_login
 5 $HOME/.profile
  /etc /profile是bash shell在系統上的主默認啟動文 件,系統上 每一個用戶在登陸時都將執行此文件。
 通過設置這個文件,
 超級用戶可以為全系統內的所有bash用戶建立默認特征。不同 Linux版本在此文件放置的命令不盡相同,
 在redflag中,該文件設置了幾個重要的變量,
 如:PATH USER LOGNAME MAIL HOSTNAME HISTSIZE  INPUTRC,詳情可以查看具體的文件。
 其余3個文件具備相同的功能——提供特定于用戶的啟動文件。大多 數Linux版本只使用其中之一。如:RedFlag使用.bash_profile   ubuntu使用.profile . 
 shell依次查找~/.bash_profile、
 ~/.bash_login、
 ~/.profile(~是用戶主目錄的速記符),
 并執行它找到的首個文件中的命令。
 可以將命令放置在這些文件中以覆蓋掉/etc/profile文件中的默認設置。
 也就是后面的文件可以覆蓋或者修改前面的設置 。
 2. 交互式非登錄shell
 如果啟動了一個bash shell而沒有等錄系統(如在CLI提示符中鍵入bash),
 則啟動了一個交互式非登錄shell.
 而登錄shell的初始化文件(比如.bash_profile)通常會運行這個文件。這樣,登錄shell和非登錄shell都可以使用.bashrc中的命令。
 如以X Window環境登錄Linux時,在X環境所起動的終端,那些shell都是非登錄shell.
 在交互式非登錄shell中并不執行前面提到的初始化文件中的命令。然而,交互式非登錄shell從登錄shell繼承了由這些初始化文件設置的 shell變量。
 (1) $HOME/.bashrc
 交互式非登錄shell執行~/.bashrc文件中的命令.在每次執行shell腳本時,都會重新讀取這個文件,所以是最完整的。 
 但是萬事都不是一樣的,debain系列的是不同的,如ubuntu
 /etc/profile–>/etc/environment–>$HOME/.profile
要配置java等變量時,都/etc/environment中
   bash again shell的啟動文件
   http://blog.csdn.net/chehlcy/archive/2010/03/03/5339739.aspx
1.登錄設立shell
   /etc/profile:shell 首先執行/etc/profile中的命令,超級用戶可以為整個系統的用戶建立默認配置
 ~/.bash_profile,~/.bash_login,~/.profile:然后社shell執行這三個文件中找到的第一個,可以在該文件中為具體用戶建立配置。
 ~/.bash_logout:退出時執行
2.交互式非登錄shell:該類社shell繼承登錄shell的所有配置并執行以下文件
  /etc/bashrc:由~/.bashrc調用,可以在此建立全系統配置。
 ~/.bashrc:然后運行該文件,可以在此為具體shell建立配置。.bash_profile通常也會調用該文件
3.非交互式shell(運行shell腳本的shell)
 不執行初始化文件,從登錄shell處繼承配置。
可以在/etc/profile或者 ~/bash_profile中用ulimit -n 8192類似方法改變進程能打開的最大文件數
關于登錄linux時,/etc/profile、~/.bash_profile等幾個文件的執行過程
http://blog.csdn.net/lemon_fantasy/archive/2008/10/07/3023075.aspx
在登錄Linux時要執行文件的過程如下:
在剛登錄Linux時,首先啟動 /etc/profile 文件,然后再啟動用戶目錄下的 ~/.bash_profile、 ~/.bash_login或 ~/.profile文件中的其中一個,執行的順序為:~/.bash_profile、 ~/.bash_login、 ~/.profile。如果 ~/.bash_profile文件存在的話,一般還會執行 ~/.bashrc文件。因為在 ~/.bash_profile文件中一般會有下面的代碼:
if [ -f ~/.bashrc ] ; then
. ./bashrc
fi
~/.bashrc中,一般還會有以下代碼:
if [ -f /etc/bashrc ] ; then
. /bashrc
fi
所以,~/.bashrc會調用 /etc/bashrc文件。最后,在退出shell時,還會執行 ~/.bash_logout文件。
執行順序為:/etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) -> ~/.bashrc ->          /etc/bashrc -> ~/.bash_logout
關于各個文件的作用域,在網上找到了以下說明:
(1)/etc/profile: 此文件為系統的每個用戶設置環境信息,當用戶第一次登錄時,該文件被執行. 并從/etc/profile.d目錄的配置文件中搜集shell的設置。
(2)/etc/bashrc: 為每一個運行bash shell的用戶執行此文件.當bash shell被打開時,該文件被讀取。
(3)~/.bash_profile: 每個用戶都可使用該文件輸入專用于自己使用的shell信息,當用戶登錄時,該文件僅僅執行一次!默認情況下,他設置一些環境變量,執行用戶的.bashrc文件。
(4)~/.bashrc: 該文件包含專用于你的bash shell的bash信息,當登錄時以及每次打開新的shell時,該該文件被讀取。
(5)~/.bash_logout:當每次退出系統(退出bash shell)時,執行該文件. 另外,/etc/profile中設定的變量(全局)的可以作用于任何用戶,而~/.bashrc等中設定的變量(局部)只能繼承/etc/profile中的變量,他們是”父子”關系。
(6)~/.bash_profile 是交互式、login 方式進入 bash 運行的~/.bashrc 是交互式 non-login 方式進入 bash 運行的通常二者設置大致相同,所以通常前者會調用后者。
以下內容來自《Shell 設計入門》
<!–[if !supportLists]–> 
/etc/profile 由 root 所控管, 用來設定適合全體使用者的shell環境 
<!–[if !supportLists]–> 若使用者自己覺得 /etc/profile 的設定, 並不合意, 可以修改自家目錄中的.bash_profile <!–[endif]–> 
<!–[if !supportLists]–> 既然有了 .bash_profile, 為何要有 .bash_login 及 .profile ?這是因為有些人可能是從 Bourne shell移轉過來的, 那麼, 只要將 Bourne shell 主要的起動檔 .profile 移到自家目錄中, 放棄使用.bash_profile 及 .bash_login 即可繼續沿用以前的設定環境 <!–[endif]–> 
<!–[if !supportLists]–>bash_login 存在理由或許和 c shell 有關, 但因為 bash 和 c shell 二者語法並不完全相容, 因此, 並不建議將 c shell 的啟動檔直接移過 
登錄Linux時/etc/profile、~/.bash_profile等幾個文件的執行過程
http://blog.csdn.net/lyw2698/archive/2007/12/11/1928747.aspx
在登錄Linux時要執行文件的過程如下:
在剛登錄Linux時,首先啟動 /etc/profile 文件,然后再啟動用戶目錄下的 ~/.bash_profile、 ~/.bash_login或 ~/.profile文件中的其中一個,執行的順序為:~/.bash_profile、 ~/.bash_login、 ~/.profile。如果 ~/.bash_profile文件存在的話,一般還會執行 ~/.bashrc文件。因為在 ~/.bash_profile文件中一般會有下面的代碼:
if [ -f ~/.bashrc ] ; then
. ./bashrc
fi
~/.bashrc中,一般還會有以下代碼:
if [ -f /etc/bashrc ] ; then
. /bashrc
fi
所以,~/.bashrc會調用 /etc/bashrc文件。最后,在退出shell時,還會執行 ~/.bash_logout文件。
執 行順序為:/etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) -> ~/.bashrc ->          /etc/bashrc -> ~/.bash_logout
關于各個文件的作用域,在網上找到了以下說明:
(1)/etc/profile: 此文件為系統的每個用戶設置環境信息,當用戶第一次登錄時,該文件被執行. 并從/etc/profile.d目錄的配置文件中搜集shell的設置。
(2)/etc/bashrc: 為每一個運行bash shell的用戶執行此文件.當bash shell被打開時,該文件被讀取。
(3)~/.bash_profile: 每個用戶都可使用該文件輸入專用于自己使用的shell信息,當用戶登錄時,該文件僅僅執行一次!默認情況下,他設置一些環境變量,執行用戶的.bashrc文件。
(4)~/.bashrc: 該文件包含專用于你的bash shell的bash信息,當登錄時以及每次打開新的shell時,該該文件被讀取。
(5)~/.bash_logout: 當每次退出系統(退出bash shell)時,執行該文件. 另外,/etc/profile中設定的變量(全局)的可以作用于任何用戶,而~/.bashrc等中設定的變量(局部)只能繼承/etc /profile中的變量,他們是”父子”關系。
(6)~/.bash_profile 是交互式、login 方式進入 bash 運行的~/.bashrc 是交互式 non-login 方式進入 bash 運行的通常二者設置大致相同,所以通常前者會調用后者。
linux環境變量文件
http://blog.csdn.net/Johnvikey/archive/2009/12/05/4941922.aspx
關于linux環境變量文件 
第一內容:
etc/profile:此文件為系統的每個用戶設置環境信息,當用戶第一次登錄時,該文件被執行.
并從/etc/profile.d目錄的配置文件中搜集shell的設置.
/etc/bashrc:為每一個運行bash shell的用戶執行此文件.當bash shell被打開時,該文件被讀取.
第二內容:
~/.bash_profile:每個用戶都可使用該文件輸入專用于自己使用的shell信息,當用戶登錄時,該
文件僅僅執行一次!默認情況下,他設置一些環境變量,執行用戶的.bashrc文件.
~/.bashrc:該文件包含專用于你的bash shell的bash信息,當登錄時以及每次打開新的shell時,該
該文件被讀取.
~/.bash_profile 是交互式、login 方式進入 bash 運行的
~/.bashrc 是交互式 non-login 方式進入 bash 運行的
通常二者設置大致相同,所以通常前者會調用后者。
/etc/profile中設定的變量(全局)的可以作用于任何用戶,而
~/.bashrc等中設定的變量(局部)只能繼承/etc/profile中的變量,他們是”父子”關系.
第三內容:
~/.bash_logout:當每次退出系統(退出bash shell)時,執行該文件. 
執掃順序總結:
 /etc/profile—— ~/.bash_profile( ~/.bash_login或 ~/.profile(linux版本而定))——-~/.bashrc——/etc/bashrc—— ~/.bash_logout
——————————————————————————–
具體
在登錄Linux時要執行文件的過程如下:
在剛登錄Linux時,首先啟動 /etc/profile 文件,然后再啟動用戶目錄下的 ~/.bash_profile、 ~/.bash_login或 ~/.profile文件中的其中一個(根據不同的linux操作系統的不同,命名不一樣),
執行的順序為:~/.bash_profile、 ~/.bash_login、 ~/.profile。
如果 ~/.bash_profile文件存在的話,一般還會執行 ~/.bashrc文件。
~/.bash_profile文件中一般會有下面的代碼:
if [ -f ~/.bashrc ] ; then
. ./bashrc
fi
~/.bashrc中,一般還會有以下代碼:
if [ -f /etc/bashrc ] ; then
. /bashrc
fi
所以,~/.bashrc會調用 /etc/bashrc文件。最后,在退出shell時,還會執行 ~/.bash_logout文件。
執行順序為:/etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) -> ~/.bashrc -> /etc/bashrc -> ~/.bash_logout
關于各個文件的作用域,在網上找到了以下說明:
(1)/etc/profile: 此文件為系統的每個用戶設置環境信息,當用戶第一次登錄時,該文件被執行. 并從/etc/profile.d目錄的配置文件中搜集shell的設置。
(2)/etc/bashrc: 為每一個運行bash shell的用戶執行此文件.當bash shell被打開時,該文件被讀取。
(3)~/.bash_profile: 每個用戶都可使用該文件輸入專用于自己使用的shell信息,當用戶登錄時,該文件僅僅執行一次!默認情況下,他設置一些環境變量,執行用戶的.bashrc文件。
(4)~/.bashrc: 該文件包含專用于你的bash shell的bash信息,當登錄時以及每次打開新的shell時,該該文件被讀取。
(5)
~/.bash_logout:當每次退出系統(退出bash shell)時,執行該文件.
另外,/etc/profile中設定的變量(全局)的可以作用于任何用戶,而~/.bashrc等中設定的變量(局部)只能繼承
/etc/profile中的變量,他們是”父子”關系。
(6)~/.bash_profile 是交互式、login 方式進入 bash 運行的~/.bashrc 是交互式 non-login 方式進入 bash 運行的通常二者設置大致相同,所以通常前者會調用后者。
/etc/profile和/etc/environment等各種環境變量設置文件的用處
先將export LANG=zh_CN加入/etc/profile ,退出系統重新登錄,登錄提示顯示英文。
將/etc/profile 中的export LANG=zh_CN刪除,將LNAG=zh_CN加入/etc/environment,退出系統重新登錄,登錄提示顯示中文。
用戶環境建立的過程中總是先執行/etc/profile然后在讀取/etc/environment。為什么會有如上所敘的不同呢?
應該是先執行/etc/environment,后執行/etc/profile。
/etc/environment是設置整個系統的環境,而/etc/profile是設置所有用戶的環境,前者與登錄用戶無關,后者與登錄用戶有關。
系統應用程序的執行與用戶環境可以是無關的,但與系統環境是相關的,所以當你登錄時,你看到的提示信息,象日期、時間信息的顯示格式與系統環境的LANG是相關的,缺省LANG=en_US,如果系統環境LANG=zh_CN,則提示信息是中文的,否則是英文的。
對于用戶的SHELL初始化而言是先執行/etc/profile,再讀取文件/etc/environment.對整個系統而言是先執行/etc/environment。這樣理解正確嗎?
/etc/enviroment –> /etc/profile –> $HOME/.profile –>$HOME/.env (如果存在)
/etc/profile 是所有用戶的環境變量
/etc/enviroment是系統的環境變量
登陸系統時shell讀取的順序應該是
/etc/profile ->/etc/enviroment –>$HOME/.profile –>$HOME/.env
原因應該是jtw所說的用戶環境和系統環境的區別了
如果同一個變量在用戶環境(/etc/profile)和系統環境(/etc/environment)有不同的值那應該是以用戶環境為準了。
 
Shell腳本和Shell的初始化
http://hi.baidu.com/С??ireed/blog/item/f45b3a137b6172d8f6039e62.html
Shell腳本用source或者.來獲得。
例:
假設文件ls.script在文件夾linux下,這個文件夾下還有個文件是example,
[ireed@redhat linux]$ ls
example ls.script
下面是ls.script的內容:
[ireed@redhat linux]$ cat ls.script 
ls
對,也就是說ls.script的內容就一行是ls。
開始實驗:
[ireed@redhat linux]$ source ls.script 
example ls.script
[ireed@redhat linux]$ ls
example ls.script
[ireed@redhat linux]$ . ls.script 
example ls.script
[ireed@redhat linux]$ 
我們看到獲得ls.script與運行ls命令會得到同樣的效果,都是顯示linux文件夾下面的內容,如果你編輯其他的腳本文件,然后獲得它,也是可以運行的。
登錄Shell、非登錄Shell、交互式Shell與非交互式Shell   
也就是說左邊有”login:”的就是登錄Shell否則就是非登錄Shell;交互與非交互Shell也是很好區分的.
啟動登錄Shell時獲得/etc/profile,/etc/profile.d/*.sh及~/.bash_profile;
每次Shell啟動時獲得/etc/bashrc和~/.bashrc;
每次Shell退出時獲得~/.bash_logout
只有登錄Shell可以獲得/etc/profile和~/.bash_profile;而/etc/bashrc和~/.bashrc被所有Shell獲得.前兩個文件用來配置環境變量,只被初始化一次,后兩個習慣上用于Shell的自定義,如別名和Shell選項.
注意對稱,對于環境變量,有一個通用的啟動文件(/etc/profile)和一個本地的啟動文件(~/.bash_profile),前者可以被系統管理員用來配置系統范圍,后者被個人用戶自定義自己的環境;/etc/bashrc和~/.bashrc也類似.
交互 式shell和非交互式shell、登錄shell和非登錄shell的區別。
首先,這是兩個不同的維度來劃分的,一個是是否交互式,另 一個是是否登錄。
交互式shell和非交互式shell
交互式模式就是shell等待你的輸入, 并且立即執行你提交的命令。這種模式被稱作交互式是因為shell與用戶進行交互。這種模式也是大多數用戶非常熟悉的:登錄、執行一些命令、簽退。當你簽 退后,shell也終止了。
shell也可以運行在另外一種模式:非交互式模式,以shell script(非交互)方式執行。在這種模式 下,shell不與你進行交互,而是讀取存放在文件中的命令,并且執行它們。當它讀到文件的結尾,shell也就終止了。
chinaunix 論壇中關于登錄shell與非登錄shell、交互式shell與非交互式Shell的討論:
Login Shell:當init3時,mingetty spawn出登錄提示符的時候,你輸入帳號和密碼進入了,出現了shell提示符,這個過程就是登錄外殼;
Interactive Shell:接下來你得到了一個像root@host />這樣的提示符,你輸入什么,它就解釋出什么,這就是交互式外殼;你在當前Shell又fork了一個shell(bash),這個bash也是 交互式外殼。通常情況下interactive shell是login shell派生出來的。
Non Interactive Shell:你可能需要學習寫一個bash script,用外部shell執行:bash  script.sh,它(bash)從第一條命令執行到最后一條然后退出,不與你進行任何交互,它就是 非交互式外殼。
交互式非登錄shell就是指你在Gnome圖形界面中打開“終端”出來的那種窗口程序,
和登錄shell 相比,它是“非登錄”的,你并不需要輸入用戶名和密碼,
和非交互式shell相比,這是“交互式”的,就像你說的那它:你輸入什么,它就解釋出什么
執行exit退出非登錄shell狀 態;
執行logout退出登錄shell狀態。
在登錄shell里,確實只讀取/etc/profile和~ /.bash_profile, ~/.bash_login, and ~/.profile按順序最先的一個,并執行其中的命令。除非被 –noprofile選項禁止了;
在非登錄shell里,確實只讀取 /etc/bash.bashrc和~/.bashrc

原創文章,作者:HGG,如若轉載,請注明出處:http://www.www58058.com/77904

(6)
HGGHGG
上一篇 2017-06-11 20:35
下一篇 2017-06-11 23:06

相關推薦

  • 第九周-Shell腳本編程

      1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現; #!/bin/bash nologin=0 login=0 for i in `cut -d : -f 7 /etc/passwd`;do if [ $i = /sbin/n…

    Linux干貨 2017-08-23
  • 新的篇章

    第一天,linux,努力,奮斗!

    Linux干貨 2017-07-11
  • 馬哥教育21期網絡班—第三周課程+練習

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 who |cut -d" " -f1 |sort -u 2、取出最后登錄到當前系統的用戶的相關信息。 id `who | tail -n …

    Linux干貨 2016-07-12
  • 文件通配符是啥?

    文件通配符     包含 ‘?’, ‘*’ 或 ‘[‘ 字符的字符串稱為通配符模板(wildcard  pattern).形成路徑名(globbing)指一種操作,把通配符模板展開為匹配該串的路徑名.匹配定義為:   …

    Linux干貨 2017-04-23
  • NET25_第6周作業

    1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#; (1) cp /etc/rc.d/rc.sysinit /tmp cd /tmp vim rc.sysint vim命令::%s/\(^[[:space:]]\)\+/#\…

    Linux干貨 2017-03-15
  • 第四周博客分享

                    時間匆匆,轉眼來馬哥已經快一個月了,這一個月對我來說是收獲滿滿,每天都在學到新的東西。       &nbs…

    2017-08-06
欧美性久久久久