3 回答

TA貢獻1821條經驗 獲得超5個贊
在用第一個Dup2
. (一般來說,使用dup2
關閉目標的功能是個壞主意,因為它不能從那里報告錯誤。)然后你可以把Dup2
它返回到int(os.Stderr.Fd())
(aka 2)。

TA貢獻1815條經驗 獲得超6個贊
誰能告訴我如何將 stderr 重定向回 bash 終端?
一般來說,這是不可能的,因為 Unix 程序可以在沒有任何終端的情況下啟動(或運行)。例如,它可以由crontab(5)作業啟動,或通過一些at
或ssh
命令等啟動。還可以考慮您的程序正在使用重定向或在管道中運行,或者您的程序正在服務器中運行(例如在一個數據中心);?那么它很可能沒有任何終端。
通常的做法是您的程序的用戶可能會重定向stderr
(并且可能不會重定向到終端,但更有可能重定向到某個文件)。您的用戶將為此目的使用其外殼yourprogram 2> /tmp/errorfile
(例如運行;閱讀關于重定向的文檔bash
)
終端是相當復雜的東西。您可以閱讀TTY demystified頁面。另請參見pty(7)和termios(3)。處理終端(在 Unix 上)的常用方法是使用ncurses庫(在 Go 中已包裝為goncurses)。
在我程序的其他地方,我調用了 syscall.Dup2(int(file.Fd()), int(os.Stderr.Fd())),它將 stderr 記錄到外部文件。
這真是個壞主意。您的用戶希望他/她的stderr保持不變(stderr
如果需要,會在他/她的 shell 中重定向)。按照慣例,您不應該在程序中弄亂標準流(讓它們保持原樣)。
文件描述符是一些小的正或零索引(進入進程的文件描述符表)。像dup2(2)這樣的系統調用需要有效的文件描述符,而 Gosyscall.Dup2
只是包裝dup2(2)。
在Linux上,可以通過查看目錄來查詢pid為1234的某個進程的文件描述符表/proc/1234/fd/
。有關更多信息,請參見proc(5)。
如果您絕對確定您的程序正在終端中運行,您可能會打開/dev/tty
它。但是,我不建議這樣做(因為您最好將程序設計為可在任何終端之外運行)。
出于日志記錄的目的,Go 提供了它的日志包。另請參閱syslog(3)和log/syslog
Go 的包。
附言。我不知道 Windows,但我相信它也可以在沒有任何終端的情況下啟動程序,例如作為后臺進程。因此,即使在 Windows 上,我也會盡量避免這樣做(將 stderr 重定向到終端)。

TA貢獻1828條經驗 獲得超4個贊
我不知道為什么,但syscall.Dup2(0,int(os.Stderr.Fd()))
將 panic stderr 返回到終端。
我對linux操作系統的了解很薄弱。0
所以我不明白在這種情況下和 linux 文檔中 的重要性。
另外,我還沒有在 Windows 機器上嘗試過這種方法,所以不確定那里會發生什么。我希望其他人能給出更好的答案。
- 3 回答
- 0 關注
- 210 瀏覽
添加回答
舉報