man -H
總是在瀏覽器中打開一個不存在的文件
我正在嘗試使用該命令
/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 格式查看手冊頁的替代方法: