1. 程式人生 > >互動式shell和非互動式shell、登入…

互動式shell和非互動式shell、登入…

也算寫過一些Bash指令碼的人了,不過對與這幾個概念,還不是很清楚,於是惡補了一下。

互動式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:接下來你得到了一個像
[email protected]
/>這樣的提示符,你輸入什麼,它就解釋出什麼,這就是互動式外殼;
你在當前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

轉自:http://www.51testing.com/html/38/225738-216858.html

==========================================
以下來自另一文
==========================================

 當啟動shell時,它將執行啟動檔案來初始化自己。具體執行哪個檔案取決於該shell是登陸shell還是非登陸shell的互動方式(比如通過bash),又或者是一個非互動式shell(用來執行shell指令碼)。要執行啟動檔案中的命令,使用者就必須具備讀的許可權,而一般的Linux發行版本都會把對應的命令放在一些啟動檔案中。

 1:互動式登陸shell

互動式登陸shell指的是當用戶登入系統時所用的那個shell(可以預設指定,如bash shell)。登入shell 將查詢幾個不同的啟動檔案來處理其中的命令,
bash shell 處理檔案的順序如下:

/etc/profile        
shell首先執行/etc/profile中的命令。設定這個檔案後,可以為系統內所有的bash使用者建立預設的特徵(不同版本的Linux在此檔案放置的命令不盡相同);

~/.bash_profile、~/.bash_login、~/.profile     然後shell依次查詢這些檔案,並執行它找到的第一個檔案中的命令。可以將命令放在這些檔案中,以重寫/etc/profile檔案中預設的設定;

~/.bash_logout   
當用戶登出時,bash執行檔案~/.bash_logout中的命令,這個檔案包含了退出會話時執行的清理命令,如:刪除臨時檔案等;

 

2:互動式非登陸shell

互動式非登陸shell指的是如果啟動了一個bash shell 而沒有登陸系統(如在CLI 提示符中鍵入bash),則啟動了一個互動式非登入shell。
互動式非登入shell並不執行前面提到的啟動檔案中的命令,然而互動式非登陸shell從登入shell繼承了由這些啟動檔案設定的shell變數。

/etc/bashrc   
儘管不是通過bash直接呼叫,但許多~/.bashrc檔案呼叫/etc/bashrc。這種設定使得超級使用者可以為系統內的非登陸shell建立預設屬性。

.bashrc           互動式非登陸shell執行~/.bashrc檔案中的命令,而登陸shell的啟動檔案(如.bash_profile)通常會執行這個檔案。這樣,登陸shell和非登陸shell都可以執行.bashrc中的命令了。

 

3:非互動式shell

非互動式shell指的是以shell script(指令碼)方式執行。
在這種模式在執行時shell 並不與使用者進行互動(除非在執行時需要使用者指定執行引數),而是讀取存放在檔案中的命令並執行它們。
當它讀到檔案的結尾,shell 也就終止了。
這些shell從登陸時就繼承了由這些啟動檔案設定的shell變數。

BASH_ENV  
非互動式shell查詢環境變數BASH_ENV(或者當作為sh呼叫時為的ENV),並執行由該變數命名的檔案中的命令。

轉自:http://www.cnblogs.com/zhaoyl/archive/2012/07/07/2580744.html

==========================================
以下來自另一文
==========================================

神馬是shell

Shell是一種具備特殊功能的程式,它是介於使用者和 UNIX/Linux 作業系統之核心程式(kernel)間的一個介面。
為什麼我們說 shell 是一種介於系統核心程式與使用者間的中介者呢?
讀過作業系統概論的讀者們都知道作業系統是一個系統資源的管理者與分配者,當您有需求時,您得向系統提出;從作業系統的角度來看,它也必須防止使用者因為錯誤的操作而造成系統的傷害。
眾所周知,對計算機下命令得透過命令(command)或是程式(program);程式有編譯器(compiler)將程式轉為二進位制程式碼,可是命令呢?
其實shell 也是一支程式,它由輸入裝置讀取命令,再將其轉為計算機可以瞭解的機械碼,然後執行它。

各種作業系統都有它自己的 shell,以 DOS 為例,它的 shell 就是 command.com 。如同 DOS 下有 NDOS,4DOS,DRDOS 等不同的命令解譯程式可以取代標準的 command.com ,UNIX 下除了 Bourne shell(/bin/sh) 外還有 C shell(/bin/csh)、Korn shell(/bin/ksh)、Bourne again shell(/bin/bash)、Tenex C shell(tcsh) … 等其它的 shell。
UNIX/Linux 將 shell 獨立於核心程式之外,使得它就如同一般的應用程式,可以在不影響作業系統本身的情況下進行修改、更新版本或是新增新的功能。


互動式與非互動式shell /登入shell與非登入shell

登陸shell與互動式非登陸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中



關於各個檔案的作用域,在網上找到了以下說明:
(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指令碼和Shell的初始化
http://hi.baidu.com/С??ireed/blog/item/f45b3a137b6172d8f6039e62.html

Shell指令碼用source或者.來獲得。
例:
假設檔案ls.script在資料夾linux下,這個資料夾下還有個檔案是example,
[[email protected] linux]$ ls
example ls.script
下面是ls.script的內容:
[[email protected] linux]$ cat ls.script
ls
對,也就是說ls.script的內容就一行是ls。
開始實驗:


[[email protected] linux]$ source ls.script
example ls.script
[[email protected] linux]$ ls
example ls.script
[[email protected] linux]$ . ls.script
example ls.script
[[email protected] linux]$

我們看到獲得ls.script與執行ls命令會得到同樣的效果,都是顯示linux資料夾下面的內容,如果你編輯其他的指令碼檔案,然後獲得它,也是可以執行的。


登入Shell、非登入Shell、互動式Shell與非互動式Shell
                                    登入Shell           互動式Shell
從虛擬控制檯登入Shell                   是                   是
通過網路Shell到一臺
遠端機器上時登入Shell                   是                   是
X初始化Shell                            是                   是
X終端Shell                              否                   是

相關推薦

互動式SHELL互動式SHELL登入SHELL登入SHELL的區別

互動式shell和非互動式shell、登入shell和非登入shell的區別。 首先,這是兩個不同的維度來劃分的,一個是是否互動式,另一個是是否登入。 互動式shell和非互動式shell(interactive shell and non-interactive s

深入淺出理解互動式shell互動式shell登入shell登入shell的區別

首先我們需要把bash理解為一種模式,我們不如把這種模式想象成類似於洋蔥一樣的結構,我們可以一層一層剝開,也就是說我們可以一層一層的進入子shell。就好比我們進入一棟樓,開啟一個房間是一個環境,在當前這個房間我們又看到了一個門,當我們開啟這個門的時候,我們就已經進入了新的

雜貨:互動式shell互動式shell登入shell登入shell的區別

[[email protected] ~]# man bash -i If the -i option is present, the shell is interactive. –noprofile Do not re

互動式shell互動式shell登入

也算寫過一些Bash指令碼的人了,不過對與這幾個概念,還不是很清楚,於是惡補了一下。 互動式shell和非互動式shell、登入shell和非登入shell的區別。 首先,這是兩個不同的維度來劃分的,一個是是否互動式,另一個是是否登入。 互動式shell和非互動式shell 互動式模式就是shell等

Linux登入shell登入(互動式shell)環境變數配置

![](http://static.oschina.net/uploads/img/201601/07175805_qTMP.gif) 使用Jenkins執行shell指令碼的時候, 碰到`command not found`. 比如`java mvn`, 這些環境變數配置在`/etc/profile` 中

python之SSH(互動式互動式

python中有一個paramiko,功能強大,用來做SSH比較方便 先上程式碼 import paramikoclass SSHConnection(object): def __init__(self, host, port, username, passwo

Windows正向綁定shell反向反彈shell的Python代碼

反彈 RoCE 無法 效果 bre optparser eas rev all Windows下的shell原理 經過查閱資料,使用os.dup2(nfd, ofd)的方式重定向socket的輸入輸出到windows系統的cmd是無法做到的,屬於系統原因,不能直接復制Li

【轉】mysql互動式連線&互動式連線

互動式操作:通俗的說,就是你在你的本機上開啟mysql的客戶端,就是那個黑視窗,在黑視窗下進行各種sql操作,當然走的肯定是tcp協議。 非互動式操作:就是你在你的專案中進行程式呼叫。比如一邊是tomcat web伺服器,一邊是資料庫伺服器,兩者怎麼通訊?在java web裡,我們通常會選擇hibernat

二叉樹的先序遍歷(遞迴遞迴)中序遍歷(遞迴遞迴)後序遍歷(遞迴)及層次遍歷java實現

二叉樹的先序遍歷,遞迴實現: public List<Integer> preorderTraversal(TreeNode root) { //用棧來實現 List<Integer> list = new ArrayList&l

對稱加密對稱加密數字簽名數字證書的區別

之前在面試的時候被問到了HTTPS,SSL這樣的知識點,也沒答上來,這裡也簡單整理一下。 首先還是來解釋一下基礎的東東: 對稱加密: 加密和解密都是用同一個金鑰 非對稱加密: 加密用公開的金鑰,解密用私鑰 (私鑰只有自己知道

從新手到系統管理員(一):理解Linux Shell基本的Shell指令碼

本文由 [茶話匯] – [Qing] 編譯自 [Avishek Kumar] 轉載請註明出處 關於GNU/Linux的架構和shell所處的位置,圖片比語言表述的更加清楚,如下圖所示。 理解Linux Shell Shell:Shell是基於命令列的直譯器,它連線使用者和作業系統,允許通過編寫指令

演算法穩定排序穩定排序內排序外排序時間複雜度空間複雜度

轉自:點選開啟連結 1、穩定排序和非穩定排序 簡單地說就是所有相等的數經過某種排序方法後,仍能保持它們在排序之前的相對次序,我們就說這種排序方法是穩定的。反之,就是非穩定的。 比如:一組數排序前是a1,a2,a3,a4,a5,其中a2=a4,經過某種排序後為a1,a2,a4

Linux中環境變數到底寫在哪個檔案中?解析login shell no-login shell

login shell:取得bash 時需要完整的登入流程,就稱為login shell。舉例來說,同tty1~tty6登入時, 需要輸入使用者名稱和密碼,此時取得的bash就稱為login shell non-login shell:取得bash介面的方法不需要重複登入的動作。 舉兩個例子 (1)以X

expect -------把互動式命令變為互動式命令使用

一、expect當你不能把互動式的命令變成非互動式的命令時使用spawn生成           expect捕獲             send傳送1.方法:設定ssh下次登陸不再需要密碼ssh-k

Qt對話方塊/視窗模態模態Qt::WA_DeleteOnClose

聊一聊Qt中,對話方塊/視窗、模態、非模態、獨立視窗釋放記憶體(設定視窗屬性為Qt::WA_DeleteOnClose)。 用得最多的就是對話方塊/視窗,QMainWindow、QWidget、QDi

登入/登入互動/互動式shell

登入與非登入shell的: 區分:是否需要輸入使用者名稱密碼。 轉換: 非登入可以轉換成登入 使用--login 考慮轉換情況,相對科學的區分:既不使用密碼,也不使用--login轉換的是非登入,其他

/etc/profile與/etc/bashrc互動式互動式login與non-login shell的區別

線上的memcached又掛了,仍然沒有得到core檔案。排查原因,同事發現啟動memcached的指令碼存在可疑問題。 問題一:沒有設定memcached工作目錄,有可能core dump時沒有工作

Linux Shell Bash 互動與互動式指令碼

互動式的shell會在tty上從使用者輸入中讀取命令. 另一方面, 這樣的shell能在啟動時讀取啟動檔案, 顯示一個提示符, 並預設啟用作業控制. 也就是說, 使用者可以與shell互動. shell所執行的指令碼通常都是非互動的shell. 但是指令碼仍然可以訪問它的tty. 甚至可以在指令碼中模擬一

linux下的shell——如何修改shell的提示符,能夠出現登入使用者名稱主機名路徑

有的機器上可能登上去後顯示總是-bash-3.00$,解決方法是對比其他機器的~/.bash_profile檔案,發現補充上以下東西就可以顯示"[email protected]機器名 當前dir“了。 2 if [ -f ~/.bashrc ]; then 3 . ~/.bashrc 4 fi

shell指令碼-新增使用者(互動式)

練習,寫一個指令碼,完成以下要求:   1)、新增使用者前,顯示系統目前共有多少個使用者;   2)、新增4個使用者hadoop, mandriva, openstack, mysql;但要先判斷使用者是否存在,不存在而後再新增,並且顯示新增成功的訊息   3)、新增完成後