<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Be happy with Java

    unix 高手的10個習慣,zz

    UNIX 高手的 10 個習慣

    克服不良的 UNIX 使用模式

    developerWorks
    文檔選項
    將此頁作為電子郵件發送

    將此頁作為電子郵件發送

    未顯示需要 JavaScript 的文檔選項


    拓展 Tomcat 應用

    下載 IBM 開源 J2EE 應用服務器 WAS CE 新版本 V1.1


    級別: 中級

    Michael Stutz (stutz@dsl.org), 作者, 顧問

    2007 年 2 月 09 日

    采用 10 個能夠提高您的 UNIX? 命令行效率的好習慣——并在此過程中擺脫不良的使用模式。本文循序漸進地指導您學習幾項用于命令行操作的技術,這些技術非常好,但是通常被忽略。了解常見錯誤和克服它們的方法,以便您能夠確切了解為何值得采用這些 UNIX 習慣。

    引言

    當您經常使用某個系統時,往往會陷入某種固定的使用模式。有時,您沒有養成以盡可能最好的方式做事的習慣。有時,您的不良習慣甚至會導致出現混亂。糾正此類缺點的最佳方法之一,就是有意識地采用抵制這些壞習慣的好習慣。本文提出了 10 個值得采用的 UNIX 命令行習慣——幫助您克服許多常見使用怪癖,并在該過程中提高命令行工作效率的好習慣。下面列出了這 10 個好習慣,之后對進行了更詳細的描述。

    采用 10 個好習慣

    要采用的十個好習慣為:

    1. 在單個命令中創建目錄樹
    2. 更改路徑;不要移動存檔
    3. 將命令與控制操作符組合使用
    4. 謹慎引用變量
    5. 使用轉義序列來管理較長的輸入
    6. 在列表中對命令分組
    7. find 之外使用 xargs
    8. 了解何時 grep 應該執行計數——何時應該繞過
    9. 匹配輸出中的某些字段,而不只是對行進行匹配
    10. 停止對 cat 使用管道

    在單個命令中創建目錄樹

    清單 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





    回頁首


    謹慎引用變量

    始終要謹慎使用 Shell 擴展和變量名稱。一般最好將變量調用包括在雙引號中,除非您有不這樣做的足夠理由。類似地,如果您直接在字母數字文本后面使用變量名稱,則還要確保將該變量名稱包括在方括號 ([]) 中,以使其與周圍的文本區分開來。否則,Shell 將把尾隨文本解釋為變量名稱的一部分——并且很可能返回一個空值。清單 8 提供了變量的各種引用和非引用及其影響的示例。


    清單 8. 好習慣 4 的示例:引用(和非引用)變量
    ~ $ ls tmp/
    a b
    ~ $ VAR="tmp/*"
    ~ $ echo $VAR
    tmp/a tmp/b
    ~ $ echo "$VAR"
    tmp/*
    ~ $ echo $VARa
    
    ~ $ echo "$VARa"
    
    ~ $ echo "${VAR}a"
    tmp/*a
    ~ $ echo ${VAR}a
    tmp/a
    ~ $
    





    回頁首


    使用轉義序列來管理較長的輸入

    您或許看到過使用反斜杠 (\) 來將較長的行延續到下一行的代碼示例,并且您知道大多數 Shell 都將您通過反斜杠聯接的后續行上鍵入的內容視為單個長行。然而,您可能沒有在命令行中像通常那樣利用此功能。如果您的終端無法正確處理多行回繞,或者您的命令行比通常小(例如在提示符下有長路經的時候),反斜杠就特別有用。反斜杠對于了解鍵入的長輸入行的含義也非常有用,如以下示例所示:


    清單 9. 好習慣 5 的示例:將反斜杠用于長輸入
    ~ $ cd tmp/a/b/c || \
    > mkdir -p tmp/a/b/c && \
    > tar xvf -C tmp/a/b/c ~/archive.tar

    或者,也可以使用以下配置:


    清單 10. 好習慣 5 的替代示例:將反斜杠用于長輸入
    ~ $ cd tmp/a/b/c \
    >                 || \
    > mkdir -p tmp/a/b/c \
    >                    && \
    > tar xvf -C tmp/a/b/c ~/archive.tar

    然而,當您將輸入行劃分到多行上時,Shell 始終將其視為單個連續的行,因為它總是刪除所有反斜杠和額外的空格。

    注意:在大多數 Shell 中,當您按向上箭頭鍵時,整個多行輸入將重繪到單個長輸入行上。





    回頁首


    在列表中對命令分組

    大多數 Shell 都具有在列表中對命令分組的方法,以便您能將它們的合計輸出向下傳遞到某個管道,或者將其任何部分或全部流重定向到相同的地方。您一般可以通過在某個 Subshell 中運行一個命令列表或通過在當前 Shell 中運行一個命令列表來實現此目的。

    在 Subshell 中運行命令列表

    使用括號將命令列表包括在單個組中。這樣做將在一個新的 Subshell 中運行命令,并允許您重定向或收集整組命令的輸出,如以下示例所示:


    清單 11. 好習慣 6 的示例:在 Subshell 中運行命令列表
    ~ $ ( cd tmp/a/b/c/ || mkdir -p tmp/a/b/c && \
    > VAR=$PWD; cd ~; tar xvf -C $VAR archive.tar ) \
    > | mailx admin -S "Archive contents"

    在此示例中,該存檔的內容將提取到 tmp/a/b/c/ 目錄中,同時將分組命令的輸出(包括所提取文件的列表)通過郵件發送到地址 admin

    當您在命令列表中重新定義環境變量,并且您不希望將那些定義應用于當前 Shell 時,使用 Subshell 更可取。

    在當前 Shell 中運行命令列表

    將命令列表用大括號 ({}) 括起來,以在當前 Shell 中運行。確保在括號與實際命令之間包括空格,否則 Shell 可能無法正確解釋括號。此外,還要確保列表中的最后一個命令以分號結尾,如以下示例所示:


    清單 12. 好習慣 6 的另一個示例:在當前 Shell 中運行命令列表
    ~ $ { cp ${VAR}a . && chown -R guest.guest a && \
    > tar cvf newarchive.tar a; } | mailx admin -S "New archive"





    回頁首


    在 find 之外使用 xargs

    使用 xargs 工具作為篩選器,以充分利用從 find 命令挑選的輸出。find 運行通常提供與某些條件匹配的文件列表。此列表被傳遞到 xargs 上,后者然后使用該文件列表作為參數來運行其他某些有用的命令,如以下示例所示:


    清單 13. xargs 工具的經典用法示例
    ~ $ find some-file-criteria some-file-path | \
    > xargs some-great-command-that-needs-filename-arguments

    然而,不要將 xargs 僅看作是 find 的輔助工具;它是一個未得到充分利用的工具之一,當您養成使用它的習慣時,將會希望進行所有試驗,包括以下用法。

    傳遞空格分隔的列表

    在最簡單的調用形式中,xargs 就像一個篩選器,它接受一個列表(每個成員分別在單獨的行上)作為輸入。該工具將那些成員放置在單個空格分隔的行上:


    清單 14. xargs 工具產生的輸出示例
    ~ $ xargsabcControl-D
    a b c
    ~ $
    

    您可以發送通過 xargs 來輸出文件名的任何工具的輸出,以便為其他某些接受文件名作為參數的工具獲得參數列表,如以下示例所示:


    清單 15. xargs 工具的使用示例
    ~/tmp $ ls -1 | xargs
    December_Report.pdf README a archive.tar mkdirhier.sh
    ~/tmp $ ls -1 | xargs file
    December_Report.pdf: PDF document, version 1.3
    README: ASCII text
    a: directory
    archive.tar: POSIX tar archive
    mkdirhier.sh: Bourne shell script text executable
    ~/tmp $
    

    xargs 命令不只用于傳遞文件名。您還可以在需要將文本篩選到單個行中的任何時候使用它:


    清單 16. 好習慣 7 的示例:使用 xargs 工具來將文本篩選到單個行中
    ~/tmp $ ls -l | xargs
    -rw-r--r-- 7 joe joe 12043 Jan 27 20:36 December_Report.pdf -rw-r--r-- 1 \
    root root 238 Dec 03 08:19 README drwxr-xr-x 38 joe joe 354082 Nov 02 \
    16:07 a -rw-r--r-- 3 joe joe 5096 Dec 14 14:26 archive.tar -rwxr-xr-x 1 \
    joe joe 3239 Sep 30 12:40 mkdirhier.sh
    ~/tmp $
    

    謹慎使用 xargs

    從技術上講,使用 xargs 很少遇到麻煩。缺省情況下,文件結束字符串是下劃線 (_);如果將該字符作為單個輸入參數來發送,則它之后的所有內容將被忽略。為了防止這種情況發生,可以使用 -e 標志,它在不帶參數的情況下完全禁用結束字符串。





    回頁首


    了解何時 grep 應該執行計數——何時應該繞過

    避免通過管道將 grep 發送到 wc -l 來對輸出行數計數。grep-c 選項提供了對與特定模式匹配的行的計數,并且一般要比通過管道發送到 wc 更快,如以下示例所示:


    清單 17. 好習慣 8 的示例:使用和不使用 grep 的行計數
    ~ $ time grep and tmp/a/longfile.txt | wc -l
    2811
    
    real    0m0.097s
    user    0m0.006s
    sys     0m0.032s
    ~ $ time grep -c and tmp/a/longfile.txt
    2811
    
    real    0m0.013s
    user    0m0.006s
    sys     0m0.005s
    ~ $ 
    

    除了速度因素外,-c 選項還是執行計數的好方法。對于多個文件,帶 -c 選項的 grep 返回每個文件的單獨計數,每行一個計數,而針對 wc 的管道則提供所有文件的組合總計數。

    然而,不管是否考慮速度,此示例都表明了另一個要避免地常見錯誤。這些計數方法僅提供包含匹配模式的行數——如果那就是您要查找的結果,這沒什么問題。但是在行中具有某個特定模式的多個實例的情況下,這些方法無法為您提供實際匹配實例數量 的真實計數。歸根結底,若要對實例計數,您還是要使用 wc 來計數。首先,使用 -o 選項(如果您的版本支持它的話)來運行 grep 命令。此選項 輸出匹配的模式,每行一個模式,而不輸出行本身。但是您不能將它與 -c 選項結合使用,因此要使用 wc -l 來對行計數,如以下示例所示:


    清單 18. 好習慣 8 的示例:使用 grep 對模式實例計數
    ~ $ grep -o and tmp/a/longfile.txt | wc -l
    3402
    ~ $
    

    在此例中,調用 wc 要比第二次調用 grep 并插入一個虛擬模式(例如 grep -c)來對行進行匹配和計數稍快一點。





    回頁首


    匹配輸出中的某些字段,而不只是對行進行匹配

    當您只希望匹配輸出行中特定字段 中的模式時,諸如 awk 等工具要優于 grep

    下面經過簡化的示例演示了如何僅列出 12 月修改過的文件。


    清單 19. 壞習慣 9 的示例:使用 grep 來查找特定字段中的模式
    ~/tmp $ ls -l /tmp/a/b/c | grep Dec
    -rw-r--r--  7 joe joe  12043 Jan 27 20:36 December_Report.pdf
    -rw-r--r--  1 root root  238 Dec 03 08:19 README
    -rw-r--r--  3 joe joe   5096 Dec 14 14:26 archive.tar
    ~/tmp $
    

    在此示例中,grep 對行進行篩選,并輸出其修改日期和名稱中帶 Dec 的所有文件。因此,諸如 December_Report.pdf 等文件是匹配的,即使它自從一月份以來還未修改過。這可能不是您希望的結果。為了匹配特定字段中的模式,最好使用 awk,其中的一個關系運算符對確切的字段進行匹配,如以下示例所示:


    清單 20. 好習慣 9 的示例:使用 awk 來查找特定字段中的模式
    ~/tmp $ ls -l | awk '$6 == "Dec"'
    -rw-r--r--  3 joe joe   5096 Dec 14 14:26 archive.tar
    -rw-r--r--  1 root root  238 Dec 03 08:19 README
    ~/tmp $
    

    有關如何使用 awk 的更多詳細信息,請參見參考資料





    回頁首


    停止對 cat 使用管道

    grep 的一個常見的基本用法錯誤是通過管道將 cat 的輸出發送到 grep 以搜索單個文件的內容。這絕對是不必要的,純粹是浪費時間,因為諸如 grep 這樣的工具接受文件名作為參數。您根本不需要在這種情況下使用 cat,如以下示例所示:


    清單 21. 好習慣和壞習慣 10 的示例:使用帶和不帶 cat 的 grep
    	
    ~ $ time cat tmp/a/longfile.txt | grep and
    2811
    
    real    0m0.015s
    user    0m0.003s
    sys     0m0.013s
    ~ $ time grep and tmp/a/longfile.txt
    2811
    
    real    0m0.010s
    user    0m0.006s
    sys     0m0.004s
    ~ $ 
    

    此錯誤存在于許多工具中。由于大多數工具都接受使用連字符 (-) 的標準輸入作為一個參數,因此即使使用 cat 來分散 stdin 中的多個文件,參數也通常是無效的。僅當您使用帶多個篩選選項之一的 cat 時,才真正有必要在管道前首先執行連接。





    回頁首


    結束語:養成好習慣

    最好檢查一下您的命令行習慣中的任何不良的使用模式。不良的使用模式會降低您的速度,并且通常會導致意外錯誤。本文介紹了 10 個新習慣,它們可以幫助您擺脫許多最常見的使用錯誤。養成這些好習慣是加強您的 UNIX 命令行技能的積極步驟。

    posted on 2007-02-12 17:39 SYBIL@BLOGJAVA 閱讀(150) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 一本色道久久综合亚洲精品蜜桃冫 | 久久久久久久亚洲Av无码| 免费鲁丝片一级在线观看| 99精品一区二区免费视频| 国产免费一级高清淫曰本片| 亚洲一区二区三区成人网站| 亚洲综合在线成人一区| 久久夜色精品国产亚洲| 亚洲精品和日本精品| 日韩成人免费aa在线看| 曰曰鲁夜夜免费播放视频| 亚洲免费精彩视频在线观看| 你懂的免费在线观看| 无码免费又爽又高潮喷水的视频| 亚洲精品成a人在线观看夫| 亚洲一区二区三区不卡在线播放| 美女尿口扒开图片免费| 亚洲综合小说另类图片动图 | 久久精品视频免费播放| 成人片黄网站色大片免费观看cn | 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 亚洲噜噜噜噜噜影院在线播放| 亚洲国产精品无码AAA片| 中文字幕精品无码亚洲字| 亚洲七七久久精品中文国产| 波多野结衣一区二区免费视频| 欧洲精品免费一区二区三区| 最近2019中文字幕免费看最新| 五月婷婷综合免费| 免费大片黄在线观看yw| 青青草a免费线观a| 国产精品成人免费一区二区| 国产精品入口麻豆免费观看| AV大片在线无码永久免费| 波多野结衣在线免费视频| 无人在线直播免费观看| 日韩毛片无码永久免费看| 国产精品无码素人福利免费| 亚洲国产一成久久精品国产成人综合| 亚洲成a人无码av波多野按摩| 亚洲精品无码永久在线观看|