`man -H` 总是在浏览器中打开一个不存在的文件

`man -H` 总是在浏览器中打开一个不存在的文件

我尝试使用该命令/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 形式查看手册页的替代方法:

相关内容