重定向、管道和xargs命令都是在命令之間傳遞資料的方式。
linux
的最初的理念就是
kiss
,「keep it ******, stupid!」
的縮寫。命令列命令都只做一樣事情,但是要完成得非常出色。給我最深刻印象是
tar命令。
tar命令的目的只是將幾個檔案連線在一起組成乙個大檔案而已。而壓縮的程式只能壓縮單個檔案。肯定有人會有疑問,
tar命令的-z和
-j之類的引數也可以壓縮啊。其實
tar本身沒有壓縮**,
tar是通過呼叫外部的
gzip
、bzip2
之類的壓縮命令來完成工作的。
kiss
的理念得到了廣泛的支援。好多
linux
命令都只會做一件事情。而複雜的事情則需要通過各種命令的組合來完成。各命令之間的通訊,除了中間臨時檔案以外,
linux
還提供了管道來完成直接的資料傳輸。重定向可以將標準輸入、標準輸入或標準錯誤重定向到檔案或裝置(這裡涉及到
linux
另外一條設計理念,就是一切都是檔案,裝置都是檔案)。
xargs
可以將標準輸入的內容轉變成命令的命令列引數。
重定向在講重定向之前,我想說說什麼叫標準輸入,標準輸出和標準錯誤。在linux裡,程序間通訊(
ipc)最基本的一種方法是通過管道(其他還有訊息、共享記憶體等)。管道就像流水線一樣,單向的,不用關心管道另外一邊是誰。系統給每乙個命令列程式預設三條管道與使用者互動,就是標準輸入,標準輸出和標準錯誤。標準輸入指的是使用者按鍵盤給程式輸入資料。標準輸出是指程式正常列印給使用者的資訊,是列印到
shell
上的。標準錯誤跟標準輸出在本質上是相同的,都是輸出資訊給使用者。不同的是,兩個管道是分開的,可以用來列印不同種類的資訊,比如說標準錯誤通常用來列印錯誤資訊。因為使用管道不用關心另外一邊是誰,所以把管道接到別的地方,程式也不會知道。
linux
用了這種特性來實現了管道的重定向。
預設情況,三個預設管道是跟使用者互動的。因為在linux下,每個命令都只做一件事情。有些情況下,使用者想讓程式跟程式之間互動通過預設管道互動,比如說想把乙個命令的輸出接到另外乙個命令的輸入裡面。重定向的方法如下:
> filename,重定向標準輸出到檔案,覆蓋檔案。
>> filename,重定向標準輸出到檔案,追加模式。
2> filename,重定向標準錯誤到檔案。
&> filename,重定向標準輸入和標準錯誤到檔案。相當於同時使用
>
和2>
。(感謝
yszzf
友情提供)
< filename,重定向標準輸入自檔案
舉個例子,在用find的時候,有的目錄不允許訪問,
find
就輸出很多行的錯誤,真正的搜尋結果就看不到了。這時我會把標準錯誤重定向到空裝置去。
1. find / -name "filename" 2> /dev/null
再比如在用gdb進行自動測試的時候,把命令寫到乙個檔案裡,然後送入
gdb。
1. gdb program < test_script.gdb
管道管道的原理上面基本介紹清楚了。管道是讓使用者將不同程式間的標準輸入、標準輸出連線起來,而不單單是重定向到檔案。用法是在命令間用「|」連線起來。
我最常用的幾個情況:
1. 程式輸出太多,用
less
慢慢看。
2. 在程式輸出裡面進行搜尋。一種方法可以送到
less
裡面在用
less
搜尋。這裡用另外乙個命令,
grep。
grep -e。
3. 因為在重定向了以後,被重定向的管道就不再列印到螢幕了。如果又想列印到檔案,又想列印到螢幕,可以用
tee命令
xargs
如果後面的程式必須要命令列引數,而不接受管道傳引數,就要使用xargs。
1. 先演示一下原理。
2. 用
find
或者ls
查詢檔案,然後將所有檔案
tar了。
find . -type f | xargs tar -cvzf output.tar.gz
3. 計算原始檔行數。這裡要用到乙個叫
wc的命令,是用來計算檔案單詞數、字元數和行數的。如果管道到
wc的話,
wc會將資料當做文本來進行計算。檔名只有從命令列傳遞
find . −n
ame"
∗.c"
−o−n
ame"
∗.h"
−o−n
ame"
∗.cp
p"−o
−nam
e"∗.
hpp"
-type f | xargs wc -l
# 或者
find . -type f | grep -e "\.[ch](pp)?$" | xargs wc -l
重定向的》,
2>
,<
之類的原理是把標準輸入等用新的管道來取代。
我一開始是這樣寫的
command >/dev/null 2>&1
這樣寫的問題是,>已經將標準輸出用
null
裝置替換了,然後
2>&1
將標準錯誤接到
「標準輸出
」上,而
「標準輸出
」現在已經變成了
null
裝置,也就是說標準錯誤接到了
null
裝置上。
正確的方法是
command 2>&1 >/dev/null
另外,交換標準輸出和標準錯誤:
command 3>&1 1>&2 2>&3
linux重定向 管道
1 這條命令是什麼意思?cat file1 file2 grep name tee file3 file4 file5 wc l 該命令表示 將 file1 file2 中的包含 name 的行重定向輸出。使用 tee 命令表示 將該輸出有兩個去向。乙個是定向到檔案 file3,file4,flie...
Linux管道及重定向
這是看itercast的學習筆記 命令列shell的資料流有以下定義 名稱說明 編號預設 stdin 標準輸入0鍵盤 stdout 標準輸出1終端 stderr 標準錯誤2終端 命令通過stdin接收資料,通過stdout輸出結果或者通過stderr輸出錯誤 通過管道和重定向我們可以控制資料流 分類...
linux 重定向與管道
linux中重定向表示符號有 linux中管道表示符號 先說重定向,重定向符號的指向的方向代表了資料的流向,這句話很重要!先說 與 可以看出資料流向為從左到右,命令在左邊,所以又叫重定向輸出。通常用於輸出到檔案。如cat test1.txt test2.txt,會發現,檔案test2.txt中的原有...