我尝试使用该命令/usr/bin/man -H 3 free
在浏览器中打开联机帮助页,但每次运行该命令时,浏览器都会打开一个不存在的文件,当然该页面无法显示。
我究竟做错了什么?
我的man
命令由提供man-db
答案1
至少在我的系统(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 形式查看手册页的替代方法: