Shell 觀念

終端機(Terminal) 跟 Shell 的角色分工

終端機 提供一個指令的輸入、輸出環境,在 linux 下,使用組合鍵 ctrl+alt+t 就可以啟動終端機。

而 shell 是一個 指令解釋器(command interpreter),是 linux kernel 的一個外殼,做為 linux kernel 與外界溝通的橋樑。

也就是說,shell 負責接收用戶或者其他應用程序的指令,然後將這些指令轉化成 kernel 能理解的語言並傳給 kernel,kernel 執行命令完成後,會將結果返回給 shell,再由 shell 傳遞給用戶或是應用程序。

當 終端機 被啟動時,作業系統會建立起 終端機 和 shell 之間的關聯性,於是在 終端機 中輸入指令後,shell 就會收到。
shell 收到指令後,會先 fork() 出一個新 process,接著此 process 會呼叫 exec() 來執行該指令。

一般情況下,shell 會等待該指令執行完成後,才又繼續恢復 shell 的功能,在等待的過程,可以按 ctrl+c 來中斷該指令的執行,回到 shell 的功能。
當然,也可以選擇在背景執行指令(於 終端機 輸入的指令後方加上 "&"),此時 shell 就不會等待該指令執行完畢,而是直接恢復 shell 的功能,可以繼續下指令。

 

 

管道(Pipe) (|)

在 shell 執行指令後,執行結果結果會直接輸出。如果這些執行結果必須要經過轉換才能成為符合預期的格式,則可以使用管道指令 “|” 來協助轉換。

管道指令 |,可以處理由前一個指令傳來的訊息,也就是 standard output 的訊息,做為下一個指令的 standard input。
如果要處理前一個指令傳來的 standard output 及 standard error 訊息,則可以在 | 後,加上 &,使成為 |&。

整體的管道指令可以用以下這個圖表示: ($ command1 | command2 | command3)
image
在每個管道後面接的第一個參數一定要是 指令,而且這個指令必須要能接受從 standard input 讀取數據,作為參數使用。
例如:less,more,head,tail 等,是可以接受從 standard input 讀取數據的指令。
而像 ls,cp,mv、kill 等就不行。

 

舉例來說,執行以下指令,可以終止(kill) 所有 gst 開頭的 processes:
$ ps aux | grep gst | awk -F ' ' '{print $2}' | xargs kill

指令的執行順序為:
1、ps 先執行,參數為 aux
2、grep 接受 ps 的執行結果為參數,並對參數內容進行挑選,只選有 gst 關鍵字的內容。
3、awk 接受 grep 的執行結果為參數,並對參數內容進行調整,只選第 2 個參數,參數的分隔符號為空格,也就是 process ID。
4、xargs 接受 awk 的結行結果為參數,並將此參數內容作為 kill 執行時的參數。
5、最後,kill 指令在執行時,其參數就是所有 gst 開頭的 processes 的 process ID,進而終止這些 processes。

 

 

here document

here document,又稱作 heredoc、hereis、here-string 或 here-script,是一種在命令行 shell (如 sh、csh、ksh、bash、PowerShell 和 zsh) 和 程序語言 (像Perl、PHP、Python 和 Ruby) 裡定義一個字串的方法。它可以保存文字裡面的換行或是縮排等空白字元。

here document 最通用的語法是 << 緊跟一個 delimiter,從下一行開始是想要引用的文字,文字輸入完畢後,在最後的單獨一行用相同的 delimiter 關閉。
在 Unix shell 里,here document 通常用於提供輸入的參數內容給指令執行。

舉例來說,執行以下指令(以 EOF 作為 delimiter),可以在 chroot 的條件下,執行輸入的所有指令:
cat << EOF | sudo chroot $TARGET_ROOTFS_DIR
> apt-get update
> apt-get upgrade -y
> EOF

也就是在 $TARGET_ROOTFS_DIR 下,執行 apt-get update apt-get upgrade -y

 

 

 

Reference

终端(terminal)、shell区别与联系

shell中神奇的管道命令(pipe)

簡明 Shell 原理與實作

wiki: Here document

Linux Here Document 與 cat + EOF 的使用

Linux 命令大全

 

 

文字內容 或 影像內容 部份參考、引用自網路,如有侵權,請告知。


 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 silverwind1982 的頭像
    silverwind1982

    拾人牙慧

    silverwind1982 發表在 痞客邦 留言(0) 人氣()