замена ключей в виртуальном терминале

Pax анализирует /.*\\// directory \\ // p как:

  • / - это символ-разделитель.
  • . * \\ - регулярное выражение, соответствующее любой строке, оканчивающейся обратной косой чертой (обратная косая черта помещает следующий символ в кавычки).
  • / отделяет регулярное выражение от замещающего текста.
  • / заканчивают заменяющий текст.
  • каталог \\ // p завершает мусор.

Очевидно, вы хотели использовать обратную косую черту для защиты косых черт, чтобы они были частью регулярного выражения, а не разделителями. Для сценария оболочки там есть дополнительные обратные косые черты (но они могут быть из-за того, что это происходит в сценарии perl, подробнее об этом позже). С косой чертой тоже что-то не так. Если вы хотите удалить любой / ведущий / префикс / вверх / до / каталога из путей, тогда он должен быть

pax -r -z -s '/.*\/directory\///p' -f "$input_path/$tgz"

. Было бы легче читать с другим разделителем. Тогда вам не нужно будет избегать косых черт.

pax -r -z -s '!.*/directory/!!p' -f "$input_path/$tgz"

Все это предполагает, что команда является командой оболочки . Вы упомянули сценарий Perl; Perl добавил бы свой собственный уровень цитирования, поэтому то, что писать, зависит от того, как строка вставлена ​​в сценарий Perl. Использование $ input_path / $ tgz определенно проблематично, потому что оно интерполирует строку в сценарий оболочки, так что строка будет анализироваться как фрагмент оболочки, а не имя файла.

Если команда оболочки находится между двойными кавычками или обратными кавычками, то обратную косую черту нужно удвоить.По-прежнему существует проблема неуместного слэша. Вот способ записать это на Perl:

my $quoted_file_name = quotemeta("$input_path/$tgz");
system("pax -r -z -s '!.*/directory/!!p' -f $quoted_file_name");

Если вы используете систему , тогда вам следует использовать форму списка, чтобы избежать проблем с цитированием, не вызывая промежуточную оболочку.

system('pax', '-r', '-z', '-s', '!.*/directory/!!p', '-f', "$input_path/$tgz");
2
28.11.2016, 21:43
2 ответа

Используйте loadkeys .

Чтобы поменять местами Esc и Caps Lock в консоли, запустите

printf 'keycode 1 = Caps_Lock Caps_Lock\nkeycode 58 = Escape Escape\n' | sudo loadkeys -
1
27.01.2020, 21:56

Debian и console-setup

В Debian Linux и Debian FreeBSD дизайн предназначен для X-сервера и виртуальных терминалов ядра, чтобы совместно использовать один набор информации о конфигурации. Пакет console-setup предоставляет инструменты и сценарии запуска, которые принимают конфигурацию клавиатуры / шрифта X-сервера, преобразуют ее и используют для настройки виртуальных терминалов ядра.

В частности: служба console-setup вызывает команду setupcon --save , которая генерирует сценарии в / etc / console-setup , содержащие преобразованную клавиатуру. и инструкции по установке шрифтов, которые запускаются на виртуальных терминальных устройствах ядра по правилам udev. Раскладка клавиатуры преобразуется из формата XKB в loadkeys с помощью ckbcomp , а сгенерированный скрипт, вызванный из правила udev, запускает loadkeys .

Итак, в Debian Linux и Debian FreeBSD вам необходимо убедиться, что ваши переменные XKBMODEL , XKBLAYOUT , XKBVARIANT , XKBOPTIONS указаны правильно. устанавливается в / etc / default / keyboard . В частности, в вашем случае вам необходимо убедиться, что переменная XKBOPTIONS имеет caps: swapescape . Затем вам нужно убедиться, что у вас правильно установлен пакет console-setup .

systemd Linux

В операционных системах systemd все несколько менее интегрировано, чем в Debian. Есть файл конфигурации с именем /etc/vconsole.conf и служба с именем systemd-vconsole-setup.service , которая обрабатывает его при начальной загрузке системы (в ответ на правило udev, объявляющее о существовании подсистемы виртуального терминала ядра). Но это вообще не связано с конфигурацией X-сервера.

В файле vconsole.conf есть параметр KEYMAP , обозначающий раскладку клавиатуры, которая передается в loadkeys , который, опять же, не нужно явно запускать самостоятельно. . Но остается полностью на ваше усмотрение , чтобы создать (настраиваемую) раскладку клавиатуры, которая меняет местами Caps Lock и Escape и помещает ее туда, где loadkeys могу найти это.

Чтобы получить больше объединенных настроек, нужно задействовать еще две службы, systemd-localed и шину рабочего стола.Один запускает, скажем,

localectl set-x11-keymap pl pc105 "" "caps:swapescape"
, и служба D-BUS локали переписывает /etc/vconsole.conf с наилучшим предположением о карте ближайшего эквивалента для виртуального терминала ядра. Этот ближайший эквивалент может не быть точно эквивалентом, однако вы можете обнаружить, что он просто игнорирует параметры и тому подобное.

Конечно, вы всегда можете в качестве альтернативы использовать Debian ckbcomp вручную для прямого преобразования раскладки клавиатуры XKB. ☺

Дополнительная литература

5
27.01.2020, 21:56

Теги

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