日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

linux 的重定向、管道、xargs 命令

發(fā)布時(shí)間:2025/3/21 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 的重定向、管道、xargs 命令 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文地址:http://blog.csdn.net/lucky_liuxiang/article/details/70597755

重定向、管道和xargs命令都是在命令之間傳遞數(shù)據(jù)的方式。Linux的最初的理念就是KISS“Keep It Simple, Stupid!”的縮寫。命令行命令都只做一樣事情,但是要完成得非常出色。給我最深刻印象是tar命令。tar命令的目的只是將幾個(gè)文件連接在一起組成一個(gè)大文件而已。而壓縮的程序只能壓縮單個(gè)文件。肯定有人會(huì)有疑問(wèn),tar命令的-z-j之類的參數(shù)也可以壓縮啊。其實(shí)tar本身沒(méi)有壓縮代碼,tar是通過(guò)調(diào)用外部的gzipbzip2之類的壓縮命令來(lái)完成工作的。KISS的理念得到了廣泛的支持。好多Linux命令都只會(huì)做一件事情。而復(fù)雜的事情則需要通過(guò)各種命令的組合來(lái)完成。各命令之間的通信,除了中間臨時(shí)文件以外,Linux還提供了管道來(lái)完成直接的數(shù)據(jù)傳輸。重定向可以將標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸入或標(biāo)準(zhǔn)錯(cuò)誤重定向到文件或設(shè)備(這里涉及到Linux另外一條設(shè)計(jì)理念,就是一切都是文件,設(shè)備都是文件)。xargs可以將標(biāo)準(zhǔn)輸入的內(nèi)容轉(zhuǎn)變成命令的命令行參數(shù)。

重定向
在講重定向之前,我想說(shuō)說(shuō)什么叫標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤。在Linux里,進(jìn)程間通信(IPC)最基本的一種方法是通過(guò)管道(其他還有消息、共享內(nèi)存等)。管道就像流水線一樣,單向的,不用關(guān)心管道另外一邊是誰(shuí)。系統(tǒng)給每一個(gè)命令行程序默認(rèn)三條管道與用戶交互,就是標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤。標(biāo)準(zhǔn)輸入指的是用戶按鍵盤給程序輸入數(shù)據(jù)。標(biāo)準(zhǔn)輸出是指程序正常打印給用戶的信息,是打印到shell上的。標(biāo)準(zhǔn)錯(cuò)誤跟標(biāo)準(zhǔn)輸出在本質(zhì)上是相同的,都是輸出信息給用戶。不同的是,兩個(gè)管道是分開(kāi)的,可以用來(lái)打印不同種類的信息,比如說(shuō)標(biāo)準(zhǔn)錯(cuò)誤通常用來(lái)打印錯(cuò)誤信息。因?yàn)槭褂霉艿啦挥藐P(guān)心另外一邊是誰(shuí),所以把管道接到別的地方,程序也不會(huì)知道。Linux用了這種特性來(lái)實(shí)現(xiàn)了管道的重定向。
默認(rèn)情況,三個(gè)默認(rèn)管道是跟用戶交互的。因?yàn)樵?/span>Linux下,每個(gè)命令都只做一件事情。有些情況下,用戶想讓程序跟程序之間交互通過(guò)默認(rèn)管道交互,比如說(shuō)想把一個(gè)命令的輸出接到另外一個(gè)命令的輸入里面。重定向的方法如下:

> filename,重定向標(biāo)準(zhǔn)輸出到文件,覆蓋文件。
>> filename,重定向標(biāo)準(zhǔn)輸出到文件,追加模式。
2> filename,重定向標(biāo)準(zhǔn)錯(cuò)誤到文件。
&> filename,重定向標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)錯(cuò)誤到文件。相當(dāng)于同時(shí)使用>2>。(感謝yszzf友情提供)
< filename,重定向標(biāo)準(zhǔn)輸入自文件

舉個(gè)例子,在用find的時(shí)候,有的目錄不允許訪問(wèn),find就輸出很多行的錯(cuò)誤,真正的搜索結(jié)果就看不到了。這時(shí)我會(huì)把標(biāo)準(zhǔn)錯(cuò)誤重定向到空設(shè)備去。

1.?find / -name "filename" 2> /dev/null

再比如在用gdb進(jìn)行自動(dòng)測(cè)試的時(shí)候,把命令寫到一個(gè)文件里,然后送入gdb

1.?gdb program < test_script.gdb

管道
管道的原理上面基本介紹清楚了。管道是讓用戶將不同程序間的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出連接起來(lái),而不單單是重定向到文件。用法是在命令間用“|”連接起來(lái)。

app1 | app2


我最常用的幾個(gè)情況:
1. 程序輸出太多,用less慢慢看。

1.?verbose_app | less

2. 在程序輸出里面進(jìn)行搜索。一種方法可以送到less里面在用less搜索。這里用另外一個(gè)命令,grep

verbose_app | grep pattern
# pattern是被搜索的內(nèi)容。如果有空格,用雙引號(hào)括起來(lái)。如果想使用擴(kuò)展正則表達(dá)式,用grep -E

3. 因?yàn)樵谥囟ㄏ蛄艘院?#xff0c;被重定向的管道就不再打印到屏幕了。如果又想打印到文件,又想打印到屏幕,可以用tee命令

verbose_app | tee filename | another_app



xargs
如果后面的程序必須要命令行參數(shù),而不接受管道傳參數(shù),就要使用xargs
1. 先演示一下原理。

echo "arg1 arg2" | xargs app
# 相當(dāng)于
app arg1 arg2

2. find或者ls查找文件,然后將所有文件tar了。

find . -type f | xargs tar -cvzf output.tar.gz

3. 計(jì)算源文件行數(shù)。這里要用到一個(gè)叫wc的命令,是用來(lái)計(jì)算文件單詞數(shù)、字符數(shù)和行數(shù)的。如果管道到wc的話,wc會(huì)將數(shù)據(jù)當(dāng)做文本來(lái)進(jìn)行計(jì)算。文件名只有從命令行傳遞

find . ?name"?.c"?o?name"?.h"?o?name"?.cpp"?o?name"?.hpp" -type f | xargs wc -l
# 或者
find . -type f | grep -E "\.[ch](pp)?$" | xargs wc -l

重定向的>2><之類的原理是把標(biāo)準(zhǔn)輸入等用新的管道來(lái)取代。
我一開(kāi)始是這樣寫的

command >/dev/null 2>&1

這樣寫的問(wèn)題是,>已經(jīng)將標(biāo)準(zhǔn)輸出用null設(shè)備替換了,然后2>&1將標(biāo)準(zhǔn)錯(cuò)誤接到標(biāo)準(zhǔn)輸出上,而標(biāo)準(zhǔn)輸出現(xiàn)在已經(jīng)變成了null設(shè)備,也就是說(shuō)標(biāo)準(zhǔn)錯(cuò)誤接到了null設(shè)備上。
正確的方法是

command 2>&1 >/dev/null

另外,交換標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤:

command 3>&1 1>&2 2>&3

總結(jié)

以上是生活随笔為你收集整理的linux 的重定向、管道、xargs 命令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。