web-dev-qa-db-ja.com

xtermが同じ実行可能ファイルを指している場合、x-terminal-emulatorとは異なる動作をする必要があるのはなぜですか?

lrwxrwxrwx1ルートルート14Apr 19 14:36/etc/Alternatives/x-terminal-emulator->/usr/bin/xterm

次の2つの呼び出しを使用して実行します。

  • /usr/bin/xterm
  • /etc/alternatives/x-terminal-emulator

最初は黒の背景で始まり、他は白で始まります。同じ構成ではない理由として考えられるものは何ですか?それをデバッグする方法は?

7
Rumca

Xリソース名は、ピリオドで区切られたコンポーネントのリストで構成されます。各コンポーネントは、インスタンス名またはクラス名のいずれかになります。インスタンスは特定のコンポーネント(たとえば、一番上の行の3番目のボタン)を識別し、クラスはコンポーネントのタイプ(たとえば、メインウィンドウのすべてのボタン)を識別します。慣例により、クラス名は大文字で始まり、インスタンス名は小文字で始まります。詳細については、 。Xresourcesファイルの作成に関する疑問 を参照するか、 Xドキュメント を参照してください。

リソース名の最初のコンポーネントはアプリケーションです。このレベルでは、クラス名は、アプリケーションの作成者が選択したアプリケーション名です。 Xtermの場合、それはXTermです(慣例により、X Fooと呼ばれるアプリケーションの場合、2番目の文字も大文字になります)。インスタンス名は、デフォルトでは、アプリケーションの起動に使用される実行可能ファイルの名前です。従来のXアプリケーションは、これらのデフォルト値をオーバーライドするために コマンドラインオプション-nameおよび-classをサポートしています。

シンボリックリンクを介してXtermを起動すると、実行可能ファイルの名前が変更されます(重要なのは使用する名前、より正確には呼び出しプロセスが渡す名前 argument 0)。したがって、インスタンス名(特に、リソースの検索に使用されます)が変更されます。 Xtermの呼び出しに使用される名前に関係なく設定を適用する場合は、クラスを介してリソースを定義します(~/.Xresourcesまたはそれらを配置するために選択したファイルで)。

XTerm.VT100.background:        Black

インスタンスを介してではなく(xterm.VT100.background)。

なぜ異なる動作をするのかわかりませんが、異なる名前で呼び出された場合、実行可能ファイルが「オーバーロード」されて異なる動作をすることがよくあります。

通常、プログラム内には、実行可能ファイルが呼び出された名前を決定し、その実行可能ファイル名に適切な機能を呼び出すcase/switchステートメントと呼ばれる構造があります。その名前は通常、プログラムが受け取る最初の引数です。たとえば、次のように書くとCになります。

_int main(int argc, char** argv)
_

_argv[0]_には、呼び出された実行可能ファイルの名前が含まれます。少なくとも、これはすべてのシェルの標準的な動作であり、引数を使用するすべての実行可能ファイルはそれを認識している必要があります。

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
_

参考文献

2
slm