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ụ: C
khi 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
x-terminal-emulator
bằ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?