精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

尷尬,一不小心把 Linux 管道給整漏了

系統 Linux
本文就分享一下我在實踐中使用重定向和管道符遇到的一些坑,搞明白一些底層原理,寫腳本的效率能提升不少。

[[396982]]

我很喜歡 Linux 系統,尤其是 Linux 的一些設計很漂亮,比如可以將一些復雜的問題分解成若干小問題,通過管道符和重定向機制靈活地用現成的工具解決,寫成 shell 腳本就很高效。

本文就分享一下我在實踐中使用重定向和管道符遇到的一些坑,搞明白一些底層原理,寫腳本的效率能提升不少。

> 和 >> 重定向符的坑

先說第一個問題,執行如下命令會發生什么?

  1. $ cat file.txt > file.txt 

讀取再寫入同一個文件,感覺什么也不會發生對吧?

實際上,上述命令運行的結果是清空file.txt文件中的內容。

PS:有的 Linux 發行版可能會直接報錯,可以執行cat < file.txt > file.txt繞開這個檢測。

前文 Linux 進程和文件描述符 說過,程序本身沒有必要關心自己的標準輸入/輸出指向哪里,是 shell 通過管道符和重定向符號修改了程序的標準輸入/輸出的位置。

所以執行cat file.txt > file.txt這個命令時,shell 會先打開file.txt,由于重定向符號是>,所以文件中的內容會被清空,然后 shell 將cat命令的標準輸出設置為file.txt,這時候cat命令才開始執行。

也就是如下過程:

1、shell 打開file.txt并清空其內容。

2、shell 將cat命令的標準輸出指向file.txt文件。

3、shell 執行cat命令,讀了一個空文件。

4、cat命令將空字符串寫入標準輸出(file.txt文件)。

所以,最后的結果就是file.txt變成了空文件。

我們知道,>會清空目標文件,>>會在目標文件尾部追加內容,那么如果將重定向符>改成>>會怎樣呢?

  1. $ echo hello world > file.txt # 文件中只有一行內容 
  2. $ cat file.txt >> file.txt # 這個命令會死循環 

file.txt中首先被寫入一行內容,執行cat file.txt >> file.txt后預期的結果應該是兩行內容。

但是很遺憾,運行結果并不符合預期,而是會死循環不斷向file.txt中寫入 hello world,文件很快就會變得很大,只能用 Control+C 停止命令。

這就有意思了,為什么會死循環呢?其實稍加分析就可以想到原因:

首先要回憶cat命令的行為,如果只執行cat命令,就會從命令行讀取鍵盤輸入的內容,每次按下回車,cat命令就會回顯輸入,也就是說,cat命令是逐行讀取數據然后輸出數據的。

那么,cat file.txt >> file.txt命令的執行過程如下:

1、打開file.txt,準備在文件尾部追加內容。

2、將cat命令的標準輸出指向file.txt文件。

3、cat命令讀取file.txt中的一行內容并寫入標準輸出(追加到file.txt文件中)。

4、由于剛寫入了一行數據,cat命令發現file.txt中還有可以讀取的內容,就會重復步驟 3。

以上過程,就好比一邊遍歷列表,一遍往列表里追加元素一樣,永遠遍歷不完,所以導致我們的命令死循環。

> 重定向符和 | 管道符配合

我們經常會遇到這樣的需求:截取文件的前 XX 行,其余的都刪除。

在 Linux 中,head命令可以完成截取文件前幾行的功能:

  1. $ cat file.txt # file.txt 中有五行內容 
  2. $ head -n 2 file.txt # head 命令讀取前兩行 
  3. $ cat file.txt | head -n 2 # head 也可以讀取標準輸入 

如果我們想保留文件的前 2 行,其他的都刪除,可能會用如下命令:

  1. $ head -n 2 file.txt > file.txt 

但是這就犯了前文說的錯誤,最后file.txt會被清空,不能實現我們的需求。

那我們是這樣寫命令是否可以避坑呢:

  1. $ cat file.txt | head -n 2 > file.txt 

結論是不行,文件內容依然會被清空。

What?是不是管道漏了,把數據全漏掉了?

前文 Linux 進程和文件描述符 也說過管道符的實現原理,本質上就是將兩個命令的標準輸入和輸出連接起來,讓前一個命令的標準輸出作為下一個命令的標準輸入。

但是,如果你認為這樣寫命令可以得到預期的結果,那可能是因為你認為管道符連接的命令是串行執行的,這是一個常見的錯誤,實際上管道符連接的多個命令是并行執行的。

你可能以為,shell 會先執行cat file.txt命令,正常讀取file.txt中的所有內容,然后把這些內容通過管道傳遞給head -n 2 > file.txt命令。

雖然這時候file.txt中的內容會被清空,但是head并沒有從文件中讀取數據,而是從管道讀取數據,所以應該可以向file.txt正確寫入兩行數據。

但實際上,上述理解是錯誤的,shell 會并行執行管道符連接的命令,比如說執行如下命令:

  1. $ sleep 5 | sleep 5 

shell 會同時啟動兩個sleep進程,所以執行結果是睡眠 5 秒,而不是 10 秒。

這是有點違背直覺的,比如這種常見的命令:

  1. $ cat filename | grep 'pattern' 

直覺好像是先執行cat命令一次性讀取了filename中所有的內容,然后傳遞給grep命令進行搜索。

但實際上是cat和grep命令是同時執行的,之所以能得到預期的結果,是因為grep 'pattern'會阻塞等待標準輸入,而cat通過 Linux 管道向grep的標準輸入寫入數據。

執行下面這個命令能直觀感受到cat和grep是在同時執行的,grep在實時處理我們用鍵盤輸入的數據:

  1. $ cat | grep 'pattern' 

說了這么多,再回顧一開始的問題:

  1. $ cat file.txt | head -n 2 > file.txt 

cat命令和head會并行執行,誰先誰后不確定,執行結果也就不確定。

如果head命令先于cat執行,那么file.txt就會被先清空,cat也就讀取不到任何內容;反之,如果cat先把文件的內容讀取出來,那么可以得到預期的結果。

不過,通過我的實驗(將這種并發情況重復 1w 次)發現,file.txt被清空這種錯誤情況出現的概率遠大于預期結果出現的概率,這個暫時還不清楚是為什么,應該和 Linux 內核實現進程和管道的邏輯有關。

解決方案

說了這么多管道符和重定向符的特點,如何才能避免這個文件被清空的坑呢?

最靠譜的辦法就是不要同時對同一個文件進行讀寫,而是通過臨時文件的方式做一個中轉。

比如說只保留file.txt文件中的頭兩行,可以這樣寫代碼:

  1. # 先把數據寫入臨時文件,然后覆蓋原始文件 
  2. $ cat file.txt | head -n 2 > temp.txt && mv temp.txt file.txt 

這是最簡單,最可靠,萬無一失的方法。

你如果嫌這段命令太長,也可以通過apt/brew/yum等包管理工具安裝moreutils包,就會多出一個sponge命令,像這樣使用:

  1. # 先把數據傳給 sponge,然后由 sponge 寫入原始文件 
  2. $ cat file.txt | head -n 2 | sponge file.txt 

sponge這個單詞的意思是海綿,挺形象的,它會先把輸入的數據「吸收」起來,最后再寫入file.txt,核心思路和我們使用臨時文件時類似的,這個「海綿」就好比一個臨時文件,就可以避免同時打開同一個文件進行讀寫的問題。 

以上就是重定向和管道符的一些坑,希望能幫到你。

 

責任編輯:武曉燕 來源: labuladong
相關推薦

2021-10-07 16:45:06

MySQL數據庫

2021-01-05 22:49:37

Python編程語言Java

2021-01-30 09:50:54

MySQL密碼服務器

2021-07-28 05:01:29

Lombok前端測試

2023-03-10 08:27:07

for循環項目線性結構

2020-10-26 08:56:32

技術總監程序員

2024-05-13 07:58:52

開源項目PR

2018-01-18 22:26:30

2019-09-19 20:47:29

刷臉支付人臉識別人工智能

2020-10-28 15:07:01

Arthas

2022-09-27 18:19:32

Java數據結構

2025-03-05 00:27:00

2021-03-29 18:47:53

APP服務端通信安全數據安全

2020-04-30 09:45:41

安卓App小米

2021-03-26 06:14:26

Hashcode項目排查

2022-10-25 17:53:09

Java線程池

2021-01-08 09:36:23

程序員比特幣黑客

2019-07-29 14:38:35

服務器開發工具

2020-09-29 07:44:20

跨域前后端分離插件

2021-05-11 16:20:02

網站HTTPHTTPS
點贊
收藏

51CTO技術棧公眾號

国产精品乱人伦一区二区| 999在线观看精品免费不卡网站| 在线观看日韩精品| 日本午夜精品一区二区| 国产精品国产精品国产专区| 欧美视频导航| 亚洲欧美日韩中文视频| 中文字幕在线观看日| 色呦呦在线视频| 久久欧美中文字幕| 91在线免费看网站| 国产又大又黄视频| 亚洲国产精品久久久久蝴蝶传媒| 亚洲成人av在线| 亚洲欧美久久久久| 男男gaygays亚洲| 国产欧美日韩激情| 国产精品制服诱惑| 一级淫片免费看| 亚洲一区不卡| 欧美日韩成人在线观看| 日韩人妻无码精品综合区| 亚洲视频一起| 欧美日韩国产天堂| 欧美日韩在线中文| 天堂av在线电影| 中文字幕电影一区| 精品日本一区二区三区| 国产免费高清视频| 美日韩一级片在线观看| 久久久亚洲国产天美传媒修理工| 最新黄色av网址| 久久99视频| 精品国产乱子伦一区| 性生生活大片免费看视频| 台湾佬成人网| 欧美日韩视频免费播放| 国产卡一卡二在线| 在线免费观看黄色av| 久久午夜色播影院免费高清| 国产精品久久久久免费| 97在线播放免费观看| 秋霞国产午夜精品免费视频| 欧美亚洲国产视频| 国产精品成人免费一区二区视频| 亚洲精彩视频| 久久久av一区| 久久爱一区二区| 五月天久久777| 色哟哟亚洲精品一区二区| 欧美图片第一页| 亚洲精品中文字幕99999| 亚洲高清不卡av| 亚洲欧美综合视频| 国语一区二区三区| 亚洲成年人影院在线| 亚洲欧美高清在线| 亚洲成人偷拍| 精品久久五月天| 午夜福利三级理论电影| 红杏aⅴ成人免费视频| 亚洲第一福利网站| 超碰男人的天堂| 丝袜美腿综合| 亚洲欧美999| 久操视频在线观看免费| 成人a'v在线播放| 日韩中文字幕久久| 性色av无码久久一区二区三区| 91精品一区二区三区综合在线爱| 日韩视频在线免费| 欧美精品色哟哟| 日韩午夜在线| 国产精品国产福利国产秒拍 | 庆余年2免费日韩剧观看大牛| 国产精品suv一区二区三区| 亚洲视频大全| 国产精品免费视频久久久| 一级特黄aaaaaa大片| 国产一区二区三区高清播放| 97超级碰碰| 天天摸天天碰天天爽天天弄| 久久九九久久九九| 一区二区三区在线视频111| 超碰在线观看免费| 午夜成人免费视频| 一区二区三区入口| 91精品啪在线观看国产手机| 亚洲国产精品人人爽夜夜爽| 亚洲a v网站| 亚洲综合中文| 91超碰caoporn97人人| 一区二区乱子伦在线播放| 国产伦精一区二区三区| 精品欧美一区二区三区久久久| 成人不用播放器| 一区二区三区四区高清精品免费观看| 99爱视频在线| 看亚洲a级一级毛片| 精品亚洲一区二区| 波多野结衣在线网址| 在线播放日韩| 国产欧美精品xxxx另类| 欧美一区二区三区黄片| 国产精品色噜噜| 分分操这里只有精品| 素人啪啪色综合| 亚洲成人av在线播放| 国产精品suv一区二区88| 国产精品夜夜夜| 91在线视频一区| 免费在线视频你懂得| 一区二区三区中文字幕电影| 99免费视频观看| 精品国产乱子伦一区二区| 日韩亚洲在线观看| www.久久精品视频| 盗摄精品av一区二区三区| 亚洲欧洲精品在线 | 亚洲成人av电影| 制服丝袜综合网| 九九在线精品| 97av在线视频| 不卡的日韩av| 一区二区中文字幕在线| 粉嫩虎白女毛片人体| 国产精品极品| 欧美人与性动交a欧美精品| 中文字幕一区2区3区| 久久综合色婷婷| av免费观看国产| 成人在线视频中文字幕| 欧美成人精品影院| 国产又大又长又粗| 国产精品嫩草影院com| 乱子伦视频在线看| 青青一区二区| 91国内精品久久| 欧美在线 | 亚洲| 亚洲自拍与偷拍| 亚洲欧美日韩中文字幕在线观看| 国内黄色精品| 国产精品1区2区在线观看| 清纯唯美亚洲色图| 欧美日韩亚洲视频一区| 亚洲久久久久久| 国产精品一区亚洲| 久久手机视频| 国产高清不卡| 亚洲午夜精品久久久久久性色 | 黑人极品ⅴideos精品欧美棵| 911国产精品| 色欲一区二区三区精品a片| 九九精品视频在线看| 中文字幕日韩一区二区三区| 日韩av黄色| 欧美男插女视频| 亚洲黄色小说网址| 亚洲成av人片一区二区三区| 久久久久国产精品无码免费看| 在线视频精品| 欧美日韩国产综合视频在线| 欧美成人精品三级网站| 中文字幕久热精品视频在线| 亚洲天堂狠狠干| 亚洲青青青在线视频| 欧美污在线观看| 日韩一区二区免费看| 免费国产在线精品一区二区三区| 波多野结衣亚洲| 日韩在线视频免费观看| 国产黄色一级大片| 亚洲mv在线观看| 巨胸大乳www视频免费观看| 日本三级亚洲精品| 亚洲小说欧美另类激情| 高清精品视频| 日本欧美在线视频| 欧美成人高清在线| 日韩欧美你懂的| 欧美一区二区三区四| 欧美激情一区二区三区全黄| 午夜免费福利视频在线观看| 欧美视频久久| 欧美国产综合视频| 伊人久久大香伊蕉在人线观看热v| 欧美成人一区在线| 视频三区在线观看| 欧美日韩大陆在线| 日本亚洲色大成网站www久久| 久久一日本道色综合| 永久免费的av网站| 在线观看亚洲| 亚洲精品无人区| 96sao在线精品免费视频| 日本人成精品视频在线| 精品176二区| 亚洲老司机av| 精品国产免费无码久久久| 欧美色另类天堂2015| 亚洲色图日韩精品| 99久久99久久精品国产片果冻| www.色偷偷.com| 黄色成人在线网址| 日韩女优中文字幕| aiai久久| 91青草视频久久| 日韩免费小视频| 97超碰国产精品女人人人爽| 欧美天天影院| 亚洲人成欧美中文字幕| 亚洲国产视频一区二区三区| 在线视频一区二区三| 国产精久久久久久| 国产精品成人一区二区三区夜夜夜| 亚洲av成人片无码| 狠狠网亚洲精品| 国产免费人做人爱午夜视频| 亚洲国产91| 伊人久久大香线蕉精品| 精品免费视频| 久久本道综合色狠狠五月| 国产一区二区三区| 国产精品久久久久久久久免费| a'aaa级片在线观看| 美日韩精品免费视频| 色三级在线观看| 亚洲欧美日韩区| 天天综合网在线观看| 日韩精品在线网站| 91精品国产乱码久久| 欧美视频自拍偷拍| av毛片在线免费观看| 天天操天天色综合| 日操夜操天天操| 亚洲一区二区三区四区在线观看 | 亚洲成人高清在线| 欧美国产精品一二三| 亚洲欧美日韩在线| 婷婷激情四射网| 亚洲天堂av老司机| 国产精品久久久免费看| 国产精品视频yy9299一区| 久久久视频6r| 中文字幕电影一区| 成人欧美一区二区三区黑人一| 日本一区二区综合亚洲| 性猛交ⅹxxx富婆video| 日本一区二区在线不卡| 国产探花视频在线播放| 欧美激情中文字幕| 黄色av片三级三级三级免费看| 国产精品网曝门| 永久免费看mv网站入口| 亚洲欧美二区三区| 在线免费观看亚洲视频| 亚洲精品第一国产综合野| 欧美性猛交xxxxx少妇| 亚洲一区二区三区小说| 午夜影院在线看| 色www精品视频在线观看| 国产成人精品亚洲| 欧美精品777| а√中文在线资源库| 亚洲国产精彩中文乱码av| 人妻一区二区三区四区| 亚洲人成电影网| 日本成人网址| 色在人av网站天堂精品| 国产乱码午夜在线视频| 日产精品久久久一区二区福利| 精品欧美日韩精品| 成人激情视频小说免费下载| 三级欧美日韩| 久久久久久草| 人人狠狠综合久久亚洲婷婷| 路边理发店露脸熟妇泻火| 在线成人欧美| 视色视频在线观看| 国产精品99久久不卡二区| 色婷婷精品久久二区二区密| 久久精子c满五个校花| 疯狂试爱三2浴室激情视频| 亚洲v中文字幕| 中文字幕一区二区在线视频| 日韩三级视频在线看| 四虎精品成人免费网站| 中国人与牲禽动交精品| 男女在线观看视频| 国产精品久久久久久亚洲调教| 久久伦理中文字幕| 欧美日韩精品中文字幕一区二区| 97精品一区| 成人免费观看cn| 麻豆精品精品国产自在97香蕉| 性生交大片免费看l| 久久久天堂av| 久久老司机精品视频| 欧美视频一区在线| 黄色av一区二区三区| 一本大道久久加勒比香蕉| 美女尤物在线视频| 国产欧美日韩视频| 任你弄精品视频免费观看| 一区二区三区四区久久| 久久九九国产| 91超薄肉色丝袜交足高跟凉鞋| 国产精品毛片a∨一区二区三区| 日韩av免费网址| 91精品国产91综合久久蜜臀| 国产露出视频在线观看| 欧美精品aaa| 精品视频在线一区| 色综合电影网| 翔田千里一区二区| 激情小说欧美色图| 亚洲图片激情小说| 亚洲精品一区二区二区| 日韩精品中文字幕久久臀| 亚洲小说区图片| 成人有码在线播放| 欧美色女视频| 国产精品欧美激情在线观看| 国产成+人+日韩+欧美+亚洲| 小泽玛利亚一区| 欧美日韩一区二区在线观看视频 | 2020最新国产精品| 一区二区三区国| 日本亚洲最大的色成网站www| 国产国语性生话播放| 亚洲动漫第一页| 亚洲AV无码精品自拍| 久久久国产视频| 青娱乐极品盛宴一区二区| 日本一区二区三区四区在线观看| 亚洲人成毛片在线播放女女| 亚洲成a人片在线www| 亚洲免费观看在线视频| 91麻豆成人精品国产| 最近中文字幕mv在线一区二区三区四区| 久久sese| 台湾成人av| 美女国产一区二区三区| 精品国产aaa| 欧美日韩国产另类不卡| aaa在线免费观看| 国产欧美精品一区二区三区-老狼| 九九热爱视频精品视频| 男人的天堂日韩| 国产欧美精品日韩区二区麻豆天美 | 成人看的视频| 色综合色综合色综合色综合| 国产精品久久久久久妇女6080| 在线免费观看日韩视频| 日韩视频免费大全中文字幕| 国产一区二区三区免费观看在线| 在线观看成人免费| 国产九九视频一区二区三区| 久久r这里只有精品| 亚洲成在人线av| 欧美成人影院| 亚洲欧洲日韩综合二区| 经典三级在线一区| 国产一级片免费观看| 亚洲精品成人av| 免费观看成人性生生活片| 亚洲欧美国产不卡| 国产高清精品在线| 国产香蕉视频在线| 国产一区二区久久精品| 日韩精品第二页| 波多野结衣与黑人| 99久久er热在这里只有精品15| 99久久久久久久久| 最新国产成人av网站网址麻豆| 成人动漫视频在线观看| 久青草视频在线播放| 久久先锋影音av鲁色资源网| 在线观看亚洲国产| 久久欧美在线电影| av中字幕久久| 国产清纯白嫩初高中在线观看性色| 精品女厕一区二区三区| 在线观看av黄网站永久| 97在线资源站| 午夜综合激情| 国产美女福利视频| 亚洲精品成人久久| 欧美aaaaaaaa| 999在线观看视频| 国产精品麻豆视频| 天堂av2024| 成人妇女淫片aaaa视频| 国产一区二区三区久久久久久久久 | 成人在线观看你懂的| 中文字幕欧美国产| 粉嫩av一区二区夜夜嗨| 国产精品久久在线观看| 在线免费观看日本欧美爱情大片| 国产精品无码久久久久一区二区|