linux 的重定向 管道 xargs 命令

2021-08-12 00:24:34 字數 2894 閱讀 6875

重定向、管道和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中的原有...