歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> Linux命令解析過程

Linux命令解析過程

日期:2017/3/3 12:21:13   编辑:Linux技術

命令解析過程

將命令行分成由固定元字符集分隔的記號:SPACE, TAB, NEWLINE, ; , (, ), <, >, |, &,記號類型包括單詞,關鍵字,I/O重定向符和分號。

檢測每個命令的第一個記號,查看是否為不帶引號或反斜線的關鍵字。如果是一個開放的關鍵字,如if和其他控制結構起始字符串,function,{或(,則命令實際上為一復合命令。shell在內部對復合命令進行處理,讀取下一個命令,並重復這一過程。如果關鍵字不是復合命令起始字符串(如then等一個控制結構中間出現的關鍵字),則給出語法錯誤信號。

依據別名列表檢查每個命令的第一個關鍵字。如果找到相應匹配,則替換其別名定義,並退回第一步;否則進入第4步。該策略允許遞歸別名,還允許定義關鍵字別名。如alias procedure=function

執行大括號擴展,例如a{b,c}變成ab ac

如果~位於單詞開頭,用$HOME替換~。使用usr的主目錄替換~user。

對任何以符號$開頭的表達式執行參數(變量)替換

對形式$(string)的表達式進行命令替換

計算形式為$((string))的算術表達式

把行的參數,命令和算術替換部分再次分成單詞,這次它使用$IFS中的字符做分割符而不是步驟1的元字符集。

對出現*, ?, [ / ]對執行路徑名擴展,也稱為通配符擴展

按命令優先級表(跳過別名),進行命令查尋

設置完I/O重定向和其他操作後執行該命令。

引號處理

單引號跳過了前10個步驟,不能在單引號裡放單引號雙引號跳過了步驟1~5,步驟9~10,也就是說,只處理6~8個步驟。

也就是說,雙引號忽略了管道字符,別名,~替換,通配符擴展,和通過分隔符分裂成單詞。雙引號裡的單引號沒有作用,但雙引號允許參數替換,命令替換和算術表達式求值。可以在雙引號裡包含雙引號,方式是加上轉義符”\”,還必須轉義$, `, \。

特殊字符

常見元字符

字符說明IFS由 或 或 三者之一組成(我們常用 space )。CR由 產生。=設定變量。$作變量或運算替換(請不要與 shell prompt 搞混了)。>重導向 stdout。 *<重導向 stdin。 *&重導向 file descriptor ,或將命令置於背境執行。 *( )將其內的命令置於 nested subshell 執行,或用於運算或命令替換。 *{ }將其內的命令置於 non-named function 中執行,或用在變量替換的界定范圍。;在前一個命令結束時,而忽略其返回值,繼續執行下一個命令。 *&&在前一個命令結束時,若返回值為 true,繼續執行下一個命令。 *!執行 history 列表中的命令。*

常用通配符

字符含義實例*匹配 0 或多個字符a*b a與b之間可以有任意長度的任意字符, 也可以一個也沒有, 如aabcb, axyzb, a012b, ab。?匹配任意一個字符a?b a與b之間必須也只能有一個字符, 可以是任意字符, 如aab, abb, acb, a0b。[list]匹配 list 中的任意單一字符a[xyz]b a與b之間必須也只能有一個字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。[!list]匹配 除list 中的任意單一字符a[!0-9]b a與b之間必須也只能有一個字符, 但不能是阿拉伯數字, 如axb, aab, a-b。[c1-c2]匹配 c1-c2 中的任意單一字符 如:[0-9] [a-z]a[0-9]b 0與9之間必須也只能有一個字符 如a0b, a1b… a9b。{string1,string2,…}匹配 sring1 或 string2 (或更多)其一字符串a{abc,xyz,123}b a與b之間只能是abc或xyz或123這三個字符串之一。

轉義字符

符號意義‘’(單引號)又叫硬轉義,其內部所有的shell 元字符、通配符都會被關掉。注意,硬轉義中不允許出現’(單引號)。“”(雙引號)又叫軟轉義,其內部只允許出現特定的shell 元字符:$用於參數代換 `用於命令代替(反斜槓)又叫轉義,去除其後緊跟的元字符或通配符的特殊意義。

Copyright © Linux教程網 All Rights Reserved