Tại sao xterm lại hoạt động khác với trình giả lập x-terminal khi nó trỏ đến cùng một tệp thực thi?


7

lrwxrwxrwx 1 root root 14 tháng 4 19 14:36 ​​/ etc / thay thế / x-terminal-giả lập -> / usr / bin / xterm

Chạy nó bằng 2 cuộc gọi sau:

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

Đầu tiên bắt đầu với nền đen và khác bắt đầu với màu trắng. Những lý do có thể là nó không cùng cấu hình là gì? Làm thế nào để gỡ lỗi nó?


Bạn có thể thử mở x-terminal-emulatorbằng trình soạn thảo văn bản chỉ để kiểm tra xem nó không phải là bash thực thi hay đại loại như vậy không?
phoops

Câu trả lời:


5

Tên tài nguyên X bao gồm một danh sách các thành phần được phân tách bằng dấu chấm. Mỗi thành phần có thể là tên đối tượng hoặc tên lớp. Các thực thể xác định một thành phần cụ thể (ví dụ nút thứ ba ở hàng trên cùng) trong khi các lớp xác định một loại thành phần (ví dụ: tất cả các nút trong cửa sổ chính). Theo quy ước, tên lớp bắt đầu bằng một chữ cái viết hoa và tên ví dụ bắt đầu bằng một chữ cái viết thường. Xem Nghi ngờ về việc tạo tệp .Xresource. hoặc đọc tài liệu X để biết thêm chi tiết.

Thành phần đầu tiên của tên tài nguyên là ứng dụng. Ở cấp độ này, tên lớp một số tên ứng dụng được chọn bởi tác giả của ứng dụng; đối với Xterm, đó là XTerm(theo quy ước, đối với các ứng dụng được gọi là X Foo, chữ cái thứ hai cũng được viết hoa). Tên thể hiện theo mặc định là tên của tệp thực thi được sử dụng để khởi chạy ứng dụng. Các ứng dụng X thông thường hỗ trợ các tùy chọn dòng lệnh -name-classghi đè các giá trị mặc định này.

Khi bạn khởi động Xterm thông qua một liên kết tượng trưng, ​​điều này sẽ thay đổi tên của tệp thực thi (đó là tên bạn sử dụng quan trọng hoặc chính xác hơn là tên mà các quá trình gọi chuyển qua đối số 0). Do đó, tên ví dụ (được sử dụng, trong số những thứ ít nhìn thấy hơn, để tra cứu tài nguyên) thay đổi. Nếu bạn muốn cài đặt của mình áp dụng bất kể tên được sử dụng để gọi Xterm, hãy xác định tài nguyên của bạn (trong ~/.Xresourceshoặc bất kỳ tệp nào bạn chọn để đặt chúng) thông qua lớp, ví dụ:

XTerm.VT100.background:        Black

thay vì thông qua thể hiện ( xterm.VT100.background).


2

Tôi không biết tại sao nó lại hành xử khác đi nhưng thường thì các thực thi bị "quá tải" để hành xử khác đi khi được gọi bằng các tên khác nhau.

Thông thường có một cấu trúc bên trong chương trình được gọi là câu lệnh case / switch xác định tên mà tệp thực thi được gọi và sau đó sẽ gọi chức năng phù hợp cho tên thực thi đó. Tên đó thường là đối số đầu tiên mà chương trình nhận được. Ví dụ: Ckhi bạn viết:

int main(int argc, char** argv)

argv[0]chứa tên của thực thi được gọi. Ít nhất, đây là hành vi tiêu chuẩn cho tất cả các shell và tất cả các tệp thực thi sử dụng các đối số nên được biết về nó.

Ví dụ trong Perl

Đây là một ví dụ giả định mà tôi đã đưa vào Perl, nó cũng cho thấy kỹ thuật này.

Đây là kịch bản thực tế, gọi nó 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;

Đây là thiết lập hệ thống tập tin:

$ 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

Bây giờ khi tôi chạy các lệnh của mình:

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

Làm thế nào để gỡ lỗi?

Tôi sẽ sử dụng straceđể tìm ra các tập tin cấu hình nào đang được sử dụng khi "ứng dụng" được gọi với các tên khác nhau.

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

Sau đó chạy lại như thế này:

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

Bạn sẽ muốn xem xét các open(...)dòng khác nhau trong đầu ra để thu hẹp trọng tâm vào các tệp mà nó đang gọi.

~ / .Xres nguồn?

Như @chepner đã đề xuất trong các nhận xét, có lẽ vấn đề đang được gây ra bởi một định nghĩa cấu hình sai lầm trong tệp ~ / .Xresource của bạn. Tập tin này cho phép bạn đặt nhiều thứ như phông chữ được sử dụng bởixterm

Bạn có thể có một dòng như thế này:

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

Các quy tắc này sẽ được chọn bởi các ứng dụng có tên là XTerm nhưng không phải bởi bất kỳ ứng dụng nào khác như x-terminal-emulator. Thay vào đó, hoàn toàn có thể quy tắc trông như thế này:

xterm*reverseVideo: on

LƯU Ý: Bạn có thể buộc các thay đổi trong tệp này được tải lại như vậy:

$ xrdb -merge ~/.Xresources

Người giới thiệu


Điều này rất hữu ích, nhưng trong trường hợp cụ thể này có vẻ phức tạp hơn thế. diff <(grep open xterm.log) <(grep open emulator.log)hiển thị 0 kết quả. Ngoài ra, cả hai đều có chuỗi xterm*ReverseVideo=on(và không có kết quả tương tự khác).
Rumca

2
Đã được một thời gian kể từ khi tôi xử lý tài nguyên X, nhưng tôi nghĩ xterm*ReverseVideo=onchỉ áp dụng cho các chương trình có tên bắt đầu xterm. x-term-emulatorđã x-term, không xterm, như một tiền tố, vì vậy nó không sử dụng tài nguyên đó.
chepner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.