簡體   English   中英

使用 pipe 處理 STDERR 時出錯

[英]An error occurred while processing STDERR using the pipe

我的工作目錄如下:

MyWorkDirectory
└── test

文件“test”包含一行信息:

1:2:3:4:5

當我使用以下命令時:

cat test foo

output如下:

1:2:3:4:5
cat: foo: No such file or directory

我想忽略STDOUT只處理STDERR ,我想用 cut 命令得到第三個用“:”分隔的STDERR段,所以我嘗試了以下命令:

cat test foo 2>&1 1>/dev/null | cut -d ':' -f 3

我覺得這里的output應該是這樣的:

No such file or directory

但是,這里有很多不同的輸出:

一、

 1
No such file or directory

2、

 No such file or directory
3

3、

2

4、

...

為什么會產生這些輸出? 如果我想實現我的目標,我應該使用什么命令?

這里的問題是“多重重定向”。

The reason this can not be reproduced on Ubuntu, is because Ubuntu (like many Debian based Linux distros) uses Ash or Bash shell by default, while recent MacOS version switched to using ZSH.

Ubuntu 上的 ZSH 將給出與您得到的結果相似的結果。

顯然,同時使用重定向>和 pipe | 導致 ZSH 分裂你的stderr ,類似於tee命令。

這篇文章顯示了該問題的解決方案: https://unix.stackexchange.com/questions/265061/how-can-i-pipe-only-stderr-in-zsh

具體來說,您需要在將stdout重定向到/dev/null之前關閉它以防止拆分:

cat test foo 2>&1 >&- > /dev/null | cut -d ':' -f 3

這適用於 Ubuntu 上的 ZSH,並且應該適用於 Mac OS。
如果沒有,請檢查鏈接帖子以在 shell 中啟用mult_ios選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM