我正在尝试使用现在久负盛名的tkdiff工具,但是遇到了一个障碍。我有两个Linux系统。第一个系统,一个Redhat EL 6.4工作站,运行tkdiff非常好——我可以整天diff文件。
在第二个系统,CentOS release 6.6服务器上,tkdiff失败,并显示以下堆栈跟踪:
Error in startup script:
while executing
"font actual system"
invoked from within
"set sysfont [font actual system]"
(file "<path...>/bin/tkdiff" line 122)
我不知道为什么它不给我一个错误信息之间的":"one_answers"while execution "…很奇怪。
我对这个很挠头,我试过一些东西,比如:
- 用
#!/usr/bin/wish
代替 - 将
package require Tk
语句更新到8.5 - 运行wish,然后从wish内部找到tkdiff:奇怪的是,这没有错误!但是这是不实际的,因为指定diff文件并以这种方式运行会非常麻烦。
!#/bin/sh
我猜我可能错过了一些其他依赖于我的CentOS服务器?
更新:
好吧,这绝对是一个依赖关系。我的大脑在细节上有点模糊,但我记得在从wish
提示采购时与仅运行脚本时存在一些微妙的差异,就错误处理而言。根似乎可能是缺少的字体依赖项,如本实验所示:
$ wish
% font actual system
% puts $errorInfo
while executing
"font actual system"
% puts $errorCode
NONE
%
显然它对font actual system
不满意。奇怪的是,$errorCode
就是NONE
。libXft和fontconfig包之前已经安装。我刚刚安装了以下额外的yum包:
xorg-x11-utils
libXv
libXxf86dga
libdmx
tk-devel (which installed fontconfig-devel and a bunch of other dependancies)
tcl-devel
TL;DR: X显示服务器(RHEL本地工作站)上的系统字体没有安装在运行wish的X客户端(CentOS服务器)上。
我认为问题是,至少在一定程度上,由于我在CentOS服务器上运行tkdiff
程序并通过X显示到我原来的RedHat工作站。我对根本原因(while executing "font actual system"
)进行了tcl堆栈跟踪,并使用它来缩小问题范围。在RedHat服务器上,我启动了wish并执行了该命令,得到了以下响应:
RedHat>$ wish
% font actual system
-family {DejaVu Sans} -size 12 -weight normal -slant roman -underline 0 -overstrike 0
%
我认为CentOS服务器,因为它是通过X显示到我的RHEL盒子,将试图使用相同的系统字体。通过快速搜索,我找到了适合这个字体的yum包,所以我安装了它。
sudo yum install dejavu-sans-mono-fonts
瞧!在CentOS上,我现在得到:
CentOS>$ wish
% font actual system
-family {DejaVu Sans Mono} -size 12 -weight normal -slant roman -underline 0 -overstrike 0
%
最终测试:tkdiff
现在运行良好!