[Linux] shell
1. 命令行
1.1 語法
命令行語法說明了行中各個元素的排列順序和間隔方式。命令行上基本語法格式如下:
command?[arg1]?[arg2]...[argn]?RETURN命令行上采用一個或多個空格來隔開每個元素。其中,command為命令的名字,arg1到argn為命令參數,RETURN是終止命令的按鍵。
命令行上,每一串不含空格字符的字符序列稱為記號或字。參數是一種記號,每個參數都有編號,其中命令本身作為參數0。
選項是改變命令執行效果的參數,可通過指定多個選項使命令按照不同的方式執行。當需要多個選項時,可將多個單字符組合成一個參數,例如"ls -xr"等同于"ls -x -r"。
有些工具的選項也需要帶參數,例如工具gcc的-o選項后必須跟gcc產生的可執行文件名,通常選項與參數間用空格分開。
1.2 處理命令行
當向命令行輸入命令時,Linux的tty設備驅動程序將檢查每個字符。例如按下CONTROL+H、CONTROL+W或CONTROL+U里,設備驅動程序將立即根據按鍵的功能要求調整命令行。當輸入的字符不需要采取立即的動作時,設備驅動程序將把字符存儲在緩沖區中,等待字符輸入。當按下RETURN鍵后,設備驅動程序將把命令行傳遞給shell處理。
當shell處理命令行時,它將把命令行作為一個整體來對待,并將其分成幾個組成部分,接著shell將在指定目錄下查找用戶具有執行權限的對應文件。shell并不是在所有目錄下搜索,而只在PATH變量設定的路徑下搜索。
如果shell找到了與命令行上的命令具有相同名字的可執行文件,那么shell將啟動一個新的進程,并將命令行上的命令名、參數、選項傳遞給程序。當命令執行時,shell將等待進程的結束,這時shell處于非活躍狀態,稱為休眠狀態。當程序執行完畢,就將退出狀態傳遞給shell,這樣shell就返回到活躍狀態,顯示提示符,等待下一個命令的輸入。
1.3 內置命令
內置命令是放在shell內的工具,每個shell都有自己的內置命令集合,當運行內置命令時,shell并不產生新的進程,這使得內置命令運行得很快,并且能影響當前shell環境。輸入命令"info bash builtin"即可得到bash內置命令的完整列表,而tcsh內置命令可以在"man tcsh"中查找。
2. 標準輸入輸出
2.1 屏幕文件
默認情況下,shell將把命令的結果標準輸出到屏幕,也可以重定向到其他文件。Linux中除了普通文件、目錄文件、硬鏈接和軟鏈接外,還有一種設備文件,設備文件駐留在Linux文件結構中(通常是/dev),用來代表外圍設備,如終端模擬器窗口、顯示屏、打印機和硬盤。
在who工具顯示的內容中,登錄名后的設備名即為屏幕的文件名,如pts/4。每個打開的窗口都有對應的設備名,在這些窗口中運行tty工具即可得到它們各自的名稱,如下所示:
2.2 鍵盤和屏幕
當用戶直接執行命令時,shell將其標準輸出發送到代表屏幕的設備文件中,另外,shell還將鍵盤輸入作為標準輸入接收。
例如cat工具,在shell提示符后輸入cat,按下RETURN,再輸入一行文本后按下RETURN鍵,那么剛剛輸入的文本下面一行將顯示同樣的一行內容。由于shell將cat的標準輸入關聯到鍵盤,標準輸出關聯到屏幕,所以當輸入一行文本時,cat將鍵盤的輸入內容顯示到屏幕上。可以按下CONTROL+D發送EOF信號,表示標準輸入結束,這時cat工具將停止運行并將控制返回到shell,如下所示:
2.3 重定向
重定向是指改變shell標準輸出來源和標準輸出去向的各種方式。如shell將cat的標準輸入關聯到鍵盤,標準輸出關聯到屏幕,也可以將shell的標準輸入輸出重定向到某個命令或者文件。
通過重定向符號">"可以將shell命令的輸出重定向到指定的文件,命令行格式為:
command?[args]?>?filename其中,command為可執行程序,arguments是可選參數,filename是shell要重定向輸出到的普通文件名,如下所示:
與重定向標準輸出一樣,也可以重定向標準輸入。通過符號"<"可以使shell將命令的輸入重定向為來自指定的文件而不再是鍵盤,命令行格式為:
command?[args]?<?filename其中,command為可執行程序,arguments是可選參數,filename是要重定向輸入來自的普通文件,如下所示:
2.4 避免文件重寫
shell提供了noclobber功能,用于防止重定向時不經意地重寫了已存在的文件。通過設置變量noclobber可以啟用此功能。啟用后若重定向輸出到某個已存在文件,則shell將報告錯誤消息,并不執行重定向命令,如下所示:
在重定向輸出符號后跟管道符號(tcsh下使用嘆號),即" >| "可以忽略noclobber的設置。
2.5 追加標準輸出
使用追加輸出符號">>"可以向某個文件末尾添加新的內容,并且不改變原有內容,如下所示:
2.6 數據消失
/dev/null是一個數據接收器,通常稱為位桶。可以將不想看到或不想保存的數據重定向到/dev/null,這樣輸出數據將消失,如下所示:
當從/dev/null中讀取數據時,將得到一個空字符串。
2.7 管道
shell使用管道將一個命令的輸出直接連接到另一個命令的輸入。管道的功能類似于將一個命令的標準輸出重定向到一個文件,然后將該文件作為另一個命令的標準輸出。管理的符號為" | ",語法格式為:
command_a?[args]?|?command_b?[args]如下所示:
過濾器是將輸入數據處理后再輸出數據流的一類命令,包含過濾器的命令行用一個管道將某個命令的標準輸出連接到過濾器的標準輸入,用另一個管道將過濾器的標準輸出連接到另一個命令的標準輸入,如下所示:
tee工具可以向兩個方向輸出:文件和標準輸出,如下所示:
3. 后臺程序
3.1 作業
當在前臺運行命令時,shell將一直等到命令執行完畢,shell會給出提示符使用戶可以繼續輸入下一個命令,當命令在后臺運行時,不必等待該命令完成,就可直接輸入另一個命令。
作業是指由一個或多個命令組成的序列,后臺可以有多個作業運行。如果在命令行末尾輸入與符號"&"后按RETURN鍵,那么shell將在后臺運行這個作業,同時,shell會給這個作業分配一個作業編號,將其顯示在方括號內,如下所示:
3.2 移動作業
按下CONTROL+Z,shell將把前臺的作業掛起,并終止作業中的進程,用bg命令后跟作業編號可以將掛起的作業放到后臺運行,如果僅有一個作業被掛起,可以不指明作業編號,如下所示:
只有前臺作業可以從鍵盤獲得輸入,輸入fg后跟作業編號可以將對應的作業移到前臺,如下所示:
3.3 終止作業
命令行上輸入kill后跟進程的PID號(或后跟%和作業編號),可以將后臺正在運行的進程終止,如下所示:
如果忘記了某個進程的PID號,可以用ps工具查看,如下所示:
如果忘記了作業編號,可以使用命令jobs來顯示作業編號列表,如下所示:
4. 路徑擴展
4.1 通配符
當輸入包含特殊字符的部分文件名時,shell可以生成與已有文件的名字匹配的文件名。這些特殊的字符也常常被稱為通配符,當某個通配符作為參數出現在命令行上時,shell將該參數擴展為有序的文件名列表,并將列表傳遞給命令行上調用的程序,包含通配符的文件名稱為模糊引用,對這些文件名操作的過程稱為路徑名擴展。
4.2 問號
問號"?"是shell生成文件名的特殊字符,它與已有文件名中的某個單獨字符芬配,如下所示:
問號不與隱藏文件匹配,如果要與隱藏文件匹配,必須在模糊文件引用中顯式地包含句點。
4.3 星號
星號"*"的功能與問號相似,不同的是,星號可以與文件名中的任意多個(包括0)字符匹配,如下所示:
4.4 包含
用方括號將一個字符列表括起來使得shell與列表中每個單獨字符匹配。方括號定義了一個字符類,每個定義字符類只能替換文件名中的一個字符,如下所示:
左方括號后直接跟嘆號" ! "或脫字符也可以定義字符類,該類與任何不在方括號內的字符匹配。
轉載于:https://blog.51cto.com/hanviseas/1057436
總結
以上是生活随笔為你收集整理的[Linux] shell的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle 共享磁盘阵列 双机热备 实
- 下一篇: Bitmap 索引 vs. B-tree