Warum sollte sich xterm anders verhalten als x-terminal-emulator, wenn es auf dieselbe ausführbare Datei verweist?

7

lrwxrwxrwx 1 root root 14 Apr 19 14:36 ​​/ etc / alternatives / x-terminal-emulator -> / usr / bin / xterm

Ausführen mit diesen 2 Aufrufen:

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

Beginnt zuerst mit schwarzem Hintergrund und andere mit Weiß. Was sind mögliche Gründe dafür, dass es sich nicht um dieselbe Konfiguration handelt? Wie kann ich es debuggen?

Rumca
quelle
Können Sie versuchen, x-terminal-emulatormit dem Texteditor zu öffnen , um zu überprüfen, ob es sich nicht um eine ausführbare Bash-Datei oder ähnliches handelt?
Phoops

Antworten:

5

Ein X-Ressourcenname besteht aus einer Liste von Komponenten, die durch Punkte getrennt sind. Jede Komponente kann entweder ein Instanzname oder ein Klassenname sein. Instanzen identifizieren eine bestimmte Komponente (z. B. die dritte Schaltfläche in der oberen Reihe), während Klassen einen Komponententyp identifizieren (z. B. alle Schaltflächen im Hauptfenster). Konventionell beginnen Klassennamen mit einem Großbuchstaben und Instanznamen mit einem Kleinbuchstaben. Siehe Zweifel beim Erstellen einer .Xresources-Datei. oder lesen Sie die X-Dokumentation für weitere Details.

Die erste Komponente eines Ressourcennamens ist die Anwendung. Auf dieser Ebene gibt der Klassenname einen Anwendungsnamen an, der vom Autor der Anwendung ausgewählt wurde. für Xterm ist das XTerm( gemäß Konvention wird für Anwendungen mit dem Namen X Foo auch der zweite Buchstabe groß geschrieben). Der Instanzname ist standardmäßig der Name der ausführbaren Datei, die zum Starten der Anwendung verwendet wird. Herkömmliche X-Anwendungen unterstützen Befehlszeilenoptionen -name und -classdas Überschreiben dieser Standardwerte.

Wenn Sie Xterm über einen symbolischen Link starten, ändert sich dadurch der Name der ausführbaren Datei (es ist der Name, den Sie verwenden, oder genauer der Name, den der aufrufende Prozess in Argument 0 übergibt ). Daher ändert sich der Instanzname (der unter anderem für die Ressourcensuche verwendet wird). Wenn Sie möchten, dass Ihre Einstellungen unabhängig vom Namen angewendet werden, der zum Aufrufen von Xterm verwendet wird, definieren Sie Ihre Ressourcen (in ~/.Xresourcesoder in einer beliebigen Datei, die Sie zum Einfügen ausgewählt haben) in der Klasse, z

XTerm.VT100.background:        Black

statt durch die Instanz ( xterm.VT100.background).

Gilles 'SO - hör auf böse zu sein'
quelle
2

Ich weiß nicht, warum es sich anders verhalten würde, aber oft sind ausführbare Dateien "überladen", um sich anders zu verhalten, wenn sie mit unterschiedlichen Namen aufgerufen werden.

Das Programm enthält normalerweise eine Struktur namens case / switch-Anweisung, die den Namen bestimmt, mit dem die ausführbare Datei aufgerufen wurde, und dann die entsprechende Funktionalität für diesen ausführbaren Namen aufruft. Dieser Name ist normalerweise das erste Argument, das das Programm erhält. Zum Beispiel Cbeim Schreiben:

int main(int argc, char** argv)

argv[0]enthält den Namen der aufgerufenen ausführbaren Datei. Zumindest ist dies das Standardverhalten für alle Shells, und alle ausführbaren Dateien, die Argumente verwenden, sollten sich dessen bewusst sein.

Beispiel in Perl

Hier ist ein erfundenes Beispiel, das ich in Perl zusammengestellt habe und das auch die Technik zeigt.

Hier ist das eigentliche Skript, nennen Sie es 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;

Hier ist das Dateisystem-Setup:

$ 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

Wenn ich jetzt meine Befehle ausführe:

$ ./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-)

Wie debuggen?

Ich würde verwenden, straceum herauszufinden, welche Konfigurationsdateien verwendet werden, wenn die "Anwendung" mit den verschiedenen Namen aufgerufen wird.

$ strace -s 2000 -o xterm.log /usr/bin/xterm
... after its launched ...
$ exit

Führen Sie es dann erneut wie folgt aus:

$ strace -s 2000 -o emulator.log /etc/alternatives/x-terminal-emulator
... after its launched ...
$ exit

Sie sollten sich die verschiedenen open(...)Zeilen in der Ausgabe ansehen, um den Fokus auf die Dateien zu beschränken, die aufgerufen werden.

~ / .Xresources Datei?

Wie @chepner in den Kommentaren vorgeschlagen hat, wird das Problem möglicherweise durch eine fehlerhafte Konfigurationsdefinition in Ihrer ~ / .Xresources-Datei verursacht. In dieser Datei können Sie verschiedene Einstellungen vornehmen, z. B. die vonxterm

Sie haben wahrscheinlich eine Zeile wie diese:

XTerm*background: black
XTerm*foreground: gray
XTerm*title: terminal
XTerm*saveLines: 1024

Diese Regeln würden von Anwendungen übernommen, deren Name XTerm ist, aber nicht von anderen Apps wie x-terminal-emulator. Es ist auch durchaus möglich, dass die Regel stattdessen so aussieht:

xterm*reverseVideo: on

HINWEIS: Sie können das erneute Laden von Änderungen in dieser Datei wie folgt erzwingen:

$ xrdb -merge ~/.Xresources

Verweise

slm
quelle
Dies ist nützlich, aber in diesem speziellen Fall scheint es schwieriger zu sein. diff <(grep open xterm.log) <(grep open emulator.log)zeigt 0 Ergebnisse. Außerdem haben beide Zeichenfolgen xterm*ReverseVideo=on(und keine anderen ähnlichen Übereinstimmungen).
Rumca
2
Es ist schon eine Weile her, dass ich mich mit X-Ressourcen befasst habe, aber ich denke xterm*ReverseVideo=on, dies gilt nur für Programme, deren Namen mit beginnen xterm. x-term-emulatorhat x-termnicht xtermals Präfix, daher wird diese Ressource nicht verwendet.
Chepner