Por que o xterm se comporta de maneira diferente do emulador x-terminal quando aponta para o mesmo executável?

5

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

Execução usando estas duas chamadas:

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

Primeiro começa com fundo preto e outro começa com branco. Quais são as possíveis razões para que não seja a mesma configuração? Como depurar isso?

    
por Rumca 19.04.2014 / 14:58

2 respostas

3

Um nome de recurso X consiste em uma lista de componentes separados por períodos. Cada componente pode ser um nome de instância ou um nome de classe. As instâncias identificam um componente específico (por exemplo, o terceiro botão na linha superior), enquanto as classes identificam um tipo de componente (por exemplo, todos os botões na janela principal). Por convenção, os nomes das classes começam com uma letra maiúscula e os nomes das instâncias começam com uma letra minúscula. Consulte Dúvidas sobre a criação de um arquivo .Xresources. ou leia a documentação X para obter mais detalhes.

O primeiro componente de um nome de recurso é o aplicativo. Nesse nível, o nome da classe é um nome de aplicativo escolhido pelo autor do aplicativo; para o Xterm, isso é XTerm (por convenção, para aplicativos chamados X Foo, a segunda letra também é maiúscula). O nome da instância é, por padrão, o nome do arquivo executável usado para iniciar o aplicativo. Os aplicativos X convencionais suportam opções de linha de comando -name e -class para substituir esses valores padrão.

Quando você inicia o Xterm através de um link simbólico, isso altera o nome do arquivo executável (é o nome que você usa que importa, ou mais precisamente o nome que os processos chamadores passam em argumento 0). Assim, o nome da instância (usado, entre outras coisas menos visíveis, para pesquisa de recursos) é alterado. Se você quiser que suas configurações sejam aplicadas independentemente do nome usado para chamar o Xterm, defina seus recursos (em ~/.Xresources ou qualquer outro arquivo escolhido por você) por meio da classe, por exemplo,

XTerm.VT100.background:        Black

em vez da instância ( xterm.VT100.background ).

    
por 20.04.2014 / 01:40
2

Não sei por que ele se comportaria de maneira diferente, mas muitas vezes os executáveis são "sobrecarregados" para se comportarem de maneira diferente quando chamados com nomes diferentes.

Normalmente, há uma estrutura dentro do programa chamada instrução case / switch que determina o nome com o qual o executável foi chamado e, em seguida, chamará a funcionalidade apropriada para esse nome executável. Esse nome geralmente é o primeiro argumento que o programa recebe. Por exemplo, em C quando você escreve:

int main(int argc, char** argv)

argv[0] contém o nome do executável chamado. Pelo menos, esse é o comportamento padrão para todos os shells, e todos os executáveis que usam argumentos devem estar cientes disso.

Exemplo em Perl

Aqui está um exemplo artificial que eu coloquei em Perl, que mostra a técnica também.

Este é o script real, chame-o de 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;

Aqui está a configuração do sistema de arquivos:

$ 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

Agora, quando executo meus comandos:

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

Como depurar?

Eu usaria strace para descobrir quais arquivos de configuração estão sendo usados quando o "aplicativo" é chamado com os vários nomes.

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

Em seguida, execute-o novamente assim:

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

Você vai querer dar uma olhada nas várias linhas open(...) na saída para restringir o foco aos arquivos que está chamando.

~ / arquivo .Xresources?

Como @chepner sugeriu nos comentários, talvez o problema esteja sendo causado por uma definição de configuração errônea em seu arquivo ~ / .Xresources. Este arquivo permite que você defina várias coisas, como a fonte usada por xterm

Você provavelmente tem uma linha como esta:

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

Essas regras seriam selecionadas por aplicativos cujo nome é XTerm, mas não por outros aplicativos, como x-terminal-emulator . Também é totalmente possível que a regra seja assim:

xterm*reverseVideo: on

OBSERVAÇÃO: Você pode forçar as alterações neste arquivo a serem recarregadas da seguinte forma:

$ xrdb -merge ~/.Xresources

Referências

por 19.04.2014 / 15:36