命令行:當在命令提示符後輸入命令並按 ENTER 鍵後, shell 將執行相應的程序。包括命令和參數的行稱爲命令行。
Command [arg1] [arg2] [arg3]....[argn] RETURN
命令行上採用一個或多個空格來隔開每個元素。 arg 爲參數,方括號表明被括起來的參數爲可選項。選項是一種特殊類型的參數,其前面通常是一個或兩個連字符。參數都有編號,其中命令本身作爲參數 0 ,它是命令行參數的開始。選項是改變命令執行效果的參數,選項與特定的程序相關,並由命令行上調用的程序解釋,而不是 shell 解釋。按照約定,選項是跟在命令之後其他參數之前的單獨參數。多數命令的選項前面需要帶一個連字符,這個要求是與工具相關的,而與 shell 無關。 GNU 選項前面通常帶兩個連字符( --help )。當需要多個選項時,可將多個單字符組合成一個參數,以一個連字符開始,在選項間不要加空格。這樣合併後的選項之前不能使用兩個連字符。
Df 爲 disk free 的簡寫。
>df -h
>ls -lh
選項 '-h' 顯示可讀文件的大小,以千字節 兆字節或千兆字節的方式顯示文件大小。
df : report file system disk space usage ,顯示參數給定文件所在的文件系統的信息,默認是顯示所有文件系統。
>su
>fdisk -l
>exit
有些工具的選項也需要參數,如工具 gcc 的 '-o' 選項後必須跟 gcc 產生的可執行文件名。
>gcc -o example example.c
工具的參數 ( 如文件名 ) 是允許以連字符開始的
>cd ~
>ls -l
上面命令行可以解釋爲顯示文件 '-l' ,也可解釋爲給出工作目錄下所有文件列表; linux 選擇後者。應該避免這種情況的出現,避免創建帶連字符的文件名。一些命令約定使用 '--' 參數來表示選項的結束和參數的開始。
>ls -- -l
>ls ./-l
>pwd
>ls ~/-l
>ls -l -- -l
這些是約定而不是規定,有些工具並不支持。
注意於下列用法中的 '-' 的區別:
>cat example.c – example2.c
>bunzip2 -c example.tar.bz2 | tar -xvf -
處理命令行:當向命令行輸入命令時, linux 的 tty 驅動程序( Linux 操作系統內核的一部分)將檢查每個字符,來確定是否立即採取動作。例如 CONTROL + U 刪除行鍵時,設備驅動程序將立即根據按鍵的功能要求調整命令行,當不需要立即採取行動時,設備驅動程序將把字符存儲在緩衝區中,等待字符輸入。當按 return 後,設備驅動程序將把命令行傳遞給 shell 處理。
分析命令行:當 shell 處理命令行時,它將命令行作爲一個整體來對待,並將其區分爲幾部分。命令行中提示符後的第一項通常爲命令名,因此 shell 將把命令行中從第一個字符到第一個空白字符之間的字符串作爲命令名。命令名可以用簡單的文件名或路徑名的方式指定。
>pwd
>ls -l
>/bin/ls -l
shell 並不要求程序名必須首先出現在命令行上,也支持
> >bb aa< cat
標準輸入來自文件 aa 標準輸出到文件 bb 。當 shell 識別出重定向符後,它將在找到命令行調用的程序名前處理這些符號以及它們的參數。爲程序的執行建立環境?
執行命令行: shell 找到了與命令行上的命令具有相同名字的可執行文件,那麼, shell 將創建一個進程執行該可執行文件,並將命令行上的命令名 參數 選項傳遞給該進程,當命令執行時 shell 等待進程的結束,休眠狀態。當程序執行完畢,就將退出狀態傳遞給 shell ,這樣 shell 就返回到活躍狀態,顯示提示符,等待下一個命令的輸入。
shell 不處理進程的參數,只是將他們傳遞給調用的程序,所以 shell 不知道選項和參數是否對程序有效。所有關於選項和參數的錯誤消息和用法消息都是來自程序自身。
標準輸出 是指程序輸出信息的地方。程序本身並不知道他發送到標準輸出的信息究竟要送往何處。
標準輸入 是指程序信息的來源。程序同樣也不知道信息的來源。
對一個運行的程序來說,除了具有標準輸入和標準輸出以外,通常還有錯誤消息輸出,稱爲標準錯誤輸出。
>bash
>bash
>exit
>exit
在命令提示符後 輸入要使用的 shell 名(如 bash tcsh ),然後 return ,則出現的提示符爲新 shell 給出的。輸入 exit 命令可退回到前一個 shell 。 shell 是嵌套的,所以只能從最初的 shell 註銷。
設備文件駐留在 linux 文件系統中(通常位於目錄 /dev )用來代表外圍設備,如終端模擬器窗口 顯示屏 打印機和硬盤驅動器。
>who
>tty
每個打開的窗口都有對應的設備名。在這些窗口中運行 tty 工具即可得到他們各自的名稱。通常把這個設備文件看作是一個文本文件進行讀寫,如屏幕上顯示的內容被寫入到該文件,鍵盤輸入的內容從該文件中讀取。
>cat
This is a line of text
This is a line of text
CONTROL-D
>
若 cat 後不帶參數,那麼 cat 將從標準輸入獲取輸入,它把標準輸入內容逐行地複製到標準輸出。 CONTROL + D 爲 EOF 信號,該信號表明標準輸入結束,沒有文本可複製。 若把某個文件名作爲參數,那麼 cat 將把該文件作爲它的輸入。
重定向是指改變 shell 標準輸入來源和標準輸出去向的各種方式。
通過重定向符 '>' 可以將 shell 命令的輸出重定向到指定的文件而不再是屏幕。
Command [arg] > filename
利用 cat 將標準輸入關聯到鍵盤,標準輸出被關聯到指定文件 example.c 。重定向可能覆蓋原有文件,如果原文件存在則重寫並覆蓋。不存在則創建新文件。
>cat > example.c
This is a line of text
CONTROL – D
>cat example.c
使用 cat 將一個或多個文件一個接一個地連接成一個較大文件:
>cd ~
>rm example*
>ls -l
>cat >example.c
This is example.c
CONTROL+D
>cat >example1.c
This is example1.c
CONTROL+D
>cat >example2.c
This is example2.c
CONTROL+D
>cat example*
>cat example* >example3.c
>cat example3.c
>ls -l
通過重定向符 '<' 可以使 shell 將命令的輸入重定向爲來自指定的文件而不再是鍵盤。重定向輸入命令行格式:
command [arg] < filename
>cat example3.c
>cat <example3.c
將 cat 的輸入重定向到文件的執行結果與命令 cat 後跟文件名作爲參數的執行結果相同。這種特性屬於 linux 的一類工具,這類工具首先檢查調用他們的命令行,如果命令行上存在文件名,那麼這類工具就把指定的文件作爲輸入。否則將標準輸入作爲輸入。這種特性是該類工具自身所有的,而與 shell 或者操作系統無關。
>cat example1.c example2.c
>cat example1.c example2.c > example1.c
>cat example1.c example2.c
上面命令行 cat 報告錯誤信息,但 shell 再收到報告之前就覆蓋了已存在文件 example1.c 的內容。命令執行後 example1.c 和 example2.c 內容相同,這是由於當 shell 遇到重定向符時 '>' 首先採取的動作是刪除 example1.c 原來的內容。然後纔是 cat 的執行。
>cat example1.c example2.c > example4.c
>mv example4.c example1.c
>cat example1.c
>cat example3.c>>example1.c
>cat example1.c
使用 '>>' 追加符可以向某個文件末尾添加新的內容,並且不改變原來已有內容。爲了避免不小心覆蓋了原來已存在文件,最好還是在採用這種方式操作文件前對文件進行備份。
>date > whoson
>cat whoson
>who >>whoson
>cat whoson
設備 /dev/null 是一個數據接收器,通常被稱爲位桶 (bit bucket) ,可以將不想看見或者不想保存的數據重定向到 /dev/null ,這樣輸出數據不留痕跡地消失:
>echo 'Hello linux' >/dev/null
>ls -l example.c
>cat example.c
>cat /dev/null > example.c
>ls -l example.c
>cat example.c
>tty
>echo 'hello linux' > /dev/pts/0
>who
>echo 'hello pts/1' > /dev/pts/1
>cat example.c > /dev/pts/1
管道: linux 使用管道將一個命令的輸出直接連接到另一個命令的輸入。管道類似於下面的過程,首先將一個命令的標準輸出重定向到一個文件,然後將該文件作爲另一個命令的標準輸入。管道不會單獨處理每條命令,並且不需要中間文件。
Command_a [arga] | command_b [argb]
上面命令得到的結果與下面結果相同:
command_a [arga] > temp
command _b [argb] < temp
rm temp
管道不僅可以簡化輸入,同時效率更高,因爲他不會產生中間臨時文件。
>ls -li | grep example
>tar -cvf all.tar example.c example2.c
>bzip2 -kv all.tar
>tar -tvf all.tar
>mkdir example
>mv all* example
>cd example
>ls -l
>tar -xvjf all.tar.bz2
>bunzip2 -c all.tar.bz2 | tar -xvf -
>cd ..
>rm -r example
>ls -l
任何 linux 工具都可以使用管道從命令行上指定的文件中接受輸入,也可以從標準輸入接受輸入。有些使用管道的命令僅從標準輸入接受輸入。
Tr 只能從標準輸入接受輸入而不能從文件接受輸入,管道是利用將兩個命令的標準輸入與輸出進行互相關聯工作,對每一個命令來講,他並不知道標準輸入是什麼,他只是通過固定的文件描述符(有些系統叫文件句柄)來定義標準輸入或標準輸出。而不關心具體的標準輸入或輸出是什麼,對於他來講都將其看着一個普通文件而已。這裏的重溫件接受輸入是指文件作爲參數時?是工具本身的要求。
Tr string1 string2
在標準輸入上查找與 string1 中字符匹配的字符,找到後將其替換爲 string2 中對應位置的字符;並輸出到標準輸出上, tr 是從標準輸入獲得輸入,所以不能改變文件(如果將文件重定向到標準輸入)內容。
>cat example.c | tr abc ABC
>tr abc ABC < example.c
>tr abc ABC
dagagawrhaja
CONTROL+D
>cat example.c
上面上行命令:第一個利用管道將標準輸入重定向到工具 cat 的標準輸出,第二個利用重定向符將標準輸入進行了重定向,第三個使用默認的標準輸入。
Lpr 可以從文件接受輸入也可從標準輸入接受輸入。
>ls >temp
>lpr <temp
>lpr temp
>rm temp
>ls | lpr
sort 可以從文件接受輸入也可以從標準輸入接受輸入。
>who >temp
>sort <temp
>sort temp
>rm temp
>who | sort
>who | grep ‘terry’
>ls -li | less
過濾器是將輸入數據流處理後再輸出數據流的一類命令。包括過濾器的命令行用一個管道將某個命令的標準輸出連接到過濾器的標準輸入,用另一個管道將過濾器的標準輸出連接到另一個命令的標準輸入。並不是所有工具都可用作過濾器。
>who | sort | lpr
shell 可以組合多個 linux 工具來實現更強大的功能。其中的工具並不需要因爲相互協作而進行特殊設計,他們都仍然按照約定使用標準輸入和標準輸出。通過 shell 對輸入輸出進行控制,用戶可以在命令行將多個工具組合起來實現目標。
Tee 向兩個方向輸出,將標準輸入複製到每個指定的文件和標準輸出。它只有一個輸入但是輸出到兩個方向。
>who | tee who.out | grep terry
>cat who.out
>ls
前臺:當前臺運行命令時, shell 將一直等到命令執行完畢, shell 會給出提示符使用戶可以繼續輸入下一個命令。當命令在後臺運行時,不必等待該命令完成,就可以直接輸入另一個命令。
作業:作業是指一個或者(可通過管道連接的)多個命令組成的序列。前臺只能有一個作業位於窗口或者屏幕中,但是可以有多個作業在後臺運行。
作業編號與 PID 號 如果命令行末尾輸入與符號 & 後按 RETURN 鍵,那麼 shell 將在後臺運行這個作業, shell 會爲該作業分配一個作業號並顯示該作業號,在作業號後顯示進程標識號( PID )。
>gedit example.c &
>xclock &
>jobs
>fg %1
CONTROL+Z
>bg %1
>fg %2
CONTROL+C
>jobs
>kill %1
>jobs
CONTROL+Z 程序掛起鍵, shell 將把前臺的作業掛起,並終止作業中的進程,將作業的標準輸入與鍵盤斷開。用 bg 命令後跟作業編號可以將掛起作業放到後臺運行。
只有前臺作業可以從鍵盤獲得輸入。爲了將鍵盤和後臺某個正運行的作業連接起來,必須把該後臺作業移到前臺。輸入 fg (或者%)後跟作業編號可以將對應作業移到前臺運行。
爲了避免後臺作業干擾前臺作業,可以將後臺作業的輸出重定向。
命令行上輸入 kill 後跟進程的 PID 號(或者後跟%和作業編號),可以將後臺正運行的進程(或作業)終止。使用中斷鍵( CONTROL + C )不能實現後臺作業終止 ( 只能對前臺作業有效 ) 功能的。
>ps
>xclock &
>gedit &
>jobs
>ps | grep gedit
>kill 12049
>ps
>jobs
>kill
%1
>ps
>jobs
>pstree
>ps -elf
如果忘記了某個進程的 PID 號,則可以使用 ps 工具來顯示該編號。如果忘記了作業標號,可以使用 jobs 來顯示作業編號列表。
通配符和通配:當輸入包含特殊字符的部分文件名時, shell 可以生成與已有文件的名字匹配的文件名。這些特殊的字符也常常稱爲通配符。當某個特殊字符作爲參數出現在命令行上時, shell 將該參數擴展爲有序的文件名列表,並將列表傳遞給命令行上調用的程序。被調用程序並不知道是 shell 生成了文件名。
'?' : 它與已有文件名中的某個單獨字符匹配。
>touch example.c example1.c example2.c example3.c example4.c
>ls -li example*
>cat example?.c
>echo example?.c
>echo example*
>cat example*
>echo *
>echo .*
'*' :可以與文件名中任意多個(包括 0 個)字符匹配。
用方括號將一個字符列表括起來使得 shell 與列表中每個單獨字符進行匹配。 example? 匹配 example 後跟任何一個字符文件名,而方括號更嚴格一些, memo[17a] 僅與 memo1 memo7 memoa 匹配。
>echo [aefgou]*
>less page[2468].txt
>lpr example1 example2 example3 example4 example5 example9
>lpr example[123459]
>lpr example[1-5 9]
>lpr example[0-9] example[12][0-9] example3[0-8]
>echo [a-m]*
>echo *[x-z]
>ls *[^ab]
>ls [b-d]*
>ls ?old
>ls /?old
將特殊字符進行轉義, shell 將不在將其看作特殊字符。大多數工具和程序不能翻譯模糊文件的引用,該翻譯工作由 shell 完成。
模糊文件引用由 shell 進行擴展,而不是由 shell 調用的程序進行擴展, shell 對模糊文件引用進行擴展,並將擴展得到的文件列表傳遞工具。 echo 驗證了這一點,因爲它顯示了參數而不是模糊文件引用 。
內置命令是放置在 shell 內的工具。每個 shell 都有自己的內置命令集合。當運行內置命令時, shell 並不產生新的進程,這使得內置命令運行得很快,並且能影響當前 shell 的環境。 shell 總是在查找命令或者是工具之前執行 shell 內置命令。