xterm이 동일한 실행 파일을 가리킬 때 xterm이 x-terminal-emulator와 다르게 동작하는 이유는 무엇입니까?

xterm이 동일한 실행 파일을 가리킬 때 xterm이 x-terminal-emulator와 다르게 동작하는 이유는 무엇입니까?

lrwxrwxrwx 1 루트 루트 14 4월 19일 14:36 ​​​​/etc/alternatives/x-terminal-emulator -> /usr/bin/xterm

다음 두 가지 호출을 사용하여 실행하세요.

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

첫 번째는 검정색 배경으로 시작하고 나머지는 흰색 배경으로 시작합니다. 다양한 구성이 가능한 이유는 무엇입니까? 이것을 디버깅하는 방법은 무엇입니까?

답변1

X 리소스 이름은 마침표로 구분된 일련의 구성 요소로 구성됩니다. 각 구성 요소는 인스턴스 이름 또는 클래스 이름일 수 있습니다. 인스턴스는 특정 구성 요소(예: 맨 위 행의 세 번째 버튼)를 식별하는 반면, 클래스는 구성 요소 유형(예: 기본 창의 모든 버튼)을 식별합니다. 관례적으로 클래스 이름은 대문자로 시작하고 인스턴스 이름은 소문자로 시작합니다. 바라보다.Xresources 파일 생성에 관한 질문입니다.또는 읽다X 문서자세한 내용은.

리소스 이름의 첫 번째 구성 요소는 애플리케이션입니다. 이 수준에서 클래스 이름은 Xterm의 경우 응용 프로그램 작성자가 선택한 응용 프로그램 이름입니다. 즉, XTerm관례적으로 X Foo라는 응용 프로그램의 경우 두 번째 문자도 대문자로 표시됩니다. 기본적으로 인스턴스 이름은 애플리케이션을 시작하는 데 사용되는 실행 파일의 이름입니다. 레거시 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

인용하다

관련 정보