「|」管道操作員將一個進程的stdout連接到另一個進程的stdin。有什麼辦法可以創建一個管道,將一個進程的stderr連接到另一個進程的stdin,使stdout保持在我的終端中?在互聯網上搜索給我沒有任何信息...如何使用管道將stderr連接到stdin?
謝謝你, Michalis。
「|」管道操作員將一個進程的stdout連接到另一個進程的stdin。有什麼辦法可以創建一個管道,將一個進程的stderr連接到另一個進程的stdin,使stdout保持在我的終端中?在互聯網上搜索給我沒有任何信息...如何使用管道將stderr連接到stdin?
謝謝你, Michalis。
你可以使用命名管道:
mkfifo /my/pipe
error-handler </my/pipe &
do-something 2>/my/pipe
這應該保持標準輸入&標準輸出「辦事情」,在你的終端UND stderr重定向到/我/管,這是「錯誤閱讀-handler」。
(我希望這項工作,沒有慶典測試)
如果你很高興混合 stdouot和標準錯誤,那麼你可以先重定向錯誤輸出到標準輸出,然後通過管道將:
theprogram 2>&1 | otherprogram
如果你不想標準輸出,你可以殺死一個:
theprogram 2>&1 1> /dev/null | otherprogram
如果你想保存原來的標準輸出爲好,那麼你必須把它要麼重定向到一個文件(代替/dev/null
),或您與exec
以前打開另一個文件描述符。 Here are some details.
(不幸的是沒有直接的「管這個文件描述符」語法像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:]]'
FD 3是否已經存在,還是你必須先做出來? –
+1,這正是我想到的:-) – w00t
你可以使用bash的進程替換功能得到這樣的效果:
somecommand 2> >(errorprocessor)
非常感謝您的回答,但其實我的魔杖保持stdout的活動狀態並僅將stderr傳遞給其他進程。有沒有辦法來這樣的事情? –
你的意思是你想打印stdout到控制檯嗎?您可以輕鬆地將它存儲在一個文件中......將其打印回控制檯,我不確定,您可能需要設置一些新的文件描述符並進行適當的重定向...檢查我發佈的鏈接。 –
當然可以。這裏是實際的命令:'exec 3>&1; porc1 2>&1>&3 3>& - | proc2 3>& - ; exec 3>& - ' –