当 xterm 指向相同的可执行文件时,为什么 xterm 的行为与 x-terminal-emulator 不同?

当 xterm 指向相同的可执行文件时,为什么 xterm 的行为与 x-terminal-emulator 不同?

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

参考

相关内容