亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將 stderr 恐慌重定向回終端

將 stderr 恐慌重定向回終端

Go
MYYA 2023-05-22 17:23:12
我正在嘗試使用以下代碼將恐慌/標準錯誤重定向回 bash 終端:    if err := syscall.Dup2(-1,int(os.Stderr.Fd())); err != nil {       log.Fatalf("Failed to redirect stderr to bash: %v",err)     }但是錯誤給了我一個“錯誤的文件描述符”,可能是因為-1我在第一個參數中使用了。我選擇這個值是-1因為我發現它int(file.(*os.File).Fd())返回了一個-1when file.Close()has been called。至于我想做什么。在我的程序的其他地方,我調用了一個syscall.Dup2(int(file.Fd()), int(os.Stderr.Fd())),它將 stderr 記錄到一個外部文件中。但有時我希望 stderr 指向 bash 終端。https://golang.org/pkg/syscall/沒有給出 syscall.Dup2 的詳細解釋。我開始研究 file.Fd() 返回什么以及它是如何使用的,但也沒有完全理解。誰能告訴我如何將 stderr 重定向回 bash 終端?
查看完整描述

3 回答

?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

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



查看完整回答
反對 回復 2023-05-22
?
紅糖糍粑

TA貢獻1815條經驗 獲得超6個贊

誰能告訴我如何將 stderr 重定向回 bash 終端?

一般來說,這是不可能的,因為 Unix 程序可以在沒有任何終端的情況下啟動(或運行)。例如,它可以由crontab(5)作業啟動,或通過一些atssh命令等啟動。還可以考慮您的程序正在使用重定向或在管道中運行,或者您的程序正在服務器中運行(例如在一個數據中心);?那么它很可能沒有任何終端。

通常的做法是您的程序的用戶可能會重定向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/syslogGo 的包。

附言。我不知道 Windows,但我相信它也可以在沒有任何終端的情況下啟動程序,例如作為后臺進程。因此,即使在 Windows 上,我也會盡量避免這樣做(將 stderr 重定向到終端)。


查看完整回答
反對 回復 2023-05-22
?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊

我不知道為什么,但syscall.Dup2(0,int(os.Stderr.Fd()))將 panic stderr 返回到終端。

我對linux操作系統的了解很薄弱。0所以我不明白在這種情況下和 linux 文檔中 的重要性。

另外,我還沒有在 Windows 機器上嘗試過這種方法,所以不確定那里會發生什么。我希望其他人能給出更好的答案。


查看完整回答
反對 回復 2023-05-22
  • 3 回答
  • 0 關注
  • 210 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號