最近有個疑問,netstat -antup|head -500 類似這條命令中,是netstat 執行完然後截取前500條記錄還是,netstat 與head 並行執行,netstat 執行完500條就不再繼續?
最終答案由酷學園darkdanger大大提供:
唔,我先前都沒有想過這個問題呢....
查了一下再加上一些驗證後
我想管線命令的執行狀況大概是這樣:
1.
管線命令會觸發一個緩衝區(buffer)的建立,讓不同程式從中讀取、寫入資料
2.
管線最末端的程式結束時會觸發緩衝區停止擴充
3.
管線前端的程式則會因為無法再寫入至緩衝區、發生錯誤而終止
測試程式:
代碼: [選擇]
#!/usr/bin/python # -*- coding: utf-8 -*- import sys p = 0 txt = open("log.txt", "w") while p < int(sys.argv[1]): p = p + 1 txt.write("%d\n" % p) print(p) txt.close()程式列印 1000 次,儘管 head 後只顯示 5,但 log.txt 仍寫入了 1000 行:
代碼: [選擇]
./pipe_test.py 1000 |head -5程式列印 3000 次,出現 IOError,log.txt 內則寫入了 2680 行:
代碼: [選擇]
./pipe_test.py 3000 |head -5代碼: [選擇]
IOError: [Errno 32] Broken pipe若改寫成忽略 IOError:
代碼: [選擇]
#!/usr/bin/python # -*- coding: utf-8 -*- import sys p = 0 txt = open("log.txt", "w") while p < int(sys.argv[1]): p = p + 1 txt.write("%d\n" % p) try: print(p) except IOError as error: pass txt.close()則 log.txt 可以順利寫入到 3000 行