balaev84av

Пикабушник
498 рейтинг 8 подписчиков 0 подписок 15 постов 9 в горячем
Награды:
5 лет на Пикабу
22

Настройка мыши

(Только одна мышь (PS/2 или USB) и только один дисплей.)


Мышь называют mouse (множ. mice или mouses), или pointer, или pointing device.


Разъёмы PS/2 - отдельные для клавиатуры и для мыши, нужно подключать правильно; или один совмещённый. Для USB-мышей подойдёт любой порт USB с подходящим разъёмом.


Устройства распознаются и частично настраиваются совместно ядром и демоном устройств (в настоящее время - udev).


Подключение/обнаружение мыши регистрируется в журнале ядра (dmesg или journalctl, некоторые числа могут отличаться, вывод сокращён):


# PS/2-мышь.

# Мышь/клавиатура не подключена или не распознана.

i8042: PNP: No PS/2 controller found.

# Мышь распознана.

PNP: PS/2 Controller [PNP0303:PS2K,PNP0f03:PS2M] at 0x60,0x64 irq 1,12

serio: i8042 AUX port at 0x60,0x64 irq 12

mousedev: PS/2 mouse device common for all mice

input: ImExPS/2 Logitech Explorer Mouse as /devices/platform/i8042/serio1/input/input2

# USB-мышь.

usb 1-8: New USB device found, idVendor=046d, idProduct=c077

usb 1-8: New USB device strings: Mfr=1, Product=2, SerialNumber=0

usb 1-8: Product: USB Optical Mouse


И, если есть, в журнале X Window (здесь показана только USB-мышь, вывод сокращён):


$ grep -E '.*udev.*(M|m)ouse' /var/log/Xorg.0.log

(II) config/udev: Adding input device Logitech USB Optical Mouse (/dev/input/event14)

(II) config/udev: Adding input device Logitech USB Optical Mouse (/dev/input/mouse0)


Распознанная мышь видна в списке устройств ввода (input):


$ cat /proc/bus/input/devices | grep -A 4 -E '^N.*(M|m)ouse'

# PS/2-мышь.

N: Name="ImExPS/2 Logitech Explorer Mouse"

P: Phys=isa0060/serio1/input0

S: Sysfs=/devices/platform/i8042/serio1/input/input2

U: Uniq=

H: Handlers=mouse1 event2

# USB-мышь.

N: Name="Logitech USB Optical Mouse"

P: Phys=usb-0000:00:14.0-8/input0

S: Sysfs=/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/0003:046D:C077.0003/input/input14

U: Uniq=

H: Handlers=mouse0 event14


Если USB-мышь распознана ядром, то видна по команде lsusb (вывод сокращён):


$ lsusb

# Название может отличаться от указанного в ценнике.

# Например, эта мышь продаётся под маркой Logitech B100.

Bus 001 Device 004: ID 046d:c077 Logitech, Inc. M105 Optical Mouse


Если поступают события от мыши (хотя бы просто движения), в консоли появятся кракозябры:


$ sudo cat /dev/input/mouse0


Некоторые возможные причины проблем с работой мыши:

- неисправность самой мыши, порта системного блока;

- ошибочные файлы настроек модулей (modprobe), gpm, udev или X Window. Простейшее решение - попробовать удалить или временно переместить "лишние" (на ваш взгляд) файлы настроек;

- ошибки в ACPI. Стоит попробовать отключить ACPI в строке параметров ядра при загрузке:

# Полностью.

acpi=off

# Или частично.

pci=noacpi


(В поиске сведений и попытках отследить/реинициализировать устройство может пригодиться udevadm.)


Драйвер мыши отчасти входит в ядро (соединение по PS/2 или USB), отчасти - в консольный демон мыши или в графическую среду (протокол распознавания сигналов). Ядерный драйвер для PS/2-мыши - psmouse. Для работы USB-мыши от ядра требуется скомпилировать его с поддержкой USB HID (Human Interface Device): CONFIG_USB_?HCI_*=y; CONFIG_?HID_*=m (знаки ? и * - метасимволы оболочки). Примерный список загруженных модулей для USB HID (вывод сокращён):


$ lsmod | grep -E '(usb|hid)'

hid_generic 16384 0

usbhid 49152 0

hid 118784 3 i2c_hid,hid_generic,usbhid


Несколько мышей либо тачпад и мышь - без дополнительных настроек практически считаются одним устройством, то есть их события равносильны и указатель мыши один на всех. Общий файл-устройство - /dev/input/mice; отдельные - /dev/input/mouse0 и далее по номерам. Старые файлы: /dev/psaux - для PS/2-мыши; /dev/mouse - ссылка для совместимости.


Основные пользовательские программные параметры мыши:

- доступные кнопки и колёсики;

- соответствие физических и желаемых (логических) кнопок, то есть, например, при настройке мыши для левшей;

- "интервал двойного щелчка" (double click interval);

- "разрешение" - чувствительность сенсора перемещений, в dpi, это не столько скорость, сколько плавность движения указателя;

- собственно "скорость" перемещения указателя (speed или velocity), также упоминаемая как "чувствительность" (sensivity);

- "порог ускорения" (acceleration threshold) - ход, пройдённый на нормальной скорости, после чего включается перемещение указателя с увеличенной скоростью;

- коэффициент ускорения - множитель (acceleration numerator) или делитель (... denominator) относительно нормальной скорости;

- рисунки указателей.



В текстовом интерфейсе


Указатель мыши в текстовом интерфейсе выглядит как заполненный прямоугольник; возможно, скрыт, но появится при движении мыши.


В командной строке мышью можно выделять фрагмент текста левой кнопкой (как в большинстве GUI-редакторов), а потом щелчком средней кнопки (колёсика) добавлять копию выделенного в конец командного выражения. Правый щелчок добавляет выделение к уже имеющемуся.


Осторожно: если выделено и вставлено больше одной строки, оболочка может воспринять конец строки как сигнал к выполнению.


В псевдографическом интерфейсе с мышью обращаются так же, как и в GUI, но с учётом ограничений (активная точка размером с один текстовый символ). Например, в Midnight Commander щелчком мыши можно выделить пункт списка, активировать меню (как по клавише F9), нажать виджет-кнопку ("F1 Help", "F2 Menu" и остальные).


За предоставление мыши в текстовом интерфейсе отвечает демон gpm (General Purpose Mouse Interface). Демон может обработать три кнопки, которые с его точки зрения являются левой, средней (колёсико) и правой.


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


$ sudo gpm -m /dev/input/mice -t exps2


Опция -m указывает файл-устройство. Опция -t - тип (семейство моделей) мыши; аргумент exps2 должен подойти для обычной мыши с колёсиком. Если вместо exps2 набрать help, демон выведет список типов и завершится.


Демон требует прав администратора, запускается один раз и дальше работает для всех текстовых консолей. Завершить gpm можно повторным запуском с опцией -k либо обычным способом.


Некоторые аргументы (через пробел, как -m и -t выше):

-B - соответствие физических и желаемых кнопок (123 - по умолчанию, для правшей; 321 - для левшей);

-i - интервал двойного щелчка в миллисекундах (по умолчанию 250);

-r - скорость перемещения указателя в процентах (от 1 до 100, по умолчанию 10);

-d - порог ускорения (в символах, 2 и выше, по умолчанию 25);

-a - коэффициент ускорения (выше 1, по умолчанию 2).


Документация: страницы man и info для gpm.



В GUI (X Window/Xorg и чуть-чуть о Wayland)


В графических средах мышь обычно настраивают GUI-программами, например:

- Mouse (kcmshell5 mouse) из раздела Hardware/Input Devices в центре настроек System Settings (systemsettings5), среда KDE 5;

- Mouse & Touchpad (gnome-control-center mouse) для центра настроек Control Center, среда GNOME 3;

- Mouse and Touchpad (xfce4-mouse-settings) для центра настроек Settings (xfce4-settings-manager), среда XFCE 4.


Мышь считается набором пронумерованных кнопок (buttons):

1 - левая (left);

2 - средняя (middle, обычное колёсико (wheel), когда нажимается для щелчка);

3 - правая (right);

4 - обычно колёсико при прокрутке вверх;

5 - обычно колёсико при прокрутке вниз;

6 и прочие - дополнительные элементы на игровых мышах.


Посмотреть, как распознаются события от мыши (или иного устройства ввода) можно программой xev (от X event) в эмуляторе терминала (вывода очень много, включая любое перемещение мыши):


$ xev

# Появляется окно, события внутри которого выводятся.

# Нажата левая кнопка: "ButtonPress...button 1".

ButtonPress event, serial 37, synthetic NO, window 0x4800001,

root 0x2b8, subw 0x0, time 2002006, (91,81), root:(642,495),

state 0x0, button 1, same_screen YES

# Отпущена: "ButtonRelease...button 1".

ButtonRelease event, serial 37, synthetic NO, window 0x4800001,

root 0x2b8, subw 0x0, time 2002142, (91,81), root:(642,495),

state 0x100, button 1, same_screen YES

# Начато движение колёсиком вверх: "ButtonPress...button 4".

ButtonPress event, serial 37, synthetic NO, window 0x4800001,

root 0x2b8, subw 0x0, time 2006510, (91,81), root:(642,495),

state 0x0, button 4, same_screen YES

# Закончено: "ButtonRelease...button 4".

ButtonRelease event, serial 37, synthetic NO, window 0x4800001,

root 0x2b8, subw 0x0, time 2006510, (91,81), root:(642,495),

state 0x800, button 4, same_screen YES


Максимум кнопок для Xorg - 24 штуки; по умолчанию - 3. Обычно определяется автоматически. Или принудительно в файле настроек.


Файлы настройки Xorg - текстовые ".conf". Списки мест хранения есть в man-страницах xorg и xorg.conf. Наиболее частые:

- файл /etc/X11/xorg.conf;

- куча отдельных файлов ".conf" в /etc/X11/xorg.conf.d/;

- куча отдельных файлов ".conf" в /usr/share/X11/xorg.conf.d/.


Файлы нумеруют (если нужно, с ведущими нолями) в начале имени, чтобы указать очередь обработки, например: 80-custom-mouse-setup.conf.


Секция настройки мыши выглядит примерно так:


# Старое название секции мыши/тачпада - Pointer.

Section "InputDevice"


# Любое название в разумных пределах; можно с пробелами.

Identifier "Mouse0"


# Потом следует добавить строку в секцию "ServerLayout".

# CorePointer по смыслу - "главная мышь".

# InputDevice "Mouse0" "CorePointer"


# Старый собственный драйвер X Window - mouse,

# более новый - evdev, новейший - libinput.

Driver "evdev"


# Протокол распознавания сигналов, подобно типу для gpm.

# Для обычной мыши подойдёт ExplorerPS/2,

# даже если она для разъёма USB.

# Ещё варианты: ImPS/2, USB. Список - в документации X.

# Или Auto, то есть сервер X попробует угадать.

Option "Protocol" "ExplorerPS/2"


# Файл-устройство.

Option "Device" "/dev/input/mice"


# Максимум кнопок. Необязательно.

Option "Buttons" "5"


# Для движения манипулятора предполагаются три оси:

# X (вправо - влево);

# Y (от себя - к себе);

# Z (вверх - вниз).

# Mapping - примерно "переназначение" или "привязка".

# Ось Z для мыши - обычно прокрутка (scrolling) колёсиком.

# Здесь движение колёсиком вперёд привязано к движению

# по оси Z вниз; назад - вверх. Интерпретировать это

# как прокрутку - задача отдельных программ/библиотек.

# У вас могут быть другие номера кнопок, смотрите вывод xev.

Option "ZAxisMapping" "4 5"

# Предположительно, для мыши с двумя колёсиками:

# Option "ZAxisMapping" "4 5 6 7"


# Соответствие физических и желаемых кнопок.

# По умолчанию - "1 2 3 8 9 10" (пропущены ZAxisMapping).

# Для левши - "3 2 1 8 9 10".

Option "ButtonMapping" "1 2 3 8 9 10"


# Частота опроса сигналов мыши в секунду.

# Помогает настроить более плавную реакцию на движение руки.

# Не для всех моделей мышей.

# Option "SampleRate" "число"

# Для USB-мыши можно попробовать настроить модуль HID ядра.

# Число - периодичность опроса в миллисекундах.

# По умолчанию - 8, то есть с частотой 1000/8 = 125 Гц.

# usbhid mousepoll=число


# Разрешение в dpi. Не для всех моделей мышей.

# Option "Resolution" "число"


# "Чувствительность", множитель перемещений.

# Если выше единицы и мышь с высоким разрешением,

# то по некоторым пикселам попасть не удастся.

# Применяют как замедлитель (дробь меньше единицы)

# для мышей с высоким разрешением. По умолчанию "1.0".

# Option "Sensitivity" "число"


# Симуляция удержания кнопки нажатой.

# Нажать и отпустить дополнительную кнопку (обозначена Д)

# вместо удерживания основной (О):

# Option "DragLockButtons" "Д1 О1 Д2 О2"

# Или нажать общую дополнительную кнопку, потом основную:

# Option "DragLockButtons" "ОД1"

# В конце перетаскивания снова нажать дополнительную.


# Конец секции.

EndSection


Для большего удобства в правке конфигурационных файлов можно запросить X-сервер создать файл с автоматически сгенерированными секциями (на основе уже подключённых устройств).


# Запустить в текстовой консоли.

# Число после двоеточия - номер дисплея ($DISPLAY).

# Первый дисплей - ноль, уже занят.

$ sudo X :1 -configure


В домашнем каталоге появится файл xorg.conf.new, который следует переместить/переименовать в /etc/X11/xorg.conf. Дальше правьте его по усмотрению.


Документация:

man-страницы X, xorg.conf;

https://www.x.org/releases/current/doc/man/man4/mousedrv.4.x...

документация ядра input/input.txt, admin-guide/kernel-parameters.txt


Программа xinput показывает списки и свойства для распознанных работающей системой X Window устройств ввода; позволяет изменять многие свойства. (Вывод не показан.)


# Показать древовидный список.

# Устройства могут отобразиться несколько раз.

# Опции --list --long - максимум подробностей.

$ xinput --list --long


# Отобразить отдельное устройство - указать его номер

# (число после "id=", например, 12) или название в кавычках.

# Опции здесь можно вводить без дефисов.

$ xinput list 12


# Распознавание событий от устройства ввода, наподобие xev.

$ xinput test 12

# Или для более новой подсистемы ввода XInput2.

$ xinput test-xi2 12


# Показать разные доступные свойства.

$ xinput list-props "Logitech USB Optical Mouse"


# Показать параметры ускорения.

$ xinput get-feedbacks 12


# Основной способ настройки устройств - опция [--]set-prop.

# Свойство можно указывать как название в кавычках

# или как число без скобок.

# Делитель скорости мыши (если меньше единицы, то ускорит).

$ xinput set-prop 12 "Device Accel Constant Deceleration" .5

$ xinput set-prop 12 296 1.0


# Некоторые иные способы задания свойств.

# Соответствие физических и желаемых кнопок.

# Аналогично опции "ButtonMapping" в файле ".conf".

$ xinput set-button-map 12 1 2 3 8 9 10


# Установить параметры ускорения.

# Порядок операндов: номер, порог, множитель, делитель.

$ xinput set-ptr-feedback 12 4 2 1


# Игнорировать (disable), задействовать (enable) устройство.

$ xinput --disable 12

$ xinput --enable 12


# Уведомлять об изменении свойств из списка list-props.

# Отключить - как обычно, Ctrl C.

$ xinput watch-props 12


# Снимок состояния кнопок (нажато или нет) и координат.

$ xinput query-state 12


Программа xset может показывать и изменять некоторые свойства работающей подсистемы X Window.


# Показать параметры ускорения указателя.

# Подобно опции get-feedbacks для xinput.

$ xset q | grep -A 1 'Pointer Control'

Pointer Control:

acceleration: 2/1 threshold: 4


# Установить параметры ускорения.

# Подобно опции set-ptr-feedback для xinput.

# Но xset действует на все подключённые мыши/тачпады.

# Порядок операндов: множитель, делитель, порог.

$ xset m 2/1 4


Документация: man-страницы xinput, xset.


Также могут пригодиться программы easystroke, imwheel, xautomation, xbindkeys, xmodmap.

Тема указателей - набор изображений формата "X11 cursor" (расширение "*.xmc" обычно не используется) и некоторых текстовых настроек.


Изображения можно открыть в GIMP. Программа xcursorgen может преобразовывать файлы формата PNG в X11 cursor.


Готовые темы есть, например, здесь:

https://www.opendesktop.org/browse/cat/107

https://www.deviantart.com/customization/skins/linuxutil/x11...


Каталоги хранения: ~/.icons/, /usr/share/icons/, /usr/share/pixmaps/. Подкаталог - название темы; ещё более нижний подкаталог - cursors/. Например: /usr/share/icons/DMZ-White/cursors/ для темы "DMZ-White".


В подкаталоге с названием темы могут быть текстовые файлы index.theme и cursor.theme. Формат - аналогичный файлам "*.desktop", например:


# index.theme

[Icon Theme]

Name=DMZ (White)

Name[ru]=DMZ (Белое)

Comment=White accessible cursor theme

Example=left_ptr


# cursor.theme

[Icon Theme]

# "Наследуемая" тема означает, что недостающие изображения

# будут взяты из неё, если текущая тема неполна.

# В крайнем случае - изображение по умолчанию (default):

# ~/.icons/default/index.theme или

# /usr/share/icons/default/index.theme.

Inherits=DMZ-White


Каталоги хранения можно указать в переменной окружения XCURSOR_PATH. Содержимое - аналогично PATH.


Ещё файлы настроек: ~/.Xresources, /etc/X11/Xresources. Добавить строку, наподобие

Xcursor.theme: DMZ-White


Может потребоваться применить содержимое файла ~/.Xresources в обход графической среды. Тогда нужно добавить строку

xrdb ~/.Xresources

в файл-сценарий "~/.xinitrc" или "~/.xprofile" (аналогично файлу "~/.bashrc").


Диспетчер дисплея (display manager) может сам себе задать тему указателей.


Документация:

http://www.x.org/releases/current/doc/man/man3/Xcursor.3.xht...

https://wiki.archlinux.org/index.php/Cursor_themes

https://wiki.archlinux.org/index.php/x_resources


В графической подсистеме Wayland каждый композитный диспетчер (compositor: KWin, mutter, Weston) обращается с мышью по-своему, но в настоящее время - через библиотеку libinput. Программа xinput при обращении к libinput работает только для X Window; программа xset не влияет на устройства ввода даже в X Window, если задействована libinput. Поэтому настраивать мышь в Wayland придётся GUI-программами графической среды (или средствами навроде gsettings). Библиотека libinput сама предоставляет некоторые оптимальные низкоуровневые настройки. Есть наборы параметров движения указателя (acceleration profiles), здесь не рассказано.


Документация:

https://wayland.freedesktop.org/libinput/doc/latest/faq.html

https://wayland.freedesktop.org/libinput/doc/latest/what_is_...

https://www.mankier.com/4/libinput

https://wayland.freedesktop.org/docs/html/ch03.html

https://wayland.freedesktop.org/docs/html/ch04.html

36

Архивация и компрессия файлов. Часть 2

Многие файлы содержат сколь-нибудь повторяющуюся, лишнюю информацию. Поэтому технически возможно преобразовывать её так, чтобы уменьшить общий размер. Это и есть компрЕссия (compression, "компрЕшэн"), или сжатие, данных.


Сжатие не следует воспринимать как "удаление ненужных частей". Важно, чтобы восстановленный файл имел точно такое же содержимое, что исходный (совпадения размеров файлов - не достаточно).


Есть много алгоритмов компрессии и много форматов сжатых файлов. В UNIX и Linux популярны форматы сжатия Bzip2, Gzip (традиционный), LZMA, XZ. Для примера - те же три файла:


$ cd works

$ cp old/file?.* today/


Компрессор gzip для формата Gzip обычно удаляет файл-операнд; иначе нужна опция -k (от keep):


$ cd today

$ gzip -k file?.*

$ du -k file?.*

100 file1.000

4 file1.000.gz

100 file2.rnd

104 file2.rnd.gz

100 file3.txt

32 file3.txt.gz


Шаблоны имён здесь раскрывает оболочка. Расширение имени здесь добавляется, а не заменяет исходное.

Понятие "степень сжатия" (compression ratio) толкуется по-разному: 1) "какую долю от размера исходного файла составляет размер сжатого файла" либо 2) "какую долю удалось убрать". Обычно выражается в процентах.


Выше видно, что нулевой файл имеет степень сжатия (1) в четыре процента (то есть сжат в 25 раз), случайный файл - 104% (то есть лучше было бы его вовсе не сжимать), текстовый файл - 32% (то есть примерно втрое уменьшился).


Вот вывод компрессором информации об архиве, в том числе степени сжатия в смысле (2):


$ gzip -l file3.txt.gz | column -t

compressed uncompressed ratio uncompressed_name

29806 102400 70.9% file3.txt


В выводе не учтены внутренние вспомогательные данные формата, здесь - около 3 КиБ: 100 - 71 = 29; 32 - 29 = 3.


Нередко алгоритм допускает несколько степеней сжатия. По умолчанию программа обычно выбирает нечто среднее. За более сильное сжатие (меньше размер) приходится платить увеличенными временем упаковки и расходом оперативной памяти. Нередко выигрыш в степени сжатия оказывается незначителен. Скорость распаковки остаётся прежней.


$ rm file{2,3}.*.gz

$ gzip -fkv --best file{2,3}.*

file2.rnd: -0.0% -- replaced with file2.rnd.gz

file3.txt: 70.9% -- replaced with file3.txt.gz

$ du -k file{2,3}.*

100 file2.rnd

104 file2.rnd.gz

100 file3.txt

32 file3.txt.gz


В данном случае - никакой разницы.


Опция -f - принудительное выполнение (от force), то есть здесь - заменить (replace) уже существующий сжатый файл новым. Опция --best - сжать наилучшим доступным алгоритмом (с параметрами, нацеленными на наиболее сильное сжатие).


Можно попробовать другой компрессор/формат, например bzip2 (Bzip2, ".bz2"):


$ bzip2 -k file3.txt

$ du -k file3.*

100 file3.txt

28 file3.txt.bz2

32 file3.txt.gz


Здесь есть небольшой выигрыш: 32 - 28 = 4.


Нет простого способа узнать, насколько сильным будет сжатие. Тексты часто сжимаются со степенью (1) ниже 50%. Хуже всего сжимаются хаотичные (случайные, шум) данные.


Для удобства можно считать, что для файлов средних размеров сжатие уместно, если степень (1) составляет 60% и ниже (то есть сэкономлено 40% места и больше). Если файл большой (1 ГиБ и выше), то даже небольшая экономия при сжатии может быть уместна. Уже сжатый файл обычно бесполезно сжимать ещё раз. Файлы размером ниже 3 КиБ сжимать тоже бесполезно.


Для "декомпрессии" (распаковки, извлечения оригинала) сжатого файла часто есть не только опция компрессора, но и отдельная программа-распаковщик. Или сам компрессор может быть запущен под другим именем файла (например, с жёсткой ссылкой) для распаковки - это зависит от программиста.


$ gzip -d -kf file2.rnd.gz

$ gunzip -kf file2.rnd.gz


Здесь или опция -d, или программа gunzip. Опции -k, -f - с прежним смыслом. Аналогично с BZip2:


$ bzip2 -d -kf file3.txt.bz2

$ bunzip2 -kf file3.txt.bz2

$ diff -qs /bin/bunzip2 /bin/bzip2

Файлы /bin/bunzip2 и /bin/bzip2 идентичны


Документация: man-страницы.


Чтобы задействовать содержимое оригинального (несжатого файла), обычно нужно явным способом распаковать сжатый. На это тратится процессорное время; в мобильном компьютере может быть повышенный расход заряда аккумулятора. Кроме того, степень сжатия непредсказуема или даже (1) выше 100%, поэтому при массовых правках файлов свободное место на диске может внезапно закончиться.


Чтобы задействовать содержимое оригинального (несжатого файла), обычно нужно явным способом распаковать сжатый. На это тратится процессорное время; в мобильном компьютере может быть повышенный расход заряда аккумулятора. Кроме того, степень сжатия непредсказуема или даже (1) выше 100%, поэтому при массовых правках файлов свободное место на диске может внезапно закончиться.


Есть несколько форматов файловых систем, где файлы сжимаются/распаковываются автоматически (говорят: "на лету" (on-the-fly) или "прозрачная (transparent) распаковка").


Есть аналоги привычных утилит с именами, начинающимися на bz (для BZip2), xz или z (GZip): bzcat, bzless, bzgrep и другие. Делают то же, что оригиналы, но со сжатыми файлами.


Midnight Commander, подобные ему двухпанельные диспетчеры файлов, некоторые другие диспетчеры - могут открывать/распаковывать архивы/сжатые файлы. Иногда есть возможность имитировать монтирование архива как каталога (только на чтение, иногда ещё и на запись). В таких случаях программе может понадобиться предварительно распаковать файлы во временный каталог (обычно куда-то в /tmp/). Это заметно как зависание программы при работе с большим (несколько десятков МиБ и выше) архивом.


В UNIX и Linux компрессия традиционно является операцией над одиночным файлом. То есть для компрессии каталога с содержимым - нужно сначала создать архив, а потом его сжимать (либо, реже, - сжать каждый файл, а потом заархивировать всё).


Архиватор tar может задействовать какой-либо компрессор, если тот воспринимает просто имя файла как сигнал к сжатию либо воспринимает опцию -d как сигнал к распаковке (декомпрессии). Опции tar для внешних компрессоров: -z для gzip, -j для bzip2, -J для xz. Для остальных компрессоров - опция -I (заглавная i, после которой указать имя программы). Примеры:


# Архив tar внутри сжатого файла Gzip одной командой.

$ tar -cvz -f archive.tar.gz "old"

old/

old/file3.txt

old/file1.000

old/file2.rnd

$ du -s archive.tar.gz

136 archive.tar.gz

# Вывод сокращён.

$ file archive.tar.gz

archive.tar.gz: gzip compressed data


# Архив tar внутри сжатого файла Bzip2 одной командой.

$ tar -cj -f archive.tar.bz2 "old"

$ du -s archive.tar.bz2

132 archive.tar.bz2

$ file archive.tar.bz2

archive.tar.bz2: bzip2 compressed data, block size = 900k


# Архив tar внутри сжатого файла LZMA одной командой.

$ tar -c -I lzma -f archive.tar.lzma "old"

$ du -s archive.tar.lzma

128 archive.tar.lzma

$ file archive.tar.lzma

archive.tar.lzma: LZMA compressed data, streamed


Вместо множественных расширений вида ".tar.gz" могут попадаться одиночные: ".tgz", ".tbz", ".txz" и другие - по традиции или при необходимости соблюдать ограничения на длину имени. Устаревший компрессор - compress; расширение ".Z"; в tar есть опция -Z.


# Примеры распаковки сжатых архивов одной командой:

$ rm -r old/

$ tar -xj -f archive.tar.bz2

# Или:

$ tar -x -I lzma -f archive.tar.lzma


Чтобы изменить содержимое сжатого архива, программе приходится его предварительно распаковывать, а после внесения изменений - заново упаковывать обратно. Это затраты времени, оперативной памяти и, возможно, пространства на диске для временного хранения. Может оказаться удобнее - упаковать файлы в поддереве по отдельности, не создавая архива. У gzip/gunzip есть опция -r (от recursive). Для других программ можно задействовать find (и, если нужно, xargs).


В семействе Windows привыкли воспринимать архивацию и компрессию как единую, неделимую операцию. Часто говорят "заархивировать" в смысле "получить сжатый архив"; "разархивировать" - "выполнить и декомпрессию, и извлечение из архива". Или: "упаковать" и "распаковать" файлы. И сжатые файлы называют "архивами". Для большинства пользователей важно именно сжатие данных, а архивация подразумевается сама собой.


Популярные в Windows форматы сжатых файлов с возможностью хранения файлового поддерева (архива): ZIP, RAR. Соответственно программы: для командной строки - zip.exe, rar.exe; для GUI - WinZip, WinRAR. Диспетчер файлов системы Windows - Проводник (Explorer) может смонтировать архив ZIP как подкаталог там, где находится сам файл архива. Есть и другие программы, в том числе поддерживающие много форматов, например: 7-Zip, PeaZip (и вышеуказанные WinZip, WinRAR).


Набор программ p7zip (в том числе 7z, 7za) является вариантом 7-Zip для командной строки UNIX и Linux. Формат 7z может давать более сильное сжатие, чем Gzip и Bzip2.


В Linux может быть проблема с форматом ZIP для файловых имён, содержащих не-латиницу. У ZIP есть свой внутренний формат хранения имён. Если создать архив в Windows, а потом попытаться распаковать в Linux, имена превратятся в наборы кракозябров. В последнее время дистрибутивы обычно поставляют исправленные программы unzip и zip. Или придётся пробовать перекодировать имена программой iconv или convmv.


Возможные (ненадёжно) варианты перекодировки имени (предполагаемый в примере файл сохранил расширение ".pdf" на латинице, поэтому файл можно как-то задействовать через шаблон оболочки):


$ N=$(ls *.pdf | iconv -f cp1252 -t cp850 | iconv -f cp866)

# Или другой вариант:

$ N=$(ls *.pdf | iconv -t iso8859-1 | iconv -f cp866)


# После каждого варианта просмотреть

# содержимое переменной N для перекодированного имени.

$ echo $N

# И если имя выглядит разумно, то:

$ mv *.pdf "$N"

$ unset N


Программы для Windows часто поставляются в виде особых архивов, в том числе формата Microsoft Cabinet (".cab"). Такие архивы по лицензионным соглашениям запрещено распаковывать вручную. Для Linux есть программа cabextract.


Иногда в России встречаются старые форматы архивов с внутренней компрессией: ARJ, HA, LHA и другие. Для Linux могут найтись программы: arj, ha, unar. Иначе может понадобиться устанавливать FreeDOS/Wine или иную среду выполнения DOS/Windows-программ, а потом искать соответствующие декомпрессоры.


В Windows нередко создают "самораспаковывающиеся" (self-extracting) архивы: это программа-распаковщик, к которой присоединён собственно архив. Как и обычная программа для Windows, имеют расширение ".exe". Предназначены для пользователей, у которых нет своей копии распаковщика. Иногда такой архив можно распаковать и в Linux (зависит от формата архива и наличия программ, например 7-zip). Нежелательны к применению, потому что могут содержать программы-вирусы. Не следует запускать напрямую, а лучше - открыть отдельным распаковщиком. В Linux иногда делают сценарии оболочки, состоящие из команды на распаковку и присоединённого к сценарию архива; программы: makeself, shar (sharutils).


В некоторых форматах архивов и/или сжатых файлов предусмотрено шифрование с паролем: 7z, RAR, ZIP и другие.


Компрессия данных может встретиться и на системном уровне. Например, в некоторых файловых системах нулевые фрагменты (пустые блоки) внутри файлов не хранятся и не копируются (это называется "разреженные файлы", sparse files).


Программы для GUI: Archive Manager (File Roller) для GNOME, Ark для KDE, Engrampa для MATE, PeaZip, Xarchiver. Они отображают содержимое архивов, подобно тому как диспетчеры файлов отображают содержимое каталогов; предоставляют меню команд создания/распаковки архивов. Но сами не содержат программного кода архиваторов/компрессоров, поэтому требуют установки библиотек (libarchive, liblzma, unrar и других) и самих архиваторов/компрессоров для командной строки.


В файлах мультимедиа (изображения, звук, видео) часто применяют алгоритмы "несимметричного" сжатия, то есть с частичной потерей информации. Это позволяет сжать данные ещё сильнее (в десятки или больше раз). Некоторые потери в деталях изображений или в звуковых волнах уместны, если средний человек эти оттенки/детали/шумы и прочее не различает. Такие алгоритмы обычно имеют широкий набор настроек, поэтому нужно следить за тем, чтобы качество мультимедиа не стало плохим, явно заметным.

34

Архивация и компрессия файлов. Часть 1

(НЕ является руководством по резервному копированию. Во второй части используется тот же тестовый каталог с теми же файлами.)


"АрхИв" (archive, "Акайв") в компьютерном смысле - набор файлов, подготовленный для длительного хранения. Предполагается, что файлами из архива какое-то время не будут пользоваться - подобно тому, как лишние вещи складывают в коробку и убирают в кладовку или ещё куда-то.


Цели архивАции файлов: иметь запасные копии; переслать несколько файлов/каталогов одной операцией; если нужно/возможно - сэкономить/высвободить место на диске. Для экономии места лишние файлы удаляют или "сжимают" (синонимы: "упаковывают", "подвергают компрессии").


Форматы архивов по сути - контейнеры: содержат "слепок" (snapshot) или "образ" (image) некоторой части дерева файловой системы или всего дерева (или даже больше). Важно, чтобы из архива можно было "разархивИровать" (извлечь) не только содержимое файлов, но и их имена/пути, даты, права и остальные нужные метаданные.


Традиционные и/или стандартные сейчас либо ранее (в POSIX) программы-архиваторы: cpio, pax, tar. Менее известные: dar, star.


Наиболее популярна - tar. Имя означает "tape archiver". Слово "tape" означает здесь - "[магнитная] лента". Устройства хранения на кассетах с магнитными лентами есть и сейчас, в основном в крупных организациях. Такое устройство называют "стрИмером" (streamer), а кассету - "кАртриджем" (cartridge). В отличие от магнитного диска, для операций чтения/записи ленту нужно перематывать; и создавать на ленте полноценную файловую систему (форматировать) обычно нецелесообразно. Поэтому здесь не достаточно простого копирования, а нужен формат-контейнер, файл которого пишется в символьный файл-устройство стримера сплошным потоком, хотя и условно разделён на блоки.


Примеры действий с архивами tar:


# Создать тестовый каталог с содержимым.

$ mkdir -p works/{today,old}


# Файл из нулей.

$ fallocate -l 100KiB works/old/file1.000


# Файл из случайно сгенерированных байтов.

$ dd if=/dev/urandom bs=1k count=100 of=works/old/file2.rnd


# Текстовый файл. Аргумент iflag=fullblock нужен,

# чтобы dd дождалась достаточного объёма данных от col,

# не завершаясь раньше этого.

$ man bash | col -b \

| dd bs=1k count=100 iflag=fullblock \

of=works/today/file3.txt


# Вот итоговый вид поддерева works от программы tree.

# (Она не стандартная, устанавливают отдельно.)

$ tree -F works/

works/

├── old/

│***├── file1.000

│***└── file2.rnd

└── today/

****└── file3.txt


(Редактор постов, как обычно, съел несколько пробелов, поэтому вместо них - звёздочки. Должно быть, разработчик редактора - любитель Пакмана.)


Предполагается заархивировать старые файлы, т. е. в old/.


Опции:

-c - создать архив;

-v - выводить список обрабатываемых файлов;

-f - архив не на ленте, а в указанном файле.


Всё остальное - архивируемые файлы/каталоги; для архивации поддерева будет достаточным указать только родительский каталог.


# Кавычки - просто выделение того, что именно идёт в архив.

$ cd works

$ tar -c -v -f archive.tar "old"

old/

old/file1.000

old/file2.rnd


# Посмотреть свойства архива:

# Формат.

$ file archive.tar

archive.tar: POSIX tar archive (GNU)

# Содержимое (список файлов).

$ tar -t -f archive.tar

old/

old/file1.000

old/file2.rnd

# Размер.

$ du -k archive.tar

212 archive.tar


# Освободить место, занятое старыми файлами.

$ rm -rv old/*

удалён 'old/file1.000'

удалён 'old/file2.rnd'

$ tree -F .

.

├── archive.tar

├── old/

└── today/

****└── file3.txt


# Извлечь содержимое архива.

# Сам архив останется прежним.

# Однобуквенные опции можно набрать слитно с общим дефисом.

$ tar -xvf archive.tar

old/

old/file1.000

old/file2.rnd


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


Можно попробовать указать шаблоны имён с символами * и ?, но дополнительно нужна опция --wildcards, например:


$ tar -xv --wildcards -f archive.tar '*file?.???'


Файлы извлекаются вместе с путями, так что каталог old со всем содержимым мог быть восстановлен в любом другом подходящем рабочем каталоге.


Архив можно пополнить. Пополнение архивов бывает "добавлением" (append) или "обновлением" (update).


Если нужно добавить какие-то ещё файлы - опция -r вместо -c; и опять указать пути к файлам в конце командного выражения.


Если в том же каталоге появились новые файлы или поправлены старые, то это обновление (замена старых файлов на новые); вместо опции -c указать -u. Программа tar сама обнаружит и добавит в архив новые/исправленные файлы.


$ mv today/file3.txt old/

$ tar -uvf archive.tar "old"

old/file3.txt


$ tar -tf archive.tar

old/

old/file1.000

old/file2.rnd

old/file3.txt


Опция --delete - удалить файлы из архива (только если архив не на ленте):


# Всё равно этот файл состоял только из нулей.

# Здесь путь к файлу не выводится.

$ tar --delete -v -f archive.tar "old/file1.000"

$ tar -tf archive.tar

old/

old/file2.rnd

old/file3.txt


В архивах tar можно хранить несколько файлов с одинаковым путём. Выполняется повторными действиями добавления и обновления. В списке по -t очередь идёт снизу вверх, то есть сверху - архивированные последними. Опция --occurence=3 - выполнить действие над третьим по очереди добавления файлом из тех, что с одинаковым путём (нумерация начинается с единицы).


И ещё много разных опций, например:

-k - не извлекать файлы, если они уже есть в целевом каталоге;

--keep-newer-files - почти то же, но с уточнением, если уже имеющиеся в целевом каталоге файлы - более новые (по метаданным даты и времени), чем в архиве;

-p - метаданные о правах на файлы тоже восстанавливать из архива при извлечении;

--same-owner - восстанавливать имя владельца и группы;

-w - просить подтверждения на каждое действие.

Документация: man tar, info tar.


Благодаря сохранению метаданных, архиваторы иногда применяют для аккуратного копирования по конвейеру, например:


$ cd today

$ find . -depth -print0 | cpio --null -pvd ../old

../old/./file3.txt


Программа find часто служит генератором списка имён для архивации или иных массовых действий над файлами. Архиватор cpio всегда требует перенаправления: <, > или |. Опции -print0 и --null - для корректной обработки путей, содержащих кириллицу, пробелы и иные символы за пределами правила "8.3" и подобных ему ограничений.


Следите за тем, чтобы правильно строить пути (чтобы, например, не получилось в итоге works/old/today/file3.txt вместо works/old/file3.txt). Для начала стоит запустить только find.


Формат tar имеет проблемы с хранением специальных файлов, со скоростью поиска файла в архиве, с хранением некоторых метаданных. Если это критично, то следует применять архиватор dar.

31

- Ты недостаточно линуксоид!

... - говорит тебе очередной самозваный знаток/мастер/гуру Linux.


А ты ему отвечаешь:


- Убирайся отсюда со своим ржавым железом! Да у меня даже линолеум с поддержкой Linux!

- Ты недостаточно линуксоид! Linux, Tux, Картинки, Линолеум, Юмор

(Авторские права на вставку с Таксом: lewing@isc.tamu.edu Larry Ewing and The GIMP,

https://ru.wikipedia.org/wiki/Файл:Classic_flat_look_v1.1.sv...)

22

Символьные шаблоны

Это способы найти в чём-то схожие фрагменты текста или кратко выразить длинный текст. Потом текст как-то обрабатывается (возможно, по другому шаблону) либо хотя бы выводится (на экран или в файл). Есть сколько-то диалектов шаблонов. Популярны три: "раскрытие имён в командной оболочке" (filename expansion, или globbing), "регулярные выражения POSIX" и "регулярные выражения, аналогичные применяемым в языке Perl" (Perl-compatible regular expressions, PCRE). Последние здесь не описаны.


Любой фрагмент текста является шаблоном (pattern) для самого себя. В пейджерах и редакторах есть функциональность поиска по фрагменту как он есть и, возможно, по шаблону на каком-либо диалекте. Для автоматизации применяют отдельные программы поиска по тексту: grep и более сложные awk, sed. Для тренировки можно, например, сделать текстовый вариант какой-либо man-страницы:


$ env COLUMNS=60 man bash | col -b > bash.txt


$ grep -i "pattern matching" < bash.txt

below under Pattern Matching, as if the extglob

sion and pattern matching.

matching the pattern (see Pattern Matching below).

Pattern Matching

performs pattern matching as described above

pattern matching bracket expressions

(see Pattern Matching above) behave


Обычно программа grep выводит всю строку с совпавшим фрагментом. Перенаправление ввода для "bash.txt" здесь просто для наглядности. Опция -i означает "игнорировать регистр", то есть, например, символы p и P считаются одинаковыми. Но коды строчных и заглавных букв отличаются. Для каждого алфавита программам нужны свои правила распознавания букв.


Параграф под заголовком "Pattern Matching" в man-странице Bash описывает как раз шаблоны раскрытия имён. Найдено семь строк, а нужна одна (четвёртая). Она отличается, например, тем, что после Matching строка заканчивается. В регулярных выражениях конец строки помечают знаком $; начало - ^.


$ grep -i -A 8 "pattern matching$" < bash.txt

Pattern Matching


Any character that appears in a pattern, other than

the special pattern characters described below,

matches itself. The NUL character may not occur in

a pattern. A backslash escapes the following char‐

acter; the escaping backslash is discarded when

matching. The special pattern characters must be

quoted if they are to be matched literally.


Теперь точно найдена одна строка; остальные - результат опции "-A 8", то есть "восемь линий после найденной". Это бывает удобно для уточнения (действительно ли найдено нужное) или для составления краткой сводки. Документация: страницы man и info для grep.


Программа find находит файлы по метаданным; результат можно перенаправить в grep, чтобы дальше искать уже по текстовому содержимому. Пример (вывод не показан):


$ find . -type f -iname "*.txt" -print0 \

| xargs -0 grep -i "09.2017"


Здесь find находит файлы с именем, заканчивающимся на ".txt". Символ * означает "любое (в том числе нисколько) количество любых символов". Опция -0 - для приёма нуль-терминальных строк от опции -print0. Вся команда должна в итоге выдать записи за сентябрь 2017 года, обнаруженные (если есть) в содержимом (не в метаданных) найденных текстовых файлов.


Сама grep тоже может выполнить поиск файлов - обработать полное содержимое рабочего каталога с опцией -R. Но тогда ей придётся прочитать содержимое всех файлов. С find будет быстрее, если примерно известно имя файла.


Поиск файла и составление шаблона схожи: первичный поиск может дать слишком много результатов, и тогда вы придумываете, как надо исправить условия поиска; первый составленный шаблон может не подойти, и тогда вы уточняете шаблон.


Шаблон может включать в себя фрагменты имён и метасимволы вперемешку. Символы *, ? и некоторые другие в шаблонах называют "метасИмволами" (metacharacters), или "джОкерными символами" (wildcard characters), - в том смысле, что они представляют не самих себя. Чтобы метасимвол (или нетипичный символ) был воспринят как есть, его нужно экранировать. Или заключить в кавычки: шаблон внутри кавычек не раскрывается оболочкой. Прочие символы (буквы, цифры...) воспринимаются как есть.


Например, вы смутно помните, что где-то был файл с именем, начинающимся на par. Тогда шаблон для find или оболочки будет выглядеть так: "par*". Или приведённый выше шаблон "*.txt" - для всех имён файлов, заканчивающихся на ".txt".


Когда оболочка разбирает команду, то раскрывает шаблоны (globbing), то есть заменяет их на подходящие имена. Вместо шаблона программа в команде получает от оболочки подходящий список имён файлов (если есть) из рабочего или заданного каталога (не вложенных). Можно потренироваться с программой echo (или ls):


# Создать тестовые файлы и каталоги.

$ mkdir testdir

$ cd !^

$ mkdir .hd1 .hd2

$ touch .hf1 .hf2 \

a.txt b.txt \

f1 f2 f3 f4 f5 f6 f7 f8 f9 f10


# Символ * означает "любое (в том числе нисколько)

# количество любых символов". (Есть исключение.)

$ echo f*

f1 f10 f2 f3 f4 f5 f6 f7 f8 f9

$ echo *

a.txt b.txt f1 f10 f2 f3 f4 f5 f6 f7 f8 f9

$ echo *.txt

a.txt b.txt

# Символ ? означает "один любой символ".

$ echo ???

f10

# Если нечем раскрывать шаблон, оболочка передаёт его

# программе как есть.

$ echo ????

????

# "Имена длиной не менее трёх символов".

$ echo ???*

a.txt b.txt f10

# Квадратные скобки в шаблонах содержат возможные варианты

# одиночных символов.

$ echo f[1-4]

f1 f2 f3 f4

$ echo f[579]

f5 f7 f9

$ echo [ab].???

a.txt b.txt

# Символ ^ или ! означает отрицание/несовпадение.

$ echo .h[^f]*

.hd1 .hd2

$ echo f[!1-4]

f5 f6 f7 f8 f9

# Бывает, что ввести список вручную или из файла

# оказывается проще, чем составить шаблон.

$ echo .h[df][^2]

.hd1 .hf1


Шаблон "*" (без кавычек) не раскрывается в имена скрытых файлов (вида ".имя"). Здесь шаблон ".*" тоже не годится, потому что раскрывается в том числе в имена-ссылки "." и "..". Значит, верный шаблон должен соответствовать такому набору символов: точка, затем не точка, затем любые другие символы либо ничего. Итого:


$ echo .[!.]*

.hd1 .hd2 .hf1 .hf2


Шаблонов, как любых аргументов, может быть несколько, поэтому для всех (не вложенных) файлов каталога нужно два шаблона (вывод не показан):


$ echo .[!.]* *


Первоначально [под]множества символов были диапазонами ASCII-символов: A-Z, a-z, 0-9 - основанными на диапазонах кодов. Для кириллицы и других алфавитов диапазоны в шаблоне могут не сработать.


Вышеописанные шаблоны обычно применяют в массовых файловых операциях: копировании, перемещении, удалении и иных. Пример:


$ mkdir ~/testdir2

$ cp ~/testdir1/f[1-9]* ~/testdir2/


Традиционное предупреждение: постарайтесь не сделать вот такую опечатку (лишний пробел между 2 и /), особенно работая от имени суперпользователя:


$ rm -rf ~/testdir2 /*


Потому что шаблон "/*" будет раскрыт в содержимое корневого каталога. Операция удаления (прервать - как обычно Ctrl C) может уничтожить и операционную систему, и ценные данные.

Диапазон или перечисление в Bash также можно задать фигурными скобками:


$ echo f{1..10}

f1 f2 f3 f4 f5 f6 f7 f8 f9 f10

$ echo f{,5,7,9}

f f5 f7 f9

$ echo {a..c}{1,2,3}

a1 a2 a3 b1 b2 b3 c1 c2 c3


Фигурный шаблон раскрывается независимо от наличия файлов с подходящими именами. Работают только числа и латиница. Скобки диапазонов могут быть вложенными. Фигурные шаблоны обычно применяют как генераторы имён. Пример:


$ mkdir -p ~/testdir1/2018/{01..12}


Шаблон внутри кавычек не раскрывается. Есть разница в обработке кавычек оболочкой. Обратные (`) применяют для подстановки команд; равноценный синтаксис - $(). Одиночные (') и двойные (") - для указания/уточнения границ аргумента.


Содержимое внутри одиночных кавычек никак предварительно не обрабатывается, а передаётся программе как есть.


Содержимое внутри двойных кавычек частично обрабатывается: оболочка подставляет значения переменных вместо их имён.


Выражения в кавычках могут быть вложенными; желательно чередовать виды кавычек. Кавычки должны быть парными (чётное число) либо экранированными. Парой считается ближайшая одинаковая кавычка. Примеры:


$ echo $SHELL '$SHELL' "$SHELL"

/bin/bash $SHELL /bin/bash

$ echo 'What's the shell file? It's "$SHELL"'

Whats the shell file? Its "$SHELL"

$ echo "What's the shell file? It's \"$SHELL\""

What's the shell file? It's "/bin/bash"


Некоторая функциональность может не работать, когда Bash запущена под именем sh или с опцией --posix (то есть имитирует некоторые старые версии). Чтобы лучше понимать разбор команд, можно запустить Bash в "отладочном" (debugging) режиме: bash -x.


Специализированные шаблоны для вывода информации есть, например, у программы date и у множества реализаций функции printf.


Например, у date шаблон %d означает текущий день, %m - месяц, %Y - год, %H - час (0-23), %M - минуту (с ведущими нулями, где нужно):


$ date -d '7:05 8/5' '+%d.%m.%Y %H:%M'

05.08.2017 07:05


Реализация printf есть, например, у find или stat. Есть шаблоны как у программы date (d, m, Y в сочетании с T, что означает "дата/время последнего изменения") и другие (%U - UID, %G - GID и прочие):


$ find /sbin -maxdepth 1 \

-printf '%Y %m%5U%5G %11s %Td.%Tm.%Ty-%TH:%TM %f\n' \

| head -5

d 755 0 0  12288 16.11.17-08:23 sbin

f 777 0 0  3 16.04.16-11:58 pvs

f 777 0 0  15 28.01.17-20:54 mount.lowntfs-3g

f 755 0 0  10552 18.11.14-18:57 crda

f 755 0 0  14410 16.04.16-11:57 fsadm


Документация: страницы man и info для date, find, printf(1), stat(1).


Есть сколько-то диалектов регулярных выражений, отчасти схожих; единого фактического стандарта нет. Разные программы могут воспринимать по-разному один и тот же шаблон. Любой шаблон следует тщательно тестировать на разных примерах в каждой применяемой программе.


Английские тексты относительно легко обрабатывать по шаблонам, потому что форм слов немного. Русские тексты обрабатывать труднее или даже невозможно.


Регулярные выражения состоят из условных элементов: собственно символов и их диапазонов/классов, якорей, метасимволов, квантификаторов и других.


Скобки [] здесь - обрамляют один символ из указанных диапазонов. Например, слова grey и gray оба правильны, поэтому их общий шаблон можно представить как "gr[ea]y". Далее, в начале предложения слова пишут с заглавной буквы, поэтому - "[Gg]r[ea]y".


$ echo -e "gray\nWhite\nGrey\ngreen"

gray

White

Grey

Green

$ echo -e "gray\nWhite\nGrey\ngreen" | grep '[Gg]r[ea]y'

gray

Grey


Чтобы не перечислять все возможные символы диапазона, можно указать границы через дефис; не буквы и не цифры (в том числе скобки) следует экранировать. Можно указать несколько диапазонов, например шаблон "[A-Za-z]" означает "один из символов латиницы, заглавных и строчных".


$ echo -e '-\na\nZ\n1\n&\n?\n[' | grep '[a-zA-Z\[\?\-]'

-

a

Z

?

[


Метасимволы: . - один любой символ; ^ - отрицание/исключение, то есть "любой символ, не входящий в указанные диапазоны" (его указывать первым, сразу после [).


$ echo -e '-\na\nZ\n1\n&\n?\n[' | grep '[^a-zA-Z\[\?\-]'

1

&

$ echo -e "four\nfork\nforty" | grep 'fo...'

forty


"Якоря" (anchors) здесь - указания на границы текстовых объектов: ^ - в начале строки; $ - в конце строки; \b - на границе слова; \B - не на границе слова; \< - в начале слова; \> - в конце слова.


$ echo -e "four\nfork\nforty" | grep 'fo..$'

four

fork

$ echo -e "before\nfour\nfork\nforty" | grep '\<for'

fork

forty


Шаблон "^$" будет означать пустую строку. Опция -c для grep означает "подсчитать найденные совпадения", например:


$ grep -c '^' < bash.txt

7579

$ grep -c '^$' < bash.txt

549


Итого 549 пустых строк из общего числа в 7579.


Иногда можно частично обойтись без шаблонов при помощи опций. Например, -v означает отрицание/исключение/несовпадение:


$ grep -v -c '^$' < bash.txt

7030


То есть (7579 - 549) = 7030 непустых строк.


"КвантификАторы" (quantifiers) здесь - повторители для предыдущих символов: ? - один/ни одного символа; * - ни одного/сколько угодно символов; + - один/сколько угодно символов; {N} - ровно N раз; {N, M} - от N до M раз включительно. Не применимы к якорям. Применимы к диапазонам (набирают после замыкающей скобки).


$ echo -e "colour\ncolor" | grep 'colo.*r'

colour

color


Шаблон 'colo.?r', вроде бы столь же пригодный для предыдущего сравнения, работает здесь только с опцией -E:


$ echo -e "colour\ncolor" | grep -E 'colo.?r'

colour

color


Круглые скобки применяют в сомнительных случаях для указания приоритета операций, подобно математическим выражениям. Нередко со скобками применяют метасимвол | в смысле союза "или":


$ echo -e "colour\ncolor" | grep -E '(colour|color)'

colour

color

$ echo -e "four\nfork\nforty" | grep -E 'fo(ur|rk)'

four

fork


В особенно трудных случаях можно попробовать указывать несколько шаблонов или сделать несколько последовательных перенаправлений.


Документация по регулярным выражениям в man-страницах (не очень понятна): grep, regex(7), pcresyntax(3), pcrepattern(3). В Интернете: https://en.wikipedia.org/wiki/Regular_expression.

42

Шрифты в Linux

(НЕ является инструкцией по руссификации интерфейса.)


Что такое шрифт


Файл шрифта (font file) содержит наборы изображений (рисунков) символов и соответствующие символам коды. Технически шрифты могут быть растровыми (bitmap fonts) или векторными (outline/vector fonts).


Растровые шрифты обычно применяют для текстового интерфейса. Рисунок символа (глиф) здесь - прямоугольный набор точек. Например, если размер текстового экрана 640x480 пикселов, а терминал настроен в режиме 80x30 (80 символов в 30 строках), то подойдёт шрифт, в котором ширина глифа - 8 пикселов, а высота - 16 (16x8).


Пример того, как может выглядеть буква А в растровом шрифте с глифами размером 16x8 точек. Пустые/фоновые пикселы показаны символом ~, закрашенные/видимые - X.

~~~~~~~~

~~~~~~~~

~~~~~~~~

~~~~~~~~

~~~XX~~~

~~X~~X~~

~~X~~X~~

~X~~~~X~

~X~~~~X~

~XXXXXX~

~X~~~~X~

~X~~~~X~

~X~~~~X~

~X~~~~X~

~~~~~~~~

~~~~~~~~

Пустое место сверху можно оставить, чтобы строки не сливались, снизу - чтобы уместить, например, буквы р или у.


Отрисовка растровых глифов на экране - относительно простая операция отображения уже готовых наборов точек на пикселы дисплея. Но растровые шрифты обычно содержат глифы только одного размера. В GUI нередко требуется отрисовывать символы разных размеров (разного кегля) одновременно, поэтому применяют векторные шрифты. Как и прочие векторные изображения, глифы таких шрифтов содержат наборы параметров для математических фигур; при использовании шрифта программа "растеризУет" глифы (создаёт набор точек). Готовые растеризованные глифы называют "кэшем шрифта" (font cache).


Высоту заглавных символов называют "кеглем" (font size). Есть несколько шкал кегля; можно условно считать, что одна единица высоты примерно равна 0,3-0,4 мм. Например, "сделать двенадцатым кеглем" означает, что высота заглавных символов будет примерно 3,6-4,8 мм; "шрифт высотой десять" - 3-4 мм. Предполагается, что на разных мониторах растровые шрифты одинакового размера (в текстовом интерфейсе) выглядят различно; но векторные шрифты одного кегля (в GUI) должны выглядеть одинаково.


На не очень новых мониторах с разрешением около 100 dpi кегль 5 и ниже - неразборчиво мал; для виджетов обычно выбирают кегль 10 или 12.


Шрифты бывают моноширинными (monospace) и пропорциональными (proportional или не указано). "Моноширинный" означает, что все глифы одинаковой ширины, занимают одинаковое место по горизонтали; хотя между соседними символами в линии может быть видно немного свободного пространства (не пробелы), но сдвинуть символы поближе друг к другу не получится. Текстовый интерфейс - традиционно моноширинный. То есть, например, 80 символов в линии (видимой строке); символы выровнены по вертикали (строго друг над другом). В пропорциональном шрифте, например, символы Щ и Л - разной ширины; в линиях одного виджета (например, текстовой области) может умещаться разное число символов.


Основную графическую идею (стиль) шрифта называют "гарнитУрой" (typeface, или font face). Символы одной гарнитуры схожи примерно так же, как инструменты из одного набора или предметы посуды из одного сервиза.


Есть несколько классификаций гарнитур. В простых случаях выделяют "рубленые" шрифты (без засечек, sans serif) - обычно для заголовков или надписей; и шрифты "с засечками" (serif) - обычно для основного текста. ЗасЕчка - небольшой декоративный поперечный штрих на конце черты некоторого символа. "Декоративные" шрифты (в названии может быть script) - имитация письма от руки. Есть шрифты, состоящие разных вспомогательных символов (symbols, dingbats), например, шахматных фигур, маркеров или орнаментов.


Внутри гарнитуры могут быть дополнительные стили - "начертания" (slants); обычно это нормальное начертание (Medium, Normal, Regular или Roman), курсИв[ное] (Italic, или Oblique), жирное/полужирное (Bold/Semibold). Начертания хранят в отдельных файлах; некоторые графические редакторы или офисные текстовые процессоры могут имитировать начертания, имея лишь один файл с нормальным начертанием.


Шрифты в текстовой консоли


Формат файлов шрифтов для текстового режима Linux - PC Screen Font (".psf" или ".psfu"). Здесь u означает Unicode. (Раньше для русского языка были кодировки KOI-8R и CP1251.) Документация по PC Screen Font есть в пакете kbd (/usr/share/doc/kbd/).


Сами файлы шрифтов обычно хранят в /usr/share/consolefonts, /usr/share/syscons/fonts/, /usr/share/kbd/consolefonts или в /usr/share/fonts. Обычно файлы дополнительно сжаты gzip. Размер - несколько КиБ. Файлы, включающие и глифы кириллицы, обычно имеют в имени Cyrillic или сокращённо cyr.


Традиционный шрифт - VGA или Fixed, более новый и приятный для глаз - Terminus. Пример файла шрифта гарнитуры Fixed:


$ cd /usr/share/consolefonts

$ file -z CyrSlav-Fixed16.psf.gz

CyrSlav-Fixed16.psf.gz: Linux/i386 PC Screen Font v1 data, 256 characters, Unicode directory, 8x16 (gzip compressed data, last modified: Wed Feb 1 12:35:37 2017, max compression, from Unix)


В настоящее время текстовая консоль Linux может использовать шрифты в кодировке Unicode (по умолчанию - кодировка CP437 и встроенный в ядро шрифт). В шрифте допустимо 512 глифов; возможно отображение 8 цветов. Или 256 глифов, но 16 цветов. Показать набор символов текущего шрифта (выполнять в текстовой консоли, не в эмуляторе терминала):


$ showconsolefont


Для правильного соответствия глифов кодам Unicode - нужна вспомогательная таблица (translation map, unimap), которая раньше хранилась в отдельном файле, а сейчас может входить в основной файл шрифта (обычно, но не обязательно, с расширением ".psfu"). Таблицы unimaps (".acm" или ".acm.gz") хранят в /usr/share/consoletrans/, /usr/share/unimaps или /usr/share/syscons/scrnmaps/. Программа psfgettable служит для копирования таблицы unimap из шрифта; psfaddtable - для добавления.


Вспомогательные программы для правки шрифтов: nafe (https://sourceforge.net/projects/nafe/), psftools (https://tset.de/psftools/index.html), rw-psf (https://github.com/talamus/rw-psf). Они конвертируют символы в ascii-art (вроде вышеуказанного примера буквы А) или растровые изображения. После правки в текстовом или графическом редакторе можно конвертировать файл обратно в шрифт.


Настройки применения шрифта - файл /etc/default/console-setup или ~/.console-setup.


Применить настройки на текущей консоли:


$ setfont

# или

$ setupcon


Пакеты программ: kbd, console-setup. Документация: man-страницы console-setup, setfont, setupcon. В инсталляциях с systemd может быть файл настроек /etc/vconsole.conf и сервис systemd-vconsole-setup.service. Документация: man-страницы systemd-vconsole-setup.service, vconsole.conf.


Шрифты в графической консоли


Форматы шрифтов для GUI:

Portable Compiled Font (PCF, ".pcf" или сжатый ".pcf.gz"), растровый;

Bitmap Distribution Format (BDF, ".bdf" или сжатый ".bdf.gz"), растровый;

TrueType Font (TTF, ".ttf"), векторный;

OpenType Font (OTF, ".otf"), векторный;

Type 1 PostScript font ASCII (PFA, ".pfa"), векторный;

Type 1 PostScript font binary (PFB, ".pfb"), векторный;

и ещё несколько более редких.


Наиболее популярные форматы: TTF, OTF (и их контейнер для веб-страниц - Web Open Font Format, ".woff"/".woff2").


Размеры файлов - от сотен КиБ до нескольких МиБ или ещё больше; зависит от количества символов (которых могут быть тысячи). Обычно файлы, содержащие латиницу и кириллицу, специально не помечаются. Файлы, содержащие символы восточных языков, содержат в имени указание на язык, например: arabic, thai.


$ cd /usr/share/fonts/truetype/noto

$ file NotoSans-Regular.ttf

NotoSans-Regular.ttf: TrueType font data

$ ls -ks NotoSans-Regular.ttf

300 NotoSans-Regular.ttf


Графическая подсистема X Window System задействует шрифты сама или через библиотеки. X-программа (клиент сервера X Window) может запросить отрисовку шрифта по записи формата X Logical Font Description (XLFD). Запись состоит из 14 полей через дефисы. Пример:


-cronyx-times-medium-i-*-*-14-*-100-100-*-*-iso10646-1


Здесь cronyx - семейство шрифтов, times - гарнитура, medium и i (italic) - начертания, 14 - кегль, 100 - предполагаемые разрешения дисплея по горизонтали и вертикали, iso10646 и следующее поле - кодировка. Остальные поля менее важны; звёздочка является метасимволом и предлагает программе самой выбрать значение поля.


Значения можно подбирать GUI-программой xfontsel. Кнопка select копирует запись в буфер X, откуда её можно вставить в редактор средней кнопкой мыши (колёсиком).


Посмотреть список доступных серверу шрифтов - xlsfonts.

Посмотреть таблицу глифов - xfd (или вообще указать некоторой X-программе использовать заданный шрифт опцией -fn):


$ xfd -fn '-cronyx-times-medium-i-*-*-14-*-100-100-*-*-iso10646-1'


Кодировка iso10646 - одно из названий Unicode. Поддержка Unicode в самой X Window System работает плохо, поэтому сейчас юникодные шрифты обрабатываются отдельными библиотеками. Но желательно иметь хоть какой-то шрифт в одной из кодировок семейства iso8859 или иной - просто для начального запуска сервера X Window.


Настройки применения шрифтов в общем файле /etc/X11/xorg.conf:


Section "Files"

FontPath "/usr/share/fonts/X11/misc"

FontPath "/usr/share/fonts/X11/cyrillic"

# Прочие параметры этой секции...

EndSection


В указанных каталогах следует запустить программы mkfontscale и mkfontdir. В результате должны появиться файлы encodings.dir, fonts.alias, fonts.dir.


Шрифт можно подключить временно, вручную:


# Добавить каталог.

xset +fp /usr/share/fonts/X11/misc

# Перечитать списки шрифтов.

xset fp rehash


Вспомогательная шрифтовая библиотека для GUI - Fontconfig. Она ведёт каталоги установленных в системе шрифтов и предоставляет программам шрифты, подходящие по требованиям. Библиотека Fontconfig сама не занимается растеризацией шрифтов.


К библиотеке прилагается семейство программ fc-*, в том числе:


fc-cache - создать/пересоздать кэш шрифтов;


fc-list - показать список установленных в системе шрифтов (выводится много информации, в том числе поддерживаемые языки). Возможно задать условие, например (вывод сокращён):


# Показать установленные шрифты, имеющие символы русской кириллицы.

$ fc-list -f '%{family}\n' :lang=ru

Liberation Sans

URW Gothic L

URW Palladio L

Noto Sans

DejaVu Sans,DejaVu Sans Light

URW Palladio L

FreeMono

Nimbus Roman No9 L


fc-validate - узнать, есть ли в шрифте символы алфавита для заданного языка, например:


$ cd /usr/share/fonts/truetype/noto

$ fc-validate -l ru NotoSans-Regular.ttf

NotoSans-Regular.ttf:0 Satisfy the coverage for ru language

$ fc-validate -l en NotoSans-Regular.ttf

NotoSans-Regular.ttf:0 Satisfy the coverage for en language

$ fc-validate -l ru NotoKufiArabic-Regular.ttf

NotoKufiArabic-Regular.ttf:0 Missing 66 glyph(s) to satisfy the coverage for ru language

$ fc-validate -l en NotoKufiArabic-Regular.ttf

NotoKufiArabic-Regular.ttf:0 Missing 72 glyph(s) to satisfy the coverage for en language

$ fc-validate -l ar NotoKufiArabic-Regular.ttf

NotoKufiArabic-Regular.ttf:0 Satisfy the coverage for ar language


То есть в основном файле есть символы для русского, английского языков; в файле для арабского языка есть только арабица.


Документация: man-страницы; HTML-документация в /usr/share/doc/fontconfig. Обозначения языков - по RFC-3066/ISO 639.


Основной XML-файл настроек Fontconfig - /etc/fonts/fonts.conf. Документация: man fonts-conf. Там же указаны имена других файлов, например пользовательский ~/.config/fontconfig/fonts.conf (устаревший: ~/.fonts.conf).


Каталоги для хранения шрифтов: общий /usr/share/fonts/, пользовательский ~/.local/share/fonts/ (устаревший: ~/.fonts/). В fonts.conf можно указать другие.


Желательно иметь в GUI: пропорциональные шрифты с засечками и без них (для большинства виджетов), моноширинный шрифт (для эмулятора терминала), шрифт со вспомогательными символами (для офисного текстового процессора).


Семейства свободно доступных шрифтов, которые считают приятными для глаз: Cantarell, Droid, Noto, Ubuntu. Шрифты со вспомогательными символами: OpenSymbol, Symbola; или Dingbats и Wingdings из Windows.


Для установки шрифта, поддерживаемого Fontconfig, нужно скопировать его файлы в один из каталогов хранения (можно во вложенный каталог). Желательно правильно установить целевые права, например 444 для файлов и 555 для каталогов. Потом запустить fc-cache (может сработать автоматически).


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


Для офисных документов популярны семейства шрифты из Windows: Arial, Courier New, Times и другие (форматы TTF, OTF).


Их можно скопировать из инсталляции Windows (каталог Windows\Fonts\).


В дистрибутивах могут быть пакеты, копирующие файлы шрифтов из Интернета. Помещать сами эти шрифты в пакет запрещено лицензионным соглашением.


Можно скопировать их из Интернета самостоятельно и распаковать программой cabextract. Ищите в репозиториях сервиса SourceForge.net по выражению "Microsoft core fonts".


Для подстановки можно применять шрифты семейства Liberation (соответственно Sans, Mono, Serif). Они, насколько возможно, "метрически совместимы" (metrically compatible) со шрифтами из Windows, то есть глифы сходных размеров. Другие метрически совместимые шрифты:


семейство Croscore (соответственно Arimo, Cousine, Tinos);

[Astra] Sans, [Astra] Serif и Mono от фирмы Paratype;

семейство XO Fonts (Oriel, Courser, Thames, символьные шрифты Symbol и Windy).


В графической подсистеме X Window System растеризацией занимается своя библиотека Xft. В последние годы операции растеризации передаются внешним библиотекам: Cairo, FreeType, Pango. Графическая подсистема Wayland сама никак не взаимодействует со шрифтами, все программы обращаются к внешним библиотекам.


Растеризованные глифы малого кегля могут выглядеть грубо/нечётко. Чтобы улучшить вид, применяют методы отрисовки под общим названием "сглаживание" (anti-aliasing). Иногда сглаженные глифы выглядит отчасти цветными из-за "субпиксельного рендеринга" - то есть дорисованные пикселы не чёрные или серые, а других цветов. Эффект зависит от порядка расположения цветных элементов (субпикселов) в пикселах.


В шрифтах TrueType могут быть дополнительные встроенные данные (hints) по отрисовке; их применение называется "хИнтинг" (hinting). В библиотеке FreeType наилучший алгоритм отрисовки (TrueType Bytecode Interpreter) был запрещён патентами примерно до 2010 года/версии 2.4.


Сглаживание и хинтинг обычно можно указать в центре настроек графической среды. Либо вручную - в своём или общем файле fonts.conf, например (фрагмент):


<!-- Включить сглаживание. -->

<match target="font">

<edit name="antialias" mode="assign">

<bool>true</bool>

</edit>

</match>

<!-- Включить хинтинг. -->

<match target="font">

<edit name="hinting" mode="assign">

<bool>true</bool>

</edit>

</match>

<!-- Полный (максимальный) хинтинг. -->

<match target="font">

<edit name="hintstyle" mode="assign">

<const>hintfull</const>

</edit>

</match>

<!-- Расположение субпикселов. -->

<match target="font">

<edit name="rgba" mode="assign">

<const>rgb</const>

</edit>

</match>


Программы, запрашивающие шрифт, в общем случае не могут рассчитывать на конкретное семейство/гарнитуру. Чтобы получить хоть какой-то подходящий шрифт (подстановка шрифта), обычно объявлены сколько-то псевдонимов (font aliases), например: sans-serif, serif, monospace. Пример для monospace:


<alias>

<family>DejaVu Sans Mono</family>

<default>

<family>monospace</family>

</default>

</alias>

<alias>

<family>monospace</family>

<prefer>

<family>DejaVu Sans Mono</family>

</prefer>

</alias>


Узнать текущий псевдоним:


$ fc-match monospace

DejaVuSansMono.ttf: "DejaVu Sans Mono" "Book"


Программы для GUI:


просмотреть установленные шрифты (+ установить/удалить):

Просмотрщик шрифтов (gnome-font-viewer) для GNOME;

Font Manager (gtk2 + python);

Font Viewer (kfontview и вспомогательный установщик kfontinst) и модуль kcmshell fontinst для KDE;


редактор - FontForge.

89

Файлы ярлыков приложений (".desktop") и их меню

В Linux значки и описания программ (приложений) хранятся отдельно от исполняемых файлов. Для GUI-программ составляют "файлы рабочего стола" (desktop files), схожие по назначению с ярлыками в Windows. Более удобного имени нет, поэтому пусть и здесь будут ярлыками.


Расширение - ".desktop"; имя любое. Формат ярлыков схож с форматом файлов ".ini" в Windows. То есть это структурированный текст, разделённый на группы; имя группы в квадратных скобках; в группах заданы строки-параметры вида "ключ=значение"; строка-комментарий начинается с #.


Общие ярлыки приложений хранят в /usr/share/applications; свои - в ~/.local/share/applications. Для примера - сценарий оболочки и его ярлык.


Сценарий:


#/usr/bin/env bash


# Сценарий top10t.sh

# Хранить следует здесь: ~/.local/bin/

# Сделать исполняемым: chmod u+x ~/.local/bin/top10t.sh


# Десять самых жадных до процессора процессов/потоков.

# Процессы отсортированы по убыванию жадности.

# Ежесекундное обновление.


/usr/bin/watch -p -n 1 \

"ps k -%cpu -eL -o pid,comm,%cpu | head"


# Завершить - Ctrl C.


Ярлык:


# ~/.local/share/applications/top10t.sh.desktop


# Общее название группы для всех файлов ".desktop".

# Строка [Desktop Entry] - первая; прочие - в любом порядке.

[Desktop Entry]


# Какой версии спецификации соответствует сам этот файл.

# Свежая - 1.1. Не обязательно.

Version=1.0


# Кодировка самого файла. Обычно - UTF-8.

# Списки есть, например, у iconv. Не обязательно (устарело).

# Encoding=UTF-8


# Тип объекта: Application - приложение;

# Directory - категория; Link - ссылка на ресурс Интернета.

Type=Application


# "Категория" здесь - это заголовок подменю

# в общем меню приложений. Здесь не переводится.

# В значении может быть несколько частей,

# их отделять символом ;.

# И в конце строки рекомендуется поставить символ ;.

# Если символ ; используется сам по себе - экранировать: \;.

Categories=System;Utility;


# Команда для запуска. Желательно указать полный путь.

# Можно короткое имя, если программа доступна через $PATH.

# Если нужно запустить с правами суперпользователя,

# то нужно начинать команду, например, с gksudo -gk.

# Понадобится установить программу gksudo или kdesudo.

Exec=top10t.sh


# Рабочий каталог. Не обязательно.

Path=/home/student


# Нужно ли сначала открыть окно эмулятора терминала,

# а потом запустить в нём значение Exec.

# "Да" - true; "нет" - false. Обычно "нет".

Terminal=true


# Файл значка. Обычно указывают короткое имя без расширения.

# Стандартные форматы файлов: PNG, SVG (SVGZ).

# Значки обычно хранят в /usr/share/icons.

Icon=utilities-terminal


# Нужно ли оповещать о запуске: помигать указателем мыши

# или аплетом списка задач и тому подобное. Обычно "да".

StartupNotify=true


# Название ярлыка, видимое как подпись к значку или

# как имя пункта в меню. Здесь на английском.

Name=Top 10 greedy threads


# Желательно перевести. Список условных обозначений

# языков есть, например, у locale.

Name[ru]=Десять самых жадных потоков


# Описание, обычно видимое как всплывающая подсказка.

Comment=Shows Top 10 cpu eating processes/threads


# Желательно перевести.

Comment[ru]=Показывает 10 самых жрущих ЦПУ процессов/потоков


# Не показывать в меню. Обычно "нет".

# Файловые ассоциации, если есть, будут работать.

NoDisplay=false


# Не показывать в меню, убрать из файловых ассоциаций.

# И вообще сделать вид, что приложения не существует.

# Обычно "нет".

Hidden=false


# Показывать только в указанной рабочей среде:

# GNOME, KDE, Xfce, ещё какие-нибудь через ;.

# OnlyShowIn=GNOME;


# Не показывать в указанных рабочих средах.

# В файле должен быть только один из параметров:

# либо OnlyShowIn, либо NotShowIn.

NotShowIn=KDE;


Такие файлы можно помещать на Рабочий стол по необходимости: перетаскиванием; или же копированием/ссылкой файла в ~/Рабочий стол (англоязычный - ~/Desktop). Расположение каталога рабочего стола может быть указано в файле ~/.config/user-dirs.dirs. Его читает программа xdg-user-dirs-update, создавая указанные каталоги.


Проверить синтаксическую корректность ярлыка можно программой desktop-file-validate.


Если нужно на Рабочий стол добавить каталог, то может быть достаточно символьной ссылки. Или составить ярлык, где в Exec будет имя диспетчера файлов либо xdg-open, а потом аргумент - путь к каталогу:


Exec=xdg-open /home/student/Загрузки


В среде GNOME разработчики пытаются запретить размещение файлов на Рабочем столе. Может понадобиться специальное расширение для GNOME Shell.


Ярлык для адреса Интернета имеет другое значение Type и вместо ключа Exec содержит URL:


# Помимо прочего:

Type=Link

URL=https://www.freedesktop.org/wiki/


Адрес будет открыт браузером по умолчанию. Если нужен другой браузер, следует сделать обычный ярлык с Type=Application, далее в Exec задать имя браузера с аргументом-URL.


Есть сколько-то общепринятых категорий в спецификации к файлам меню: Audio, Education, Graphics, System и другие. Файлы категорий синтаксически аналогичны файлам ярлыков. Расширение - ".directory". Хранят их обычно в /usr/share/desktop-directories. Свои - в ~/.local/share/desktop-directories. Пример файла для категории "Система" (условное имя файла - system.directory). Не используйте его как есть.


[Desktop Entry]

Version=1.0

Type=Directory

Icon=preferences-system

Name=System

Name[ru]=Система

Comment=System tools and utilities

Comment[ru]=Средства администрирования системы


Графическая среда обычно автоматически при запуске каждого сеанса пересобирает меню из имеющихся ярлыков и категорий для каждого пользователя.


Формат файлов меню - XML. Расширение - ".menu". Только пример, без пояснений. Не используйте его как есть.


<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE Menu

PUBLIC '-//freedesktop//DTD Menu 1.0//EN'

'http://standards.freedesktop.org/menu-spec/menu-1.0.dtd'>

<Menu>

<Name>System</Name>

<Directory>system.directory</Directory>

<DefaultAppDirs/>

<DefaultDirectoryDirs/>

<MergeDir>applications-merged</MergeDir>

<Layout>

<Merge type="menus" />

<Filename>top10t.sh.desktop</Filename>

<Merge type="files" />

</Layout>

</Menu>


Проверить синтаксическую корректность меню можно программой xmllint. Все меню не проходят валидацию (не находится DTD), вероятно, из-за беспорядка на сайте FreeDesktop.org.


Редакторы меню для GUI: KMenuEdit для KDE; LXMenuEditor (lxmed) для LXDE, требует Java; MenuLibre для GNOME, XFCE; Mozo для Mate.


Свои меню хранят в ~/.config/menus. Точнее, в $XDG_CONFIG_DIRS/menus/${XDG_MENU_PREFIX}applications.menu. Здесь XDG_MENU_PREFIX - это "gnome-", "kde-" и тому подобное.


Своё меню вроде как должно перекрывать (заменять собой) автоматическое. Добавочные (не перекрывание, а слияние) меню хранят в $XDG_CONFIG_DIRS/menus/applications-merged/.


Документация: ярлыки; меню. Для семейства программ xdg-* и desktop-* есть man-страницы. XDG (X Desktop Group) - старое название сообщества FreeDesktop.org.


У Debian (и производных) есть своя система меню, отличающаяся от XDG. Эти меню применяют в разных небольших диспетчерах окон: awesome, fvwm, openbox и других. Документация - в пакете menu.

60

Автозапуск программ в Linux

(Кроме некоторых средств системы инициализации.)


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


Традиционные в UNIX средства автозапуска программ в определённое время ("планировщики заданий") - at и cron (и их демоны с суффиксом d). Программа at запускает указанную программу однократно; cron - регулярно по расписанию. Если, конечно, компьютер в нужное время окажется включён. Иначе at запустит запоздавшую команду как можно скорее, а cron - в следующий раз (если разница во времени больше трёх часов, иначе - как можно скорее).


Запланированные команды для at принимаются из заранее подготовленного файла опцией -f или со стандартного ввода. Также программа может принимать новое задание интерактивно, подобно оболочке или cat. Сначала нужно запустить at с аргументами - временем и датой запуска (например, только время 09:30). Появится дополнительное приглашение командной строки. Ввод команды завершают клавишей Enter, а потом сочетанием Ctrl D. Введённая команда будет запущена с помощью упрощённой оболочки /bin/sh.


Формат времени здесь очень разнообразен, может включать небольшие осмысленные выражения на английском, например:


echo 'notify-send "Have a break!"' | at noon tomorrow


Выражение "at noon tomorrow" переводится как "завтра в полдень" (слово at здесь - имя программы, а не часть времени). Программа notify-send показывает на Рабочем столе всплывающее сообщение (popup message) с указанным текстом. В приведённой команде сначала идёт одиночная кавычка, потом двойные, снова двойные (замыкающие) и одиночная (замыкающая первую одиночную). Если сомневаетесь в надёжности такого способа указания даты и времени, задавайте их точно в формате "ЧЧ:ММ ДД.ММ.ГГГГ" (без кавычек и, если нужно, с ведущими нолями), например: 16:45 28.09.2018.


Программа atq показывает пронумерованную очередь заданий (job queue); подробнее о задании - at с опцией -c и номером; удалить задание - atrm и номер. Файлы "at.allow" и "at.deny" в /etc содержат списки пользователей, которым соответственно разрешено и запрещено обращаться к at.


Сама at выполняется со своим окружением (обычно root), поэтому задание на вывод видимого сообщения может провалиться. Программа notify-send не требует дополнительных действий, когда отправляете сообщение себе. Другим программам (например: xmessage или gxmessage, zenity) может понадобиться явно указать переменную дисплея:


echo 'env DISPLAY=:0.0 xmessage "Hello!"' | at 15:10


Чтобы вывести сообщение в текстовую консоль, может понадобиться перенаправить текст в выясненный заранее (программами ps, tty, w) файл консоли:


echo 'echo "Hello!" > /dev/pts/1' | at 09:30


Хотя для отправки сообщения лучше воспользоваться программой wall или write. Или локальной электронной почтой. Документация: man-страницы at, echo, mail или mailx, notify-send, tty, wall, write, xmessage.


Файлы заданий для at и cron хранятся в каталоге /var/spool/cron. Файлы общесистемных настроек cron - /etc/crontab и готовые каталоги, чьё имя начинается на cron, в /etc.


Программа crontab вызывает текстовый редактор (обычно vi) и сохраняет пользовательский файл заданий для cron (имя задавать не требуется, просто вызовите команды сохранения и выхода). Просмотреть список своих cron-заданий - crontab -l (строчная L); редактировать список - crontab -e; полное удаление своего списка - crontab -r.


Файл заданий crontab - текстовая таблица, подобно fstab. Одна строка (запись) на каждое задание. Поля: минута, час, число, месяц, день недели, пользователь (в общесистемном файле), само задание (команда). Звёздочка здесь означает "каждая единица времени" (ежечасно, ежедневно...). Последнюю строку файла традиционно следует завершать клавишей Enter. Для примера просмотрите файл /etc/crontab. Документация: man-страницы cron, crontab(1), crontab(5).


В systemd встроена своя функциональность запуска программ по времени при помощи объектов типа "таймер" (".timer"). Документация: man "systemd.timer".


Чтобы автоматически запускать какие-то программы при запуске текстового сеанса, можно записать их команды в стартовые файлы оболочки (например, в файл "~/.bashrc"). Команды следует записывать как фоновые (заканчивать символом &).


Чтобы автоматически запускать какие-то программы при запуске графического сеанса, их сценарии или файлы ".desktop" нужно поместить в каталог "~/.config/autostart" (общий каталог - /etc/xdg/autostart). Готовые файлы ".desktop" обычно хранятся в каталоге "~/.local/share/applications" (общий каталог - /usr/share/applications/). В программах настройки графических сред могут быть модули для настройки списка автозапускаемых программ. Более старый способ - добавление команд в файл-сценарий "~/.xinitrc" или "~/.xprofile" (аналогично файлу "~/.bashrc").


Набор программ "inotify tools" - средство автозапуска программ по какому-то событию файловой системы (например, если некий файл был изменён). Пример:


while true; \

do inotifywait -e modify report.txt \

&& cp report.txt report-$(date "+%Y.%m.%d_%H:%M:%S").txt; \

done


Эту команду можно было набрать в одну строку без знаков \. Здесь создан так называемый "цикл с предусловием" (while loop). Программа inotifywait наблюдает событие типа "запись" (модификация, modify) для файла "report.txt" и, получив его, завершается успешно (код завершения 0). После этого программа cp делает копию изменённого файла с именем вида report-2018.09.08_14:36:57.txt. Цикл нужен, чтобы бесконечно повторять (перезапускать) пару программ "inotifywait - cp", то есть отслеживать каждый случай записи. Проверьте это: откройте файл "report.txt" в редакторе, внесите изменения и сохраните файл. Прервать - Ctrl C. Функциональность inotify является частью ядра. Документация: man-страницы bash, inotify(7), inotifywait, "Advanced Bash-Scripting Guide" автора Mendel Cooper.

Отличная работа, все прочитано!