当前位置: 首页 > Linux

为什么手册页标题上有两条DATE(1)痕迹

时间:2023-04-06 05:36:38 Linux

为什么标题上有两个DATE(1)跟踪进程?我们通过man-awdate得到/usr/share/man/man1/date.1.gz,用zcat观察zcat/usr/share/man/man1/date.1.gz|less可以看到第一行是。\"不要修改这个文件!它是由help2man1.47.3..THDATE"1""February2017""GNUcoreutils8.25""UserCommands".SHNAMEdate\-打印或设置系统日期和time.SHSYNOPSIS.Bdate[\fI\,OPTION\/\fR]...[\fI\,+FORMAT\/\fR].br.Bdate.....here.THDATE"1"是DATE(1)的来源,但为什么是两个?继续挖掘并使用grep过滤zcat/usr/share/man/man1/date.1.gz|grep'DATE\"1\"'只搜索一行输出findmansource$whichman/usr/bin/man$dpkg--search/usr/bin/manman-db:/usr/bin/man$apt-getsourceman-db经过一天的疯狂阅读,我发现man-db使用管道,格式化和最终输出调用都是外部命令/*Returnpipelinetoformatfiletostdout。constchar*dbfilters,char**result_encoding)...从这个函数的内容可以发现主要调用roff/nroff/troff/groff这组格式化命令来完成。创建一个小文件a.txt,包含以下内容.THMAN72012-08-05"Linux""LinuxProgrammer'sManual".SHNAMEman\-macrostoformatmanpagesTryitwithgroff$groff-mandoc-Tasciia.txt输出如下MAN(7)LinuxProgrammer's手册MAN(7)NAMEman-用于格式化手册页的宏Linux2012-08-05MAN(7)确实是我想要的。使用strace查看调用进程是否还在pipecalling....下载groff源$apt-getsourcegroff发现可以使用-V参数查看管道命令$groff-V-mandoc-Tasciia。txttroff-mandoc-Tasciia.txt|grotty单独执行trofftroff-mandoc-Tasciia.txt得到xTasciixres2402440xinitp1xXtty:sgr0xfont1Rf1s10V40H0mdDFdtMAN(7)h504tLinuxwh24tProgrammer'swh24tManualh480tMAN(7)...从这里,我们可以看到MAN(7),在a.txt中只出现一次,输出了两次。troff源码分析troff源码也在groff包中。搜索源码没有找到直接处理.TH标记的地方,发现troff与man的宏有关。troff和宏命令manmacros通过以下命令获取troff在运行过程中打开的.tmac宏File$stracetroff-mandoc-Tascii~/a.txt2>&1|grep-vsuch|greptmac输出如下open("/usr/share/groff/1.22.3/tmac/troffrc",O_RDONLY)=3open("/usr/share/groff/1.22.3/tmac/composite.tmac",O_RDONLY)=4open("/usr/share/groff/1.22.3/tmac/fallbacks.tmac",O_RDONLY)=4open("/usr/share/groff/1.22.3/tmac/tty.tmac",O_RDONLY)=4open("/usr/share/groff/1.22.3/tmac/hyphen.us",O_RDONLY)=4open("/usr/share/groff/1.22.3/tmac/hyphenex.us",O_RDONLY)=4open("/usr/share/groff/1.22.3/tmac/papersize.tmac",O_RDONLY)=4open("/usr/share/groff/1.22.3/tmac/pspic.tmac",O_RDONLY)=4open("/usr/share/groff/1.22.3/tmac/andoc.tmac",O_RDONLY)=3open("/usr/share/groff/1.22.3/tmac/troffrc-end",O_RDONLY)=3open("/usr/share/groff/1.22.3/tmac/an-old.tmac",O_RDONLY)=4open("/usr/share/groff/1.22.3/tmac/devtag.tmac",O_RDONLY)=5open("/usr/share/groff/1.22.3/tmac/an-ext.tmac",O_RDONLY)=5open("/usr/share/groff/site-tmac/man.local",O_RDONLY)=5在对应目录下只找到少量和.TH处理相关的片段/usr/share/groff/1.22.3/tmac$grep-wTH-R*andoc.tmac:.alsTHreload-manandoc.tmac:.rmTHandoc.tmac:\\*[TH]\\andoc.tmac:.alsTHreload-manandoc.tmac:.\"dummyequationmacros--eqnrcisbeforereadbefore.THor.Ddisparsedan-old.tmac:.\"如果你需要添加东西到TH,使用`.am1TH'.an-old.tmac:.\".THtitlesectionextra1extra2extra3an-old.tmac:这里详细介绍TH.tmac文件格式:doc.tmac主要手册宏包mdoc.tmac对doc.tmac的封装调用mdoc/doc-common打印输出相关的常用字符串、定义和内容,mdoc/doc-nroff用于定义TTY设备输出,mdoc/doc-ditroff用于定义其他设备输出,mdoc.local与本地补充相关和自定义andoc.tmac如果你纠结是用-mdoc还是-man包,就用这个吧。真相终于在an-old.tmac定义的宏中一层层找到了这一行:259.de1PT260。tl'\\*[an-title](\\*[an-section])'\\*[an-extra3]'\\*[an-title](\\*[an-section])'261..编辑并保存,果然。tl'\\*[an-title](\\*[an-section])'\\*[an-extra3]'[尤里卡!]\\*[an-title](\\*[an-section])'截图留念这里是man-db和相关的中文文档。