output。對話 UNIX,第 13 部分: 另外十種命令行組合( 三 )。" />

日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

對話 UNIX,第 13 部分: 另外十種命令行組合( 三 )


為了使得 find 更具可移植性,并且類似于 Spotlight 的搜索特性,那么應該使用 -print0 -follow -iname pattern。
收集許多命令的輸出的簡單方法
通過使用 > output 和 >> output 修飾符,您可以很容易地捕獲一個命令行的輸出,其中前者用于創(chuàng)建或者覆蓋文件 output,而后者則將內容追加到 output。您可以組合使用任何修飾符以生成一系列命令的文本,如果您正嘗試對系統(tǒng)狀態(tài)進行快照,這種方法是非常有價值的,例如:
$ ps > state.`date ' %F'`
$ w >> state.`date ' %F'`
反勾號或反引號操作符 (``) 可以對命令進行擴展 。在 Shell 對命令行進行解釋時,將執(zhí)行反勾號之間的命令,并在最終的擴展結果中使用該命令的輸出 。在本示例中,參數周圍的單引號用于保持參數不變,從而可以避免 Shell 對和 % 進行解釋 。
在執(zhí)行了這兩個命令之后,創(chuàng)建了文件 state.YYYY-MM-DD,如 state.2007-08-05,其內容與以下所示類似:
 PID TTY TIME CMD
9997 pts/100:00:00 zsh
10351 pts/100:00:00 ps
17:56:04 up 21 days, 2:53, 2 users, load average: 0.89, 0.94, 0.91
USER TTY FROM LOGIN@IDLEJCPUPCPU WHAT
adamgood pts/0c-67-169-182-255 Sat170.00s 0.37s 0.36s pine
mstreich pts/1cpe-071-065-224- 17:170.00s 0.01s 0.00s w
不過,每次輸入反勾號操作是非常麻煩的 。您可以使用下面的命令來代替這個序列:
$ file=state.`date ' %F'`
$ ps > $file
$ w >> $file
但是,雖然這樣做稍微有效一些,但仍然可能出現錯誤,因為在第二個或者后續(xù)的命令中,很可能使用 > 而不是 >> 。要捕獲一系列命令的輸出,最簡單的方法是使用大括號 ({ }) 將命令括起來 。
$ { ps; w } > state.`date ' %F'`
ps 命令運行(列出用戶當前的進程),然后是 w(它將顯示誰正在使用這臺計算機),并將收集到的輸出保存到一個文件中 。
注意: 您還可以在圓括號中嵌入一個命令序列,以得到相同的結果;然而,兩者之間有一個重要的區(qū)別 。在圓括號中的系列命令將在一個子 Shell 中運行,并且不會對當前 Shell 的狀態(tài)產生影響 。
例如,您可能希望運行這個序列:$ { cd $HOME; ls
 -1}; pwd
它將與下面的命令產生相同的輸出:$ (cd $HOME; ls); pwd
大括號中的命令更改了當前 Shell 的工作目錄 。后面的這種技術則無能為力 。是使用組合還是子 Shell,這取決于您的目的,盡管子 Shell 的功能更強大一些,下面將對其進行描述 。
子 Shell 可以為您提供幫助!
盡管通常運行子 Shell 將聚合的輸出通過管道傳遞給單個命令,但您還可以使用子 Shell 對命令進行擴展,就像反勾號那樣 。然而更有價值的是,子 Shell 可以包含另一個子 Shell,所以還可以進行嵌套擴展 。
讓我們來看看下面簡單的例子 。
$ {ps; w} > state.$(date ' %F')
【對話 UNIX,第 13 部分: 另外十種命令行組合】這個命令與 { ps; w } > state.`date ' %F'` 是相同的 。$( ) 符號運行圓括號中的命令,然后使用輸出來替換自己 。換句話說,$() 可以進行擴展,就像反勾號一樣 。然而,與反勾號不同的是,$( ) 非常復雜,并且甚至可以包括其他 $( ) 擴展 。下面提供了一些示例:
$ (cd $(grep strike /etc/passwd | cut -f6 -d':'); ls)
這個命令在密碼文件中搜索用戶 strike 對應的條目,提取其 home 目錄(密碼文件中的第 6 個字段,如果您從 0 開始數)字段,更改到這個目錄,并列出其中的內容 。grep /etc/passwd strike | cut -f6 -d':' 的輸出將在執(zhí)行任何其他操作之前進行擴展 。
下面是另一個示例,這次的用戶名來自于 whoami 的結果:
(cd $(grep $(whoami) /etc/passwd | cut -f6 -d':'); ls)

推薦閱讀