參考書目:《Shell指令碼學習指南》,Arnold Robbins & Nelson H.F. Beebe 著 O'Reilly Taiwan公司 編譯, 機械工業出版社
P24:
預設情況下,當shell執行一個具有“可執行屬性”程式的時候, shell會要求 kernel 開啟新進程來執行這個程式,不過kernel只能執行“編譯型可執行檔”,對於指令檔則無法執行,於是kernel將會回應shell“這不是一個可執行檔”,於是此時shell則會預設地將這個檔案當做一個對應版本的shell指令檔,並啟動一個新的shell副本對其進行解釋執行 —— 所以即使一個指令檔中沒有我們已經習以為常的位於首行的 #! ……
標識,shell 也可以進行解釋執行,只不過這樣不符合規範,並且無法使用其他的指令碼語言解譯器。
在 #! 指定解譯器程式的同時,也可以加上需要傳遞給解譯器的參數,例如 #! /bin/sh -f, 或者 #! /bin/sh -,後者表示確定沒有shell選項參數,主要用來確保安全。
P27:
同一命令列上,分號 ; 用於隔離不同的命令,shell會依次執行這些命令。分號前後是否有空格並不敏感
P28:
shell 可執行檔命令包括三類:內建(built-in)命令, shell函數和外部命令。對指令碼程式的執行就是所謂的外部命令,對此shell是通過創新新的一個shell進程副本來執行的,如果沒有 & 後台執行標誌,父shell將等待該命令執行完成,即命令執行完成後控制權將交回到父shell。
P29:
echo 命令預設地將輸出一個分行符號,當 echo -n …… 時會省略分行符號, 而在ubuntu下 -e 參數才會使能echo內容中的逸出字元
P31:
shell中的 printf 命令用法完全類似於標準C庫函數 printf,即 printf "format-string" [arguments ...]
P32:
對於每個程式都有 標準輸入、標準輸出、標準錯誤輸出 的概念,而應用程式是不用去關心這三者究竟對應的物理裝置是什麼,那是OS的事情。類UNIX環境下,預設的stdin, stdout, stderr 都對應的是終端裝置。
在shell命令列直接使用 cat 命令即可驗證 stdin、stdout和stderr 的情況
P33:
常用的 cat > file 將方便地通過標準輸出重新導向,實現由終端輸入得到 file 文字檔。當輸入完成時,通過Ctrl-D 表徵輸入結束。
P34:
tr 命令實現字元快速替換、刪除和重複字元壓縮, 常用選項 -d, -s, -c 等
P35~36:
/dev/null 常用於輸出內容的屏蔽,對於只需要得到一個命令操作的退出狀態而不需要列印出內容的情況,很有用;
stty -echo 關閉終端輸入字元的顯示, stty echo 反之;
P38:
set -x 可以在當前 shell 環境下開啟命令執行跟蹤功能, set +x 關閉跟蹤功能;
通過 sh -x file 也可以實現在新建立的shell進程(即執行file的shell環境下)開啟執行跟蹤功能
P40:
使用 locale 命令可顯示出當前的語言文化環境變數的值,包括 LANG、LC_CTYPE,LC_TIME 等,使用 locale -ck LC_** 可以查看當前語言文化環境下的變數細節。
P44:
在POSIX系統中,有兩種Regex風格 BRE和ERE,對於現在新版的 grep 工具而言,這兩種風格它都可以適應