2011-09-15 48 views
0

「|」管道操作員將一個進程的stdout連接到另一個進程的stdin。有什麼辦法可以創建一個管道,將一個進程的stderr連接到另一個進程的stdin,使stdout保持在我的終端中?在互聯網上搜索給我沒有任何信息...如何使用管道將stderr連接到stdin?

謝謝你, Michalis。

回答

2

你可以使用命名管道:

mkfifo /my/pipe 
error-handler </my/pipe & 
do-something 2>/my/pipe 

這應該保持標準輸入&標準輸出「辦事情」,在你的終端UND stderr重定向到/我/管,這是「錯誤閱讀-handler」。

(我希望這項工作,沒有慶典測試)

2

如果你很高興混合 stdouot和標準錯誤,那麼你可以先重定向錯誤輸出到標準輸出,然後通過管道將:

theprogram 2>&1 | otherprogram 

如果你不想標準輸出,你可以殺死一個:

theprogram 2>&1 1> /dev/null | otherprogram 

如果你想保存原來的標準輸出爲好,那麼你必須把它要麼重定向到一個文件(代替/dev/null),或您與exec以前打開另一個文件描述符。 Here are some details.

(不幸的是沒有直接的「管這個文件描述符」語法像2|。這本來是方便。)

+0

非常感謝您的回答,但其實我的魔杖保持stdout的活動狀態並僅將stderr傳遞給其他進程。有沒有辦法來這樣的事情? –

+0

你的意思是你想打印stdout到控制檯嗎?您可以輕鬆地將它存儲在一個文件中......將其打印回控制檯,我不確定,您可能需要設置一些新的文件描述符並進行適當的重定向...檢查我發佈的鏈接。 –

+0

當然可以。這裏是實際的命令:'exec 3>&1; porc1 2>&1>&3 3>& - | proc2 3>& - ; exec 3>& - ' –

2

您也可以交換標準輸出& stderr流,我。即stdout成爲新的stderr,stderr成爲新的stdout)。

# only the stdout stream gets upcased 
ls -ld/xxx ~/.bashrc yyy 3>&1 1>&2 2>&3 3>&- | tr '[[:lower:]]' '[[:upper:]]' 

# block original stdout by closing fd 1 
ls -ld/xxx ~/.bashrc yyy 2>&1 1>&- | tr '[[:lower:]]' '[[:upper:]]' 
+0

FD 3是否已經存在,還是你必須先做出來? –

+0

+1,這正是我想到的:-) – w00t

2

你可以使用bash的進程替換功能得到這樣的效果:

somecommand 2> >(errorprocessor)