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

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

;Linux shell中的管道|是非常方便的功能,可以將一個程序的輸出作為另外一個程序的輸入,這樣我們可以將多個命令“拼”在一起,省去了臨時文件的繁瑣 。windows中也有類似的用法,比如dir |more,學(xué)過dos命令的應(yīng)該都知道吧 。既然是管道,那么就有一個入口和一個出口,各自對應(yīng)一個應(yīng)用程序,正常的情況下,入口應(yīng)用程序的輸出應(yīng)當(dāng)被出口應(yīng)用程序全部接受,但在一些特殊情況,出口應(yīng)用程序會提前關(guān)閉管道,比如在查詢svn的更新日志,只取前己行的時候: $ svn log |head ---------------- r137 | Fwolf | 2007-05-28 13:38:470800 (Mon, 28 May 2007) | 4 lines 更新記錄 。svn: Write error: Broken pipe 由于head只需要用到輸入的前10行(默認(rèn)行數(shù),也可由用戶指定),再接收剩下的輸出也是多余,便提前關(guān)閉了管道,管道入口的應(yīng)用程序svn發(fā)現(xiàn)之后,便報錯退出了 。在這個例子中,錯誤信息非常清楚,但不是所有應(yīng)用程序都這樣的,比如下面這個: $ find . -name "*rc" |xargs -i cat {}|head -1 [Desktop] xargs: cat: terminated by signal 13 錯誤信息似乎并不太好理解,實際上它的意思是:xargs發(fā)現(xiàn)它的子進(jìn)程cat由于信號13被中止了 。由于xargs本身屬于循環(huán)操作,發(fā)現(xiàn)錯誤之后就停止了循環(huán),這是其一;信號13是在cat試圖向一個已關(guān)閉的pipe管道中寫數(shù)據(jù)的時候,系統(tǒng)產(chǎn)生的,cat收到之后就停止了 。類似于在cat輸出的過程中,用戶按下ctrl c的效果 。如何避免這種問題呢?很簡單,管道后面使用不會提前關(guān)閉管道的程序即可,尤其是結(jié)合xargs使用的時候,它發(fā)現(xiàn)出錯就不繼續(xù)了 。比如要用到head可以這樣: $ cat file |head -1 雖然cat仍然會被signal 13關(guān)閉,但bash是不會報錯的,所以也只能針對一個文件進(jìn)行操作,即使是使用了通配符也只能head到第一個文件 。如果要加上對文件的遍歷,可以用到for: $for file in .*rc;do cat $file |head -1;done cat依然會被關(guān)閉,但是for不會理會它,繼續(xù)循環(huán) 。head也可以直接指定文件名,這樣我們就可以拋開cat了: $find . -name "*rc" |xargs -i head -n1 {} 個人認(rèn)為這是一種最完美的解決方式,即可以用到find強大的搜索指令,還不會涉及到管道的問題 。不過如果文件名沒有什么特殊要求,還有一種更簡單的方式: $head -n1 .*rc 在head的參數(shù)中直接用通配符指定文件 。

    推薦閱讀