當您經常使用某個系統時,往往會陷入某種固定的使用模式。有時,您沒有養成以盡可能最好的方式做事的習慣。有時,您的不良習慣甚至會導致出現混亂。糾正此類缺點的最佳方法之一,就是有意識地采用抵制這些壞習慣的好習慣。本文提出了 10 個值得采用的 UNIX 命令行習慣——幫助您克服許多常見使用怪癖,並在該過程中提高命令行工作效率的好習慣。下面列出了這 10 個好習慣,之後對進行了更詳細的描述。
在單個命令中創建目錄樹
清單 1 演示了最常見的 UNIX 壞習慣之一:一次定義一個目錄樹。
清單 1. 壞習慣 1 的示例:單獨定義每個目錄樹
~ $ mkdir tmp
~ $ cd tmp
~/tmp $ mkdir a
~/tmp $ cd a
~/tmp/a $ mkdir b
~/tmp/a $ cd b
~/tmp/a/b/ $ mkdir c
~/tmp/a/b/ $ cd c
~/tmp/a/b/c $
使用 mkdir 的 -p 選項並在單個命令中創建所有父目錄及其子目錄要容易得多。但是即使對於知道此選項的管理員,他們在命令行上創建子目錄時也仍然束縛於逐步創建每級子目錄。花時間有意識地養成這個好習慣是值得的:
清單 2. 好習慣 1 的示例:使用一個命令來定義目錄樹
~ $ mkdir -p tmp/a/b/c
您可以使用此選項來創建整個復雜的目錄樹(在腳本中使用是非常理想的),而不只是創建簡單的層次結構。例如:
清單 3. 好習慣 1 的另一個示例:使用一個命令來定義復雜的目錄樹
~ $ mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}
過去,單獨定義目錄的唯一借口是您的 mkdir 實現不支持此選項,但是在大多數系統上不再是這樣了。IBM、AIX®、mkdir、GNU mkdir 和其他遵守單一 UNIX 規范 (Single UNIX Specification) 的系統現在都具有此選項。
對於仍然缺乏該功能的少數系統,您可以使用 mkdirhier 腳本(請參見參考資料),此腳本是執行相同功能的 mkdir 的包裝:
~ $ mkdirhier project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}
更改路徑;不要移動存檔
另一個不良的使用模式是將 .tar 存檔文件移動到某個目錄,因為該目錄恰好是您希望在其中提取 .tar 文件的目錄。其實您根本不需要這樣做。您可以隨心所欲地將任何 .tar 存檔文件解壓縮到任何目錄——這就是 -C 選項的用途。在解壓縮某個存檔文件時,使用 -C 選項來指定要在其中解壓縮該文件的目錄:
清單 4. 好習慣 2 的示例:使用選項 -C 來解壓縮 .tar 存檔文件
~ $ tar xvf -C tmp/a/b/c newarc.tar.gz
相對於將存檔文件移動到您希望在其中解壓縮它的位置,切換到該目錄,然後才解壓縮它,養成使用 -C 的習慣則更加可取——當存檔文件位於其他某個位置時尤其如此。
將命令與控制操作符組合使用
您可能已經知道,在大多數 Shell 中,您可以在單個命令行上通過在命令之間放置一個分號 (;) 來組合命令。該分號是 Shell 控制操作符,雖然它對於在單個命令行上將離散的命令串聯起來很有用,但它並不適用於所有情況。例如,假設您使用分號來組合兩個命令,其中第二個命令的正確執行完全依賴於第一個命令的成功完成。如果第一個命令未按您預期的那樣退出,第二個命令仍然會運行——結果會導致失敗。相反,應該使用更適當的控制操作符(本文將描述其中的部分操作符)。只要您的 Shell 支持它們,就值得養成使用它們的習慣。
僅當另一個命令返回零退出狀態時才運行某個命令
使用 && 控制操作符來組合兩個命令,以便僅當 第一個命令返回零退出狀態時才運行第二個命令。換句話說,如果第一個命令運行成功,則第二個命令將運行。如果第一個命令失敗,則第二個命令根本就不運行。例如:
清單 5. 好習慣 3 的示例:將命令與控制操作符組合使用
~ $ cd tmp/a/b/c && tar xvf ~/archive.tar
在此例中,存檔的內容將提取到 ~/tmp/a/b/c 目錄中,除非該目錄不存在。如果該目錄不存在,則 tar 命令不會運行,因此不會提取任何內容。
僅當另一個命令返回非零退出狀態時才運行某個命令
類似地,|| 控制操作符分隔兩個命令,並且僅當第一個命令返回非零退出狀態時才運行第二個命令。換句話說,如果第一個命令成功,則第二個命令不會運行。如果第一個命令失敗,則第二個命令才會 運行。在測試某個給定目錄是否存在時,通常使用此操作符,如果該目錄不存在,則創建它:
清單 6. 好習慣 3 的另一個示例:將命令與控制操作符組合使用
~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c
您還可以組合使用本部分中描述的控制操作符。每個操作符都影響最後的命令運行:
清單 7. 好習慣 3 的組合示例:將命令與控制操作符組合使用
~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c && tar xvf -C tmp/a/b/c ~/archive.tar