За что я люблю Zsh. Просто псевдонимы и псевдонимы глобальные

Алексей Федорчук

Что такое псевдонимы, по простому aliases, — знают все, кто применяет любую командную оболочку: их поддержка существует со времён перворождённого шелла Борна. Это один из простых способов минимизировать ввод командных директив, начиная с простейшего рекурсивного копирования файлов:

alias cp='cp -R'

И вплоть до псевдонимов для команды apt, с указанием её субкоманд и опций, да ещё в случае, когда она сама вытупает как аргумент команды sudo.

Ведь, положа руку на сердце, кто из нас, успешкно отыскав наконец в репозитории нужный пакет (особенно если это репозиторий — PPA), не бросался тут же его инсталлировать? Забывши о том, что искать пакет и тварь дрожащая може, а вот инсталлировать — только тварь, право root’а имеющая…

Так вот, для предотвращения забытия своего места напрашивается такой набор псевдонимов:

## Aliases for apt
alias aptin='sudo apt install --yes'
alias apter='sudo apt purge'
alias aptup='sudo apt update'
alias aptug='sudo apt upgrade'
alias aptse='apt search'
alias aptsh='apt show'

Правда, тут надо знать меру: если псевдонимов определено слишком много, возникает мысль — а не проще ли было бы запомнить сопутсвующие им опции, аргументы, и прочих примкнувших Шепиловых? И, кроме того, есть ещё одно решение, которое кажется мне более изяшным.

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

Но начну по порядку. Опять же, кого не раздражала ситуация: в ответ на поиск файла find’ом или поиск фрагмента текста grep’ом выбдаётся сто пятьсот экранов сообщений, что доступ к каталогу запрещён?

Разумеется, каждый применитель Bash’а знает, как с этим бороться — достаточно присобачить к конструкции поиска посредством той или другой утилиты маленький аппендикс в виде 2> /dev/null, отправляющий в небытие все сообщения об ошибках.

Сложнее применителям Tcsh — там подавления вывода нежелательных сообщений об ошибках возможно в виде такой конструкции:

% (command > out)>& err

где command — команда со всеми её опциями и аргументами, out — условное имя файла, в который перенаправляется «полезный» вывод команды, а & в данном контексте представляет весь остаток от оного, то есть сообщения об ошибках, которые помещаются в файл err. Имя последнего также условно, так что никто не запрещает подменить его сакраментальным /dev/null.

Конструкция далеко не столь проста, как в sh-совместимых оболочках типа Bash. Кроме того, для просмотра «полезного» вывода она потребует ещё одной команды — вызова какого-либо пейджера вроде less:

% (command > out)>& err ; less out

А вот применителям Zsh — проще всех. Им достаточно задать такой глобальный псевдоним:

$ alias -g N='2>/dev/null'

где -g указывает, что следуюющий символ (или символы) являют собой на простой псевдоним, а глобальный, N — его имя, а следующя после равенства последовательность в строгих кавычках — подменяемое им выражение. После чего можно практиковать такое:

$ find path2 -name [filename] N

И больше не заботиться о фильтрации зёрен от плевел.

Глобальные псевдоними очень полезны в командных конструкциях перенаправления по конвейеру, например, для поэкранного вывода:

$ alias -g L='|less'

Пример для «пролистывания» вывода команды dmesg:

$ dmesg L

Для фильтрации по вхождению «слова» можно задать такой глобальный псевдоним:

alias -g G='|grep'

После чего использовать его в конструкциях, подобных такой:

$ dmesg G raid

что выведет нечто вроде

[    1.434246] md: raid0 personality registered for level 0
[    1.434376] md/raid0:md0: md_size is 390742016 sectors.
...

Мне весьма полезен такой глобальный псевдоним

alias -g W='|wc -m'

Поскольку часто требуется прибегать к такой

$ cat filename W

которая в данном случае выведет число символов в текстовом файле — для меня оно важнее числа байт (а при использовании 16-битной кодировки для преимущественно кириллического текста эти значения не совпадают).

К именам глобальных псевдонимов применяются те же требования, что и к именам псевдонимов обычных: они должны быть по возможности короткими, мнемонически прозрачными. И, разумеется, определения всех постоянно используемых глобальных псевдонимов следует занести в свой кондуитик — то есть в ~/.zshrc.

А теперь вернёмся к команде apt и занесём в ~/.zshrc глобальные псевдонимы для тех её форм, которые требуют административных привилегий:

alias -g Au='apt update'
alias -g Ai='apt install --yes'
alias -g Ap='apt purge'

После чего можно применять команду

$ sudo Au

для обновления кеша пакетов,

$ sudo Ai

для инсталляции нужного пакета, и

$ sudo Ap

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

$ aptse [package_name]

просмотрел его зависимости через

$ aptsh [package_name]

И в дальнейших напоминаниях не нуждается. А вот при удалении пакета, кажущегося ненужным, лишний раз подумать — не лишне, и потому в последнем случае такой опции нет.

И, разумеется, сам пророк Заратуштра завещал подмену глобальным псевдонимом жуткой конструкции добавления стороннего репозитория:

alias Ar='add-apt-repository'

После чего применять его в конструкции

$ sudo Ar [ppa-name]

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

Не пей мало, не пей много, а пей средственно.

То есть — не придумывайте глобальных псевдонимов больше, чем сможете запомнить.

Содержание

Добавить комментарий