Bash
無法使用管道處理標準輸出
我在 fifo 上執行 tshark,以下是一個簡單的循環範例,該循環列印 tshark 的輸出:
tshark -i $fifo | while read line; do echo $line done
當我向 tshark 添加過濾器時出現問題。
$line
此範例僅在 tshark 退出(隱藏 IP 地址)後列印所有s:tshark -i $fifo -T fields -e text -R ' ip.src == **.**.***.** && http.response.code == 200 && http.content_encoding == "gzip" && http.content_type contains "text/html" ' | while read line; do echo $line done
我嘗試過其他形式但沒有運氣:
while read line; do echo $line done < <(tshark ...) while read line; do echo $line done <<<"$(tshark ...)"
甚至 grep 也僅在 tshark 結束後列印行:
tshark ... | grep .
我嘗試在沒有管道的情況下執行 tshark,並且線條在出現時正確列印。為什麼管道後的命令只有在 tshark 退出後才被輸入?
附加細節:
| tee
有效,但是當 tshark 退出時,我會再次列印所有內容,所以這不是一個好交易。
檢查您的
[tshark](http://www.wireshark.org/docs/man-pages/tshark.html)
版本是否具有-l
(幾乎)行緩衝輸出的選項。
我能夠
stdbuf
從 coreutils 使用它。請注意,管道之後的每個命令也需要調整緩衝區:stdbuf -o 0 tshark -i $fifo -T fields -e text -R ' ip.src == **.**.***.** && http.response.code == 200 && http.content_encoding == "gzip" && http.content_type contains "text/html" ' | stdbuf -o 0 sed 's/\\r\\n,\?/\n/g; s/\\t/\t/g' |
從手冊頁:
`stdbuf': Run a command with modified I/O stream buffering (...) `-o MODE' `--output=MODE' Adjust the standard output stream buffering.