《Linux命令列與shell指令碼程式設計大全》第五章理解shell

xcywt發表於2017-11-11

5.1

1. cat /etc/passwd

可以檢視每個使用者自己的預設的shell程式。

2.預設的互動shell會在使用者登入某個虛擬控制檯終端時啟動。

不過還有另外一個預設的shell是/bin/sh,它作為預設的shell,用於那些需要在啟動時使用的shell指令碼

 

ls -l /bin/sh   進行檢視

 

烏班圖的發行版中預設的系統shell(dash shell)和預設的互動shell(bash shell)並不相同。

 

 

可以直接 dash 來啟動 dash shell

exit 退出

 

5.2 shell 的父子關係

一個shell可以建立另外一個shell(子shell)。

ps -f 檢視一下。

bash shell就是一個程式(執行的程式)。

輸入bash就會建立一個子shell。exit退出。  ps- f –forest。可以展示程式間的巢狀結構。

 

5.2.1 程式列表

$ pwd; ls; pwd; cd /; echo $BASH_SUBSHELL

這樣可以讓命令依次執行。這是在當前shell中執行的。

$(pwd; ls; echo $BASH_SUBSHELL;) // 這個是在子shell中執行。

() 還可以巢狀,比如pwd;(pwd; (ls; cd /home))

echo $BASH_SUBSHELL   若返回0,表示沒有子shell。

 

$sleep 300&   // 後臺執行命令,& 就是把命令置入後臺模式

jobs  可以檢視後臺作業資訊

 

還可以這樣,將程式列表置入後臺。

$(sleep 2; echo $BASH_SUBSHELL; sleep 2;)&

 

協程:可以同時做兩件事,它在後臺生成一個子shell,並在這個子shell中執行命令。

使用coproc命令進行協程處理:

 

$ coproc sleep 10

還可以這樣:

$coproc MyJob { sleep 10; }  // 相當於給sleep 10取了個名字。注意那幾個空格

 

5.3 理解shell的內建命令

 

1.外部命令:又稱檔案系統命令,存在與bash shell之外的命令。並不是shell程式的一部分

通常位於 /bin  /usr/bin   /sbin   /usr/sbin中。

外部 命令執行時會建立一個子程式。這種操作叫 衍生(forking

比如ps是一個外部命令,可以使用which 和 type命令找到它

$which ps

$ type -a ps

$ ls -l /bin/ps

 

2. 內建命令:不需要子程式來執行,和shell是一體的,不需要藉助外部程式檔案來執行。

 

(1)比如  exit 和 cd是內建命令

$type exit

$type cd

 

有些命令有多種實現,比如pwd和echo既有外部命令也有內建命令

#type -a echo

which  只顯示出外部命令檔案。

type -a 顯示出每個命令的兩種實現。

 

竅門:對於多種實現的命令,預設執行是內建的,若想要執行外部命令可以指定對應的檔案就好了。

比如

$pwd  // 執行的是內部命令

$/bin/pwd   // 執行的外部命令

 

(2)檢視歷史執行的命令

$ history  // 這個是內建命令

可以看到之前執行的命令,前面有個數字,代表命令編號。比如是38

$ !38  // 表示執行第38條命令

(3)$ !!   這個是執行上一條輸入的命令。

 

 

(4)命令別名

alias   也是內建命令

$alias  -p   // 檢視當前可用的別名

 

建立自己的命令

$alias xcyls=`ls -al`

一個別名僅僅在它所被定義的shell程式中才有效。在 ~/.bashrc下修改可以對所有shell都有效

 

shell  子shell  程式 子程式 都會受到環境變數的影響。


相關文章