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

sma*_*c89 4 man browser man-db

我正在尝试使用命令 /usr/bin/man -H 3 free在浏览器中打开联机帮助页,但是每次运行该命令时,浏览器都会打开一个不存在的文件,当然该页面无法显示。

我究竟做错了什么?

我的man命令由man-db

fra*_*san 8

至少在我的系统(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
Run Code Online (Sandbox Code Playgroud)

sleep在文件被删除之前给 Firefox 加载页面的时间;当然,重新加载它是不可能的)。

或者,如果您愿意实现自己的删除临时 HTML 文件的机制:

BROWSER='cp %s /path/to/file.html; firefox /path/to/file.html' man -H 3 free
Run Code Online (Sandbox Code Playgroud)

(这会忽略可能与主.html文件一起生成的其他资产,因此可能会错误地呈现)。

或者,如果您可以保留临时目录(例如,您没有生成很多临时目录,您的目录/tmp是不稳定的,并且您的系统已足够定期重新启动):

BROWSER='firefox %s && false' man -H 3 free
Run Code Online (Sandbox Code Playgroud)

(浏览器命令返回错误时不会删除临时目录man;作为一个缺点,会打印错误消息,因为man认为浏览器无法打开)。

另请注意,TMP环境变量可用于告诉man在哪里创建其临时数据。

最后,所选的解决方法可以方便地按照以下方式制作为别名或函数:

alias man='BROWSER="${BROWSER:-firefox} %s && false" man'
Run Code Online (Sandbox Code Playgroud)

另请参阅以 HTML 格式查看手册页的替代方法: