每当我升级我的一个 Linux 机器时(即安装我最喜欢的发行版的下一个版本),升级相应的配置文件总是非常耗时,因为在许多情况下,我不只是更改发行版的默认配置文件来反映我的情况,但我非常仔细地制作了自己的配置文件。
到现在为止,在升级时,在这些情况下,我要么完全从头开始阅读相应的手册页并从头开始制作新的配置文件(这很干净,但需要付出很多努力),或者我比较了(想想差异)旧的和新发行版的默认配置文件,当我看到可能很重要的差异时,我已将其“移植”(合并)到我自己的配置文件中(由于多种原因,我对这种方法不满意,其中之一是维护者可以忽略一个新的配置指令,在我的情况下忽略它可能是危险的;但如果我赶时间,它并不总是可以避免的)。
我一直问自己其他人是如何解决这个问题的。一种想法是将旧版本软件的手册页与新版本的手册页进行比较,从而立即看到配置指令或方法的所有差异。
所以问题是:有人知道手册页的特定差异查看器,特别是文本控制台(主要场景是通过 SSH 工作而不使用 X)吗?
请注意,我知道有很多不同的查看器(我已经阅读了数十篇关于此主题的文章和问答)。我的问题特别是关于手册页的差异查看器,它提供了一些安慰(例如,你告诉它旧手册页的基本目录,然后只需要说“show diff sshd_config”等)。
我也知道我最终可以读取相应上游的更改日志,但是我看到许多您不能依赖它的情况(即那里没有提到所有更改),它更不方便,并且一些发行版很严重修补上游,所以我会说这不是一个真正的选择。将旧版本的源代码与新版本的源代码进行比较,只是为了找出新的配置选项似乎太过分了,而且对于 Apache、Sendmail 等来说,这可能是不可能的。相比之下,比较手册页似乎是合理的(如果可能的话)。
有任何想法吗?
手册页一旦更改为人类可读的形式,就是文本文件,您可以使用适合您的任何工具对其进行区分。这里有两个例子,作为两个bash
函数,用于两个工具:diff
和vimdiff
。使它们适应您最喜欢的工具。
与vimdiff
:
vimdiff_man() { vimdiff -R <(man --manpath="/old/path/to/man" "$1") <(man "$1"); }
Run Code Online (Sandbox Code Playgroud)
随着diff
,并排,调整到你的屏幕宽度:
diff_man() (
width="${COLUMNS:-80}"
export MANWIDTH=$((width / 2 - 2))
diff -y -W"$width" <(man --manpath="/old/path/to/man" "$1") <(man "$1") | less
)
Run Code Online (Sandbox Code Playgroud)
在每个函数中,我在两个伪文件之间进行比较<(...)
,每个伪文件都包含man
括号之间的命令结果(这是bash 的 Process Substitution)。
/old/path/to/man
是包含旧手册页的目录层次结构。预计与您的主要手册目录(可能)具有相同的二级 man 级别man1
, man2
, ... /usr/share/man
。更改它以满足您的需求。
用法:
diff_man sshd_config
vimdiff_man sshd_config
Run Code Online (Sandbox Code Playgroud)