時間:2017年04月10日shell
說明:本文部份內容均摘取自書籍《Linux命令行與shell腳本編程大全》,版權歸原做者全部。《Linux命令行與shell腳本編程大全》(第三版)第五章學習總結編程
本章內容:bash
探究shell的類型 理解shell的父子關係 別出心裁的子shell用法 探究內建的shell命令
系統中啓動什麼樣的shell程序取決於你我的的用戶ID配置。在/etc/passwd文件中,在用戶ID記錄的第七個字段中列出了默認的shell程序。工具
默認的用戶shell是bash shell,不過還有另一個默認shell是/bin/sh,它做爲默認的系統shell,用於那些須要啓動時使用的系統shell腳本。學習
竅門:對bash shell腳原本說,這兩種不一樣的shell(默認的交互shell和默認的系統shell)會形成問題。必定要閱讀第十一章中有關bash shell腳本首行的語法要求,以免這些麻煩。命令行
經過輸入命令bash,生成一個子shell。再執行其它命令時,會在子shell中執行。經過ps -f命令能夠查看進程的父子關係,即子進程的PPID是父進程的PID。經過ps --forest命令,能夠按層次查看進程。輸入exit命令,退回子進程shell,回到父進程shell。exit還能用來登出當前的虛擬控制檯終端。rest
base中可用的命令行參數:code
-c string:從string中讀取命令並進行處理 -i:啓動一個可以接受用戶輸入的交互shell -l:以登陸shell的形式啓動 -r:啓動一個受限shell,用戶會被限制在默認的目錄中 -s:從標準輸入中讀取命令
你能夠在一行中指定要依次運行的一系列命令。經過分號(;)隔開便可。協程
經過使用中括號將命令列表變成進程列表。進程
命令列表:$ pwd ; ls ;cd /etc ; cd ; pwd ; ls 進程列表:$ (pwd ; ls ;cd /etc ; cd ; pwd ; ls)
要想知道是否生成了子shell,得藉助一個使用了環境變量的命令。(環境變量會在第六章中詳述。)這個命令就是echo $BASH_SUBSHELL。若是該命令返回0,就代表沒有子shell。若是返回1或者其餘更大的數字,就代表存在子shell。
在交互式的shell CLI中,還有不少更富有成效的子shell用法。進程列表、協程和管道(第十一章會講到)都利用了子shell。在交互式shell中,一個搞笑的子shell用法就是使用了後臺模式。
1.探索後臺模式
在後臺模式中運行命令能夠在處理命令的同時讓出CLI,以供他用。使用sleep命令來演示。sleep命令接受一個參數,該參數是你但願進程等待(睡眠)的秒數。
命令:sleep
命令演示:sleep 10 演示說明:將會話暫停10秒鐘,而後返回shell CLI提示符。
要想將命令置入後臺模式,能夠在命令末尾加上字符&。當命令被置入後臺,在shell CLI提示符返回以前,會出現兩條信息。第一條在方括號中表示後臺做業號;第二條表示後臺做業的進程ID。
命令:jobs
命令格式:jobs -l 命令說明:顯示後臺做業信息。能夠顯示當前運行在後臺模式中的全部用戶的進程。
竅門:須要提醒的是:後臺做業的結束狀態可未必會一直等到合適的時候才現身。看成業結束狀態忽然出如今屏幕上的時候,你可別吃驚啊。
2.將進程列表置入後臺
以前說過,進程列表是運行在子shell中的一條或多條命令。將進程列表置入後臺模式會在命令輸出上表現出些許不一樣。
命令演示:$ (sleep 2 ; echo $BASH_SUBSHELL ; sleep 2)& 演示說明:把進程列表置入後臺模式。
把進程列表置入後臺模式會產生一個做業號和進程ID,而後返回到提示符。 按一下回車鍵,獲得另外一個提示符。
3.協程
協程能夠同時作兩件事。它在後臺生成一個子shell,並在這個shell中執行命令。
命令:coproc
命令格式:coproc 命令 命令說明:要在子shell中執行coproc命令。
協程會建立子shell執行命令,同時,將命令置入後臺模式。使用jobs能夠查看後臺任務。
命令格式:coproc 任務名 { 命令 } 命令說明:爲後臺任務指定任務名並執行。
搞明白shell的內建命令和非內建(外部)命令很是重要。內建命令和非內建命令的操做方式大不相同。
外部命令,有時候也被稱爲文件系統命令,是存在於bash shell以外的程序。它們並非shell程序的一部分。外部程序一般位於/bin、/usr/bin、/sbin或/usr/sbin中。ps就是一個外部命令。你可使用which和type命令找到它。
命令演示:swich ps 演示說明:查看ps命令程序所在路徑。 命令演示:type -a ps 演示說明:查看ps命令程序所在路徑。
當外部命令執行時,會建立出一個子進程。這種操做被稱爲衍生(forking)。做爲外部命令,ps命令在執行時會建立出一個子進程。
內建命令和外部命令的區別在於前者不須要使用子進程來執行。它們已經和shell編譯成了一體,做爲shell工具的組成部分。不須要藉助外部程序文件來運行。
cd和exit命令都是內建與bash shell。
命令演示:type cd 演示說明:利用type命令來了解某個命令是不是內建的。 命令演示:type -a echo 演示說明:有些命令有多種實現。使用type命令的-a選項查看命令的不一樣實現。 命令演示:which pwd 演示說明:which命令只顯示出了外部命令文件。
竅門:對於有多種實現的命令,若是想要使用其外部命令實現,直接指明對應的文件就能夠了。例如,要使用外部命令pwd,能夠輸入/bin/pwd。
1.使用history命令
命令:history
命令格式:history 命令說明:查看最近用過的命令列表。一般歷史記錄會保存最近的1000條命令。
竅門:你能夠設置保存在bash歷史記錄中的命令數。要想實現這一點,你須要修更名爲HISTSIZE的環境變量(參見第六章)。
命令格式:history -a 命令說明:將命令歷史記錄寫入.bash_history文件。 命令演示:!! 演示活門:執行上一條命令,即剛剛執行的命令。 命令演示:!20 演示說明:執行命令在歷史列表中編號爲20的命令。
2.命令別名
alias命令是另外一個shell的內建命令。命令別名容許你爲經常使用的命令(及其參數)建立另外一個名稱,從而將輸入量減小到最低。
命令:alias
命令格式:alias -p 命令說明:查看當前可用的別名。 命令格式:alias li='ls -li' 命令說明:建立一個命令別名爲li的命令,由ls -li組成。命令別名只在它被定義的shell進程中才有效。不過,可使用環境變量,使得別名在不一樣的shell中都湊效。
本章討論了複雜的交互式程序:GNU bash shell。其中包括理解shell進程及其關係,如何生成子shell,以及子shell與父shell的關係。主要介紹了bash、exit、&、sleep、jobs、coproc、which、type、history、!、alias命令。
本章學習命令我的總結以下:
bash:建立一個子shell進程 exit:退出子shell進程,直到退出CLI客戶端 &:將任務置入後臺模式 sleep:將當前進程等待(休眠) jobs:查看全部後臺做業信息 coproc:建立一個子進程,並用子進程執行任務 which:查看命令程序所在文件路徑(只顯示外部命令文件) type:查看命令程序所在文件路徑(經過-a選項,顯示每一個命令的兩種實現) history:查看命令使用的歷史記錄(默認1000條,可修改HISTSIZE環境變量來控制顯示條數) !:執行命令歷史記錄裏的命令(!!執行上一條命令,!n執行命令歷史列表中編號爲n的命令) alias:爲命令建立別名(默認只在被建立的shell進行中有效,可修改環境變量實現全部shell進程有效)