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