我tkdiff
以 root 身份安装,并且在该用户下运行良好,但是当我切换到本地用户时,出现错误:
应用程序初始化失败:在以下目录中找不到可用的 init.tcl:
/usr/local/lib/tcl8.0 /pune/tools/synopsys/vera/2009.12-6/vera_vD-2009.12-6_linux/lib/tcl8 .0 /pune/tools/synopsys/vera/2009.12-6/tcl8.0/library /pune/tools/synopsys/vera/2009.12-6/vera_vD-2009.12-6_linux/library
这可能意味着 Tcl 没有正确安装。
启动脚本出错:执行“package require Tk 8.0”
时找不到软件包 Tk 8.0 (文件“./tkdiff”第 32 行)
我该如何解决?
答案1
TCL/Tk的安装从哪里来?它看起来像是与 Synopsys 捆绑在一起的,特别是他们的 Vera 软件。您真的打算将他们的 TCL/Tk 版本与 tkdiff 一起使用吗?
在我看来,这是一个$PATH
问题。您没有选择专tkdiff
为使用而构建的正确安装,而是使用 Synopsys 提供的安装。
tkdiff 包装
我使用的是 CentOS 5.8,并且我有以下软件包,可以从提供tkdiff
.
$ yum search tkdiff
Loaded plugins: fastestmirror
========================================================= Matched: tkdiff ==========================================================
tkcvs.noarch : Graphical interface to the CVS and Subversion
您可以使用以下命令确保可执行文件tkdiff
实际上是此包的一部分:
$ repoquery -l tkcvs | grep tkdiff
/usr/bin/tkdiff
该包依赖于以下其他包:
$ yum deplist tkcvs
Loaded plugins: fastestmirror
Finding dependencies:
package: tkcvs.noarch 8.2.2-1.el5.rf
dependency: /usr/bin/env
provider: coreutils.x86_64 5.97-34.el5_8.1
dependency: /bin/sh
provider: bash.x86_64 3.2-32.el5
provider: bash.x86_64 3.2-32.el5_9.1
dependency: tcl
provider: tcl.x86_64 8.4.13-6.el5
provider: tcl.i386 8.4.13-6.el5
dependency: tk
provider: tk.x86_64 8.4.13-5.el5_1.1
provider: tk.i386 8.4.13-5.el5_1.1
确认
$PATH
您可以通过暂时从您的 中删除 Synopsys 软件,然后尝试在tkdiff
不引用 Synopsys 的情况下启动来验证我的假设。
只需设置 $PATH 变量而不包含以下任何路径:
- /usr/local/lib/tcl8.0
- /pune/tools/synopsys/vera/2009.12-6/vera_vD-2009.12-6_linux/lib/tcl8.0
- /pune/tools/synopsys/vera/2009.12-6/tcl8.0/library
- /pune/tools/synopsys/vera/2009.12-6/vera_vD-2009.12-6_linux/library
还要确保$TCL
或$TCL*
类型变量也没有引用这些目录。
对 userA 有效,对 userB 无效,如何调试?
如果您遇到过这种情况:这对 userA 有效,但对 userB 无效,那么很可能是环境配置问题。为了调试这个,我会执行以下操作:
[userA]$ env > userA_env.txt
[userB]$ env > userB_env.txt
然后diff
这2个文件看看有什么不同:
$ diff -y userA_env.txt userB_env.txt | less
rvm_gemsets_path=/home/saml/.rvm/gemsets rvm_gemsets_path=/home/saml/.rvm/gemsets
MANPATH=/home/saml/apps/perl5/perlbrew/perls/perl-5.14.0/man: MANPATH=/home/saml/apps/perl5/perlbrew/perls/perl-5.14.0/man:
ORBIT_SOCKETDIR=/tmp/orbit-saml ORBIT_SOCKETDIR=/tmp/orbit-saml
rvm_scripts_path=/home/saml/.rvm/scripts rvm_scripts_path=/home/saml/.rvm/scripts
PERLBREW_VERSION=0.59 PERLBREW_VERSION=0.59
HOSTNAME=grinchy HOSTNAME=grinchy
rvm_bin_path=/home/saml/.rvm/bin rvm_bin_path=/home/saml/.rvm/bin
IMSETTINGS_INTEGRATE_DESKTOP=yes IMSETTINGS_INTEGRATE_DESKTOP=yes
GPG_AGENT_INFO=/tmp/keyring-Xewu2I/gpg:0:1 GPG_AGENT_INFO=/tmp/keyring-Xewu2I/gpg:0:1
PERLBREW_PERL=perl-5.14.0 PERLBREW_PERL=perl-5.14.0
...
左侧的条目将来自用户 A,右侧的条目将来自用户 B。
答案2
解决此类问题的常见捷径是以strace
root 身份运行程序时,grep 查找您作为用户(在您的情况下)遇到困难的文件,init.tcl
并使文件系统的该部分可供普通用户使用,而不仅仅是普通用户通过 root 通过chmod
.