2016-04-26 85 views
2

我的用戶不必爲STDERR寫權限:寫入STDERR的文件名,即使無法寫入用戶

[email protected]:~> readlink -e /dev/stderr 
/dev/pts/19 
[email protected]:~> ls -l /dev/pts/19 
crw--w---- 1 sysuser tty 136, 19 Apr 26 14:02 /dev/pts/19 

這通常不是一個大問題,

echo > /dev/stderr 

失敗

-bash: /dev/stderr: Permission denied 

但通常重定向像

echo >&2 

工作正常。

但是我現在需要應對第三方二進制文件,只提供日誌輸出到指定的文件:

./utility --log-file=output.log 

我想直接看到STDERR日誌輸出。

由於缺少寫入權限,我無法像--log-file=/dev/stderr那樣使用簡單的方法。在設置了寫入權限的其他系統上,這種方式可以正常工作。

此外,我還需要解析輸出到STDOUT的過程,因此我不能簡單地發送日誌到STDOUT,然後重定向到STANDR >&2。我嘗試使用script實用程序(其中重定向到/dev/stderr可正常工作),但它同時也將STDOUT和STDERR合併在一起。

+0

什麼是殼的標準錯誤連接,使得它的工作原理? –

+1

爲什麼你的stderr這樣你不能寫信給它?這是不尋常的 - 不是不可能的,但不尋常的。 –

+0

與Jonathan達成一致,我可以每天'echo>/dev/stderr' – SaintHax

回答

3

您可以使用bash進程替換:

./utility --log-file=>(cat>&2) 

的替代會出現像--log-file=/dev/fd/63的效用,可以打開。進程cat繼承fd 2而不需要打開它,因此它可以進行轉發。

我使用chmod -w /dev/stderrdd if=/etc/issue of=/dev/stderr測試了上述內容。這失敗了,但更改爲dd if=/etc/issue of=>(cat>&2)成功。

請注意,您的錯誤輸出可能會遭受比您想要的更多的緩衝,並且不會與您的shell提示符同步。換句話說,在utility完成之後,您的提示可能會出現錯誤輸出,並顯示在您的終端上。 dd示例可能會證明這一點。 您可能希望在命令後追加;wait,以確保出現在你PS1提示cat已完成:./utility --log-file=>(cat>&2); wait