Shell四種執行方式(啟動方式)

2020-07-16 10:04:47
Shell 是一個應用程式,它的一端連線著 Linux 核心,另一端連線著使用者。Shell 是使用者和 Linux 系統溝通的橋樑,我們都是通過 Shell 來管理 Linux 系統。

我們可以直接使用 Shell,也可以輸入使用者名稱和密碼後再使用 Shell;第一種叫做非登入式,第二種叫做登入式。

我們可以在 Shell 中一個個地輸入命令並及時檢視它們的輸出結果,整個過程都在跟 Shell 不停地互動,這叫做互動式。我們也可以執行一個 Shell 指令碼檔案,讓所有命令批次化、一次性地執行,這叫做非互動式。

總起來說,Shell 一共有四種執行方式:
  • 互動式的登入 Shell;
  • 互動式的非登入 Shell;
  • 非互動式的登入 Shell;
  • 非互動式的非登入 Shell。

判斷 Shell 是否是互動式

判斷是否為互動式 Shell 有兩種簡單的方法。

1) 檢視變數-的值,如果值中包含了字母i,則表示互動式(interactive)。

【範例1】在 CentOS GNOME 桌面環境自帶的終端下輸出-的值:
[c.biancheng.net]$ echo $-
himBH
包含了i,為互動式。

【範例2】在 Shell 指令碼檔案中輸出-的值:
[c.biancheng.net]$ cat test.sh
#!/bin/bash

echo $-
[c.biancheng.net]$ bash ./test.sh
hB
不包含i,為非互動式。注意,必須在新進程中執行 Shell 指令碼。

2) 檢視變數PS1的值,如果非空,則為互動式,否則為非互動式,因為非互動式會清空該變數。

【範例1】在 CentOS GNOME 桌面環境自帶的終端下輸出 PS1 的值:
[[email protected]]$ echo $PS1
[[email protected] W]$
非空,為互動式。

【範例2】在 Shell 指令碼檔案中輸出 PS1 的值:
[c.biancheng.net]$ cat test.sh
#!/bin/bash

echo $PS1
[c.biancheng.net]$ bash ./test.sh

空值,為非互動式。注意,必須在新進程中執行 Shell 指令碼。

判斷 Shell 是否為登入式

判斷 Shell 是否為登入式也非常簡單,只需執行shopt login_shell即可,值為on表示為登入式,off為非登入式。

shopt 命令用來檢視或設定 Shell 中的行為選項,這些選項可以增強 Shell 的易用性。

【範例1】在 CentOS GNOME 桌面環境自帶的終端下檢視 login_shell 選項:
[c.biancheng.net]$ shopt login_shell
login_shell    off

【範例2】按下Ctrl+Alt+Fn組合鍵切換到虛擬終端,輸入使用者名稱和密碼登入後,再檢視 login_shell 選項:
[c.biancheng.net]$ shopt login_shell
login_shell    on

【範例3】在 Shell 指令碼檔案中檢視 login_shel 選項:
[c.biancheng.net]$ cat test.sh
#!/bin/bash

shopt login_shell
[c.biancheng.net]$ bash ./test.sh
login_shell    off

同時判斷互動式、登入式

要同時判斷是否為互動式和登入式,可以簡單使用如下的命令:

echo $PS1; shopt login_shell

或者

echo $-; shopt login_shell

常見的 Shell 啟動方式

1) 通過 Linux 控制台(不是桌面環境自帶的終端)或者 ssh 登入 Shell 時(這才是正常登入方式),為互動式的登入 Shell。
[c.biancheng.net]$ echo $PS1;shopt login_shell
[[email protected] W]$
login_shell    on

2) 執行 bash 命令時預設是非登入的,增加--login選項(簡寫為-l)後變成登入式。
[c.biancheng.net]$ cat test.sh
#!/bin/bash

echo $-; shopt login_shell
[c.biancheng.net]$ bash -l ./test.sh
hB
login_shell    on

3) 使用由()包圍的組命令或者命令替換進入子 Shell 時,子 Shell 會繼承父 Shell 的互動和登入屬性。
[c.biancheng.net]$ bash
[c.biancheng.net]$ (echo $PS1;shopt login_shell)
[[email protected] W]$
login_shell    off
[c.biancheng.net]$ bash -l
[c.biancheng.net]$ (echo $PS1;shopt login_shell)
[[email protected] W]$
login_shell    on

4) ssh 執行遠端命令,但不登入時,為非互動非登入式。
[c.biancheng.net]$ ssh localhost 'echo $PS1;shopt login_shell'

login_shell     off

5) 在 Linux 桌面環境下開啟終端時,為互動式的非登入 Shell。
桌面環境下打開終端為交互式的非登錄Shell