本文也即《Learning the bash Shell》3rd Edition的第七章Input/Output and Command-Line Processing之讀書筆記之四。我們的目的是把書讀薄。我們將審視Linux系統如何解析bash。
第一步驟
:將命令分給為token,根據空格,TAB, NEWLINE, ;, (, ), <, >, |, 以及 &。
第二步驟
:檢查第一個token是否一些關鍵字,是否是引號,’/’是否是一個需要組合的符號,例如’{‘或者’(‘,看看是否需要讀取下一行命令,如果需要,回到第1步驟,如此迴圈,直到擷取完整的命令。如果不是組合命令的開始,而是其他關鍵字,例如結束fi等,報告語法錯誤。如果不是這些關鍵字,進入第3步驟。
第三步驟
:根據alias列表檢查命令的第1個tocken,它取得alias的對應,重新回到第1步驟。回到第一步驟,允許alias的嵌套,就A表示B,B表示C,也允許alias表示一些整合命令的開頭。
第四步驟
:大括弧解析。例如將a{b,c},解析為ab ac。
第五步驟
:波浪號(~)解析,如果在一個詞的最前,解釋為使用者的$HOME目錄路徑。
第六步驟
:參數解析。如果詞開始為$,解析這個參數變數。
第七步驟
:是否因$的解析而產生命令替換。
第八步驟
:對$((string))的格式進行數學運算。
第九步驟
:經過第5步驟開始的幾個步驟,重新將詞分離,使用$IFS作為分隔字元號。
第十步驟
:路徑名處理,萬用字元處理,包括*,?,/。
第十一步
:根據命令的第一個詞去查看,優先權一次是function命令,builtin,$PATH路徑下的命令。
第十二步
:在設定重新導向I/O後執行命令
這隻是其中的一些步驟,並不是所有的。我們通過一個例子做進一步的解釋。在執行這個命令之前,已經通過alias ll=”ls -l”。使用者目錄為/home/alice,$$的值為2537。看看執行命令ll $(type -path cc) ~alice/.*$(($$%1000))的過程。
- ll
$(type
-path
cc)
~alice/.*$(($$%1000))
分為各個詞
ll
不是keyword,所以第二步驟無需處理任何
ls
-l
$(type
-path
cc)
~alice/.*$(($$%1000))
將ls -l來替代別名"ll".這是將重複第一步到第三步。
ls
-l
$(type
-path
cc)
~alice/.*$(($$%1000))
在第四步不處理任何
ls
-l
$(type
-path
cc)
/home/alice/.*$(($$%1000))
進行路徑解析,將 ~alice解析為/home/alice
.
ls
-l
$(type
-path
cc)
/home/alice/.*$((2537%1000))
將$$接續為2537。$$的用法在以後學習。
ls
-l
/usr/bin/cc
/home/alice/.*$((2537%1000))
執行命令,替換"type -path cc".
ls
-l
/usr/bin/cc
/home/alice/.*537
進行算術運算。
ls
-l
/usr/bin/cc
/home/alice/.*537
第九步無處理。
ls
-l
/usr/bin/cc
/home/alice/.hist537
將檔案名稱替代了萬用字元.*537。
在/usr/bin
中獲得ls命令
/usr/bin/ls
是帶選項-l以及兩個參數執行的
相關連結: 我
的Linux操作相關文章