Почему xterm вел бы себя по-другому, чем x-эмулятор-терминала, когда он указывает на тот же исполняемый файл?

Bash тверд, но Вы можно назвать Perl от Bash? Если Ваши поля разделяются запятыми, и Ваше поле ключа является вторым,

$ cat a.csv
11,22,33
214,22,354
6,6,6
4,5,7
1,22,1

этот лайнер распечатает, если он уже не видел второй столбец:

$ perl -ne '$value = (split /,/)[1]; print unless $x{$value}++;' a.csv 
11,22,33
6,6,6
4,5,7

Эти [1] номер столбца и основан на нуле.

7
19.04.2014, 16:41
2 ответа

Имя ресурса X состоит из списка компонентов, разделенных периодами. Каждый компонент может быть либо именем экземпляра, либо именем класса. Экземпляры идентифицируют конкретный компонент (например, третью кнопку в верхнем ряду), в то время как классы идентифицируют тип компонентов (например, все кнопки в главном окне). По соглашению, имена классов начинаются с заглавной буквы, а имена экземпляров - со строчной. См. Сомнения по поводу создания файла .Xresources. или в документации по X для получения более подробной информации.

Первым компонентом имени ресурса является приложение. На этом уровне именем класса является некоторое имя приложения, выбранное автором приложения; для Xterm это XTerm (по соглашению, для приложений, называемых X Foo, вторая буква также пишется с заглавной). По умолчанию имя экземпляра - это имя исполняемого файла, используемого для запуска приложения. Обычные приложения X поддерживают опции командной строки -name и -class для переопределения этих значений по умолчанию.

Когда вы запускаете Xterm через символическую ссылку, это изменяет имя исполняемого файла (важно имя, которое вы используете, или, точнее, имя, которое вызывающие процессы передают в аргументе 0). Таким образом, имя экземпляра (используемое, помимо прочих менее заметных вещей, для поиска ресурсов) меняется. Если вы хотите, чтобы ваши настройки применялись независимо от имени, используемого для вызова Xterm, определите ваши ресурсы (в ~/.Xresources или любом другом файле, куда вы решили их поместить) через класс, например,

XTerm.VT100.background:        Black

вместо экземпляра (xterm.VT100.background).

5
27.01.2020, 20:18

Я не знаю, почему он будет вести себя по-другому, но часто исполняемые файлы «перегружены», чтобы вести себя по-разному при вызове с разными именами.

Обычно внутри программы есть структура, называемая оператором 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

Ссылки

2
27.01.2020, 20:18

Теги

Похожие вопросы