
lrwxrwxrwx 1ルートルート14 4月19日14:36 /etc/alternatives/x-terminal-emulator -> /usr/bin/xterm
次の2つの呼び出しを使用して実行します。
/usr/bin/xterm
/etc/alternatives/x-terminal-emulator
最初は黒の背景で始まり、残りは白い背景で始まります。さまざまな構成が可能な理由は何ですか?これをデバッグする方法は?
答え1
Xリソース名は、ピリオドで区切られた一連のコンポーネントで構成されています。各コンポーネントはインスタンス名またはクラス名です。インスタンスは特定のコンポーネント(たとえば、一番上の行の3番目のボタン)を識別し、クラスはコンポーネントの種類(メインウィンドウのすべてのボタンなど)を識別します。通常、クラス名は大文字で始まり、インスタンス名は小文字で始まります。バラより.Xresources ファイルの作成に関する質問です。または読むX文書詳細については。
リソース名の最初のコンポーネントはアプリケーションです。このレベルでは、クラス名は Xterm の場合、アプリケーション作成者が選択したアプリケーション名です。言い換えれば、XTerm
X Fooという名前のアプリケーションでは、通常、2番目の文字も大文字で表示されます。デフォルトでは、インスタンス名はアプリケーションの起動に使用される実行可能ファイルの名前です。レガシー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]
呼び出される実行可能ファイルの名前を含みます。少なくともこれはすべてのシェルの標準的な動作であり、引数を使用するすべての実行可能ファイルはそれを認識する必要があります。
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