Man

man -H 總是在瀏覽器中打開一個不存在的文件

  • April 28, 2021

我正在嘗試使用該命令/usr/bin/man -H 3 free在瀏覽器中打開手冊頁,但是每次執行該命令時,瀏覽器都會打開一個不存在的文件,當然該頁面無法顯示。

我究竟做錯了什麼?

我的man命令由man-db

至少在我的系統(Arch Linux,man-db 2.9.4,Firefox 88.0)中,man創建一個臨時目錄/tmp/,將生成的 HTML 文件寫入其中,使用 HTML 文件作為參數呼叫瀏覽器,當瀏覽器程序退出,刪除臨時目錄(我猜是為了清理東西)。

雖然這對某些瀏覽器(例如​​ Lynx)沒有問題,但其他瀏覽器可能會出現競爭情況(在我的情況下是 Firefox;我還簡要測試了 Chromium,得到了類似的結果)。據我所知,如果man打開一個新的瀏覽器視窗,HTML 文件就會正確打開。另一方面,如果手冊頁在現有瀏覽器視窗中作為新選項卡打開,則啟動的瀏覽器程序man會提前返回,並且當其他瀏覽器程序嘗試讀取該文件時,該文件已經消失。

我看不到任何man旨在防止臨時 HTML 文件被刪除的選項。但是,請注意-H/--html選項的參數(或等效地,BROWSER環境變數的值)可以是 shell 命令,快速解決方法可能是:

BROWSER='firefox %s; sleep 5' man -H 3 free

sleep讓 Firefox 有時間在文件被刪除之前載入頁面;當然,重新載入它是不可能的)。

或者,如果您願意實現自己的機制來刪除臨時 HTML 文件:

BROWSER='cp %s /path/to/file.html; firefox /path/to/file.html' man -H 3 free

(這會忽略可能與主.html文件一起生成的其他資產,因此可能會被錯誤地渲染)。

或者,如果您可以很好地保留臨時目錄(例如,您不會生成大量臨時目錄,那麼您的目錄/tmp是不穩定的,並且您的系統會定期重新啟動):

BROWSER='firefox %s && false' man -H 3 free

(當瀏覽器命令返回錯誤時,臨時目錄不會被刪除man;作為缺點,會列印錯誤消息,因為man認為無法打開瀏覽器)。

另請注意,TMP環境變數可用於告知man在何處創建其臨時數據。

最後,選​​擇的解決方法可以方便地製作成別名或函式,如下所示:

alias man='BROWSER="${BROWSER:-firefox} %s && false" man'

另請參見以 HTML 格式查看手冊頁的替代方法:

引用自:https://unix.stackexchange.com/questions/646928