![当 xterm 指向相同的可执行文件时,为什么 xterm 的行为与 x-terminal-emulator 不同?](https://linux22.com/image/53348/%E5%BD%93%20xterm%20%E6%8C%87%E5%90%91%E7%9B%B8%E5%90%8C%E7%9A%84%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%E6%97%B6%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%20xterm%20%E7%9A%84%E8%A1%8C%E4%B8%BA%E4%B8%8E%20x-terminal-emulator%20%E4%B8%8D%E5%90%8C%EF%BC%9F.png)
lrwxrwxrwx 1 root root 14 Apr 19 14:36 /etc/alternatives/x-terminal-emulator -> /usr/bin/xterm
使用这两个调用运行它:
/usr/bin/xterm
/etc/alternatives/x-terminal-emulator
第一个从黑色背景开始,其他从白色开始。配置不一样的可能原因是什么?如何调试呢?
答案1
X 资源名称由一系列以句点分隔的组件组成。每个组件可以是实例名称或类名称。实例标识特定组件(例如顶行的第三个按钮),而类标识组件类型(例如主窗口中的所有按钮)。按照约定,类名称以大写字母开头,实例名称以小写字母开头。看对创建 .Xresources 文件的疑问。或阅读X 文档更多细节。
资源名称的第一个组成部分是应用程序。在此级别,类名是由应用程序作者选择的某些应用程序名称;对于 Xterm,就是XTerm
(按照惯例,对于名为 X Foo 的应用程序,第二个字母也大写)。默认情况下,实例名称是用于启动应用程序的可执行文件的名称。传统 X 应用程序支持命令行选项 -name
并-class
覆盖这些默认值。
当您通过符号链接启动 Xterm 时,这会更改可执行文件的名称(重要的是您使用的名称,或更准确地说是调用进程传入的名称)争论0)。因此,实例名称(在其他不太明显的事物中用于资源查找)发生了变化。如果您希望无论用于调用 Xterm 的名称如何,都应用您的设置,请~/.Xresources
通过类定义您的资源(在您选择放置它们的文件中或任何文件中),例如
XTerm.VT100.background: Black
而不是通过实例 ( )。xterm.VT100.background
答案2
我不知道为什么它的行为会有所不同,但通常可执行文件会“重载”,以不同的名称调用时会有不同的行为。
程序内部通常有一个称为 case/switch 语句的结构,它确定调用可执行文件的名称,然后为该可执行文件名称调用适当的功能。该名称通常是程序收到的第一个参数。例如,C
当你写:
int main(int argc, char** argv)
argv[0]
包含被调用的可执行文件的名称。至少,这是所有 shell 的标准行为,并且所有使用参数的可执行文件都应该意识到这一点。
Perl 中的示例
这是我用 Perl 编写的一个人为的示例,它也展示了该技术。
这是实际的脚本,调用它mycmd.pl
:
#!/usr/bin/perl
use feature ':5.10';
(my $arg = $0) =~ s#./##;
my $msg = "I was called as: ";
given ($arg) {
$msg .= $arg when 'ls';
$msg .= $arg when 'find';
$msg .= $arg when 'pwd';
default { $msg = "Error: I don't know who I am 8-)"; }
}
say $msg;
exit 0;
这是文件系统设置:
$ ls -l
total 4
lrwxrwxrwx 1 saml saml 8 May 24 20:49 find -> mycmd.pl
lrwxrwxrwx 1 saml saml 8 May 24 20:34 ls -> mycmd.pl
-rwxrwxr-x 1 saml saml 275 May 24 20:49 mycmd.pl
lrwxrwxrwx 1 saml saml 8 May 24 20:49 pwd -> mycmd.pl
现在,当我运行命令时:
$ ./find
I was called as: find
$ ./ls
I was called as: ls
$ ./pwd
I was called as: pwd
$ ./mycmd.pl
Error: I don't know who I am 8-)
如何调试?
strace
当使用不同的名称调用“应用程序”时,我会利用它来弄清楚正在使用哪些配置文件。
$ strace -s 2000 -o xterm.log /usr/bin/xterm
... after its launched ...
$ exit
然后再次运行它,如下所示:
$ strace -s 2000 -o emulator.log /etc/alternatives/x-terminal-emulator
... after its launched ...
$ exit
您需要查看open(...)
输出中的各个行,以将焦点缩小到它所调用的文件。
~/.Xresources 文件?
正如 @chepner 在评论中建议的那样,问题可能是由 ~/.Xresources 文件中的错误配置定义引起的。该文件允许您设置各种内容,例如使用的字体xterm
你可能有这样一行:
XTerm*background: black
XTerm*foreground: gray
XTerm*title: terminal
XTerm*saveLines: 1024
这些规则将被名称为 XTerm 的应用程序获取,但不会被任何其他应用程序(例如x-terminal-emulator
.规则也完全有可能是这样的:
xterm*reverseVideo: on
笔记:您可以强制重新加载此文件中的更改,如下所示:
$ xrdb -merge ~/.Xresources