国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Linux > 正文

解決Linux系統(tǒng)下管道被接受方關(guān)閉的問題

2024-06-28 13:02:56
字體:
供稿:網(wǎng)友
 

linux shell中的管道|是非常方便的功能,可以將一個(gè)程序的輸出作為另外一個(gè)程序的輸入,這樣我們可以將多個(gè)命令“拼”在一起,省去了臨時(shí)文件的繁瑣。windows中也有類似的用法,比如dir |more,學(xué)過dos命令的應(yīng)該都知道吧。

既然是管道,那么就有一個(gè)入口和一個(gè)出口,各自對(duì)應(yīng)一個(gè)應(yīng)用程序,正常的情況下,入口應(yīng)用程序的輸出應(yīng)當(dāng)被出口應(yīng)用程序全部接受,但在一些特殊情況,出口應(yīng)用程序會(huì)提前關(guān)閉管道,比如在查詢svn的更新日志,只取前己行的時(shí)候:

$ svn log |head

----------------

r137 | Fwolf | 2007-05-28 13:38:47 +0800 (Mon, 28 May 2007) | 4 lines

更新記錄。

svn: Write error: Broken pipe

由于head只需要用到輸入的前10行(默認(rèn)行數(shù),也可由用戶指定),再接收剩下的輸出也是多余,便提前關(guān)閉了管道,管道入口的應(yīng)用程序svn發(fā)現(xiàn)之后,便報(bào)錯(cuò)退出了。在這個(gè)例子中,錯(cuò)誤信息非常清楚,但不是所有應(yīng)用程序都這樣的,比如下面這個(gè):

$ find . -name "*rc" |xargs -i cat {}|head -1

[Desktop]

xargs: cat: terminated by signal 13

錯(cuò)誤信息似乎并不太好理解,實(shí)際上它的意思是:xargs發(fā)現(xiàn)它的子進(jìn)程cat由于信號(hào)13被中止了。由于xargs本身屬于循環(huán)操作,發(fā)現(xiàn)錯(cuò)誤之后就停止了循環(huán),這是其一;信號(hào)13是在cat試圖向一個(gè)已關(guān)閉的pipe管道中寫數(shù)據(jù)的時(shí)候,系統(tǒng)產(chǎn)生的,cat收到之后就停止了。類似于在cat輸出的過程中,用戶按下ctrl+c的效果。

如何避免這種問題呢?很簡單,管道后面使用不會(huì)提前關(guān)閉管道的程序即可,尤其是結(jié)合xargs使用的時(shí)候,它發(fā)現(xiàn)出錯(cuò)就不繼續(xù)了。比如要用到head可以這樣:

$ cat file |head -1

雖然cat仍然會(huì)被signal 13關(guān)閉,但bash是不會(huì)報(bào)錯(cuò)的,所以也只能針對(duì)一個(gè)文件進(jìn)行操作,即使是使用了通配符也只能head到第一個(gè)文件。如果要加上對(duì)文件的遍歷,可以用到for:

$for file in .*rc;do cat $file |head -1;done

cat依然會(huì)被關(guān)閉,但是for不會(huì)理會(huì)它,繼續(xù)循環(huán)。head也可以直接指定文件名,這樣我們就可以拋開cat了:

$find . -name "*rc" |xargs -i head -n1 {}

個(gè)人認(rèn)為這是一種最完美的解決方式,即可以用到find強(qiáng)大的搜索指令,還不會(huì)涉及到管道的問題。不過如果文件名沒有什么特殊要求,還有一種更簡單的方式:

$head -n1 .*rc

在head的參數(shù)中直接用通配符指定文件。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 眉山市| 乌鲁木齐市| 新泰市| 疏附县| 凤山市| 平果县| 星座| 山丹县| 宝清县| 石棉县| 宜昌市| 贺州市| 乌拉特前旗| 渝北区| 金山区| 铁岭市| 达尔| 蒙城县| 陈巴尔虎旗| 安塞县| 上饶市| 洪洞县| 南丹县| 瓮安县| 寿光市| 九寨沟县| 桐柏县| 鹤山市| 通州市| 无棣县| 福清市| 海南省| 丰城市| 五大连池市| 淅川县| 陇川县| 怀安县| 浠水县| 卢湾区| 如皋市| 牟定县|