Pourquoi xterm se comporte-t-il différemment de l'émulateur x-terminal lorsqu'il pointe vers le même exécutable?

lrwxrwxrwx 1 racine racine 14 Apr 19 14:36 ​​/ etc / alternatives / émulateur x-terminal -> / usr / bin / xterm

Exécuter en utilisant ces 2 appels:

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

Le premier commence par un fond noir et d'autres commencent par le blanc. Quelles sont les raisons possibles que ce n'est pas la même configuration? Comment le déboguer?

Un nom de ressource X est constitué d'une list de composants séparés par des points. Chaque composant peut être un nom d'instance ou un nom de class. Les instances identifient un composant spécifique (par exemple le troisième button de la rangée supérieure) pendant que les classs identifient un type de composants (par exemple, tous les buttons de la window principale). Par convention, les noms de class commencent par une lettre majuscule et les noms d'instance commencent par une lettre minuscule. Voir Doutes sur la création d'un file .Xresources. ou lire la documentation X pour plus de détails.

Le premier composant d'un nom de ressource est l'application. A ce niveau, le nom de la class utilise un nom d'application choisi par l'auteur de l'application; pour Xterm, c'est XTerm (par convention, pour les applications appelées X Foo, la seconde lettre est aussi en majuscule). Le nom d'instance est, par défaut, le nom du file exécutable utilisé pour lancer l'application. Les applications X classiques prennent en charge les options de command line -name et -class pour replace ces valeurs par défaut.

Lorsque vous démarrez Xterm via un lien symbolique, cela change le nom du file exécutable (c'est le nom que vous utilisez qui importe ou plus précisément le nom que les process appelant transmettent dans l' argument 0). Ainsi, le nom de l'instance (utilisé, entre autres choses less visibles, pour la search de ressources) change. Si vous souhaitez que vos parameters s'appliquent quel que soit le nom utilisé pour invoquer Xterm, définissez vos ressources (dans ~/.Xresources ou le file que vous avez choisi) dans la class, par exemple

 XTerm.VT100.background: Black 

au lieu de passer par l'instance ( xterm.VT100.background ).

Je ne sais pas pourquoi il se comporte différemment, mais souvent les exécutables sont «surchargés» de se comporter différemment lorsqu'ils sont appelés avec des noms différents.

Il y a typiquement une structure à l'intérieur du programme appelée une instruction case / switch qui détermine le nom avec lequel l'exécutable a été appelé, puis appelle la fonctionnalité appropriée pour ce nom d'exécutable. Ce nom est généralement le premier argument que le programme reçoit. Par exemple, dans C quand vous écrivez:

 int main(int argc, char** argv) 

argv[0] contient le nom de l'exécutable appelé. Au less, c'est le comportement standard pour tous les shells, et tous les exécutables qui utilisent des arguments devraient en être conscients.

Exemple en Perl

Voici un exemple artificiel que j'ai mis en place en Perl qui montre également la technique.

Voici le script réel, appelez-le 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; 

Voici la configuration du système de files:

 $ 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 

Maintenant, quand je cours mes commands:

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

Comment déboguer?

Je voudrais utiliser strace pour comprendre quels files de configuration sont utilisés lorsque l'application est appelée avec les différents noms.

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

Puis lancez-le comme ceci:

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

Vous aurez envie de jeter un coup d'oeil sur les différentes lignes open(...) de la sortie pour limiter le focus aux files sur lesquels il appelle.

~ / .Xresources file?

Comme @chepner suggéré dans les commentaires peut-être le problème est provoqué par une définition de configuration errante dans votre file ~ / .Xresources. Ce file vous permet de définir diverses choses telles que la police utilisée par xterm

Vous avez probablement une ligne comme celle-ci:

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

Ces règles seraient récupérées par les applications dont le nom est XTerm mais pas par d'autres applications telles que x-terminal-emulator . Il est également possible que la règle ressemble à ceci:

 xterm*reverseVideo: on 

REMARQUE: vous pouvez forcer les modifications de ce file à recharger comme ceci:

 $ xrdb -merge ~/.Xresources 

Les references

  • Le (non-) secret de .Xdefaults (ou plutôt, .Xresources)
  • Vidéo Reverse XTerm (Noir sur Blanc / Blanc sur Noir)