Linux Mint и его Cinnamon. Очерки применителя
Шрифт:
$ < chapter[01-10] > mybook
мы на выходе из разрозненных глав получаем готовую книгу.
Таким образом мы перешли уже к множественному перенаправлению. Применение которого просмотром файлов не исчерпывается — их содержимое может быть перенаправлено не только на стандартный вывод, но и на ввод какой-либо команды, подменяя командный конвейер. Например, конструкция вида
$ sort < file_{1,2}
совместно отсортирует строки обоих файлов, file_1 и file_2, точно так же, как это сделал бы конвейер команд
$ cat file_1 file_2 | sort
Кстати, перенаправление вполне может играть
$ time commandname [options] [arguments] > filename | cat
занесёт время выполнения некоей команды в файл с одновременным выводом его на экран, заменяя команду tee. Это особенно полезно при всяких «тестированиях на быстродействие», когда надо и сохранить результат для дальнейшей обработки, и не терпится посмотреть на него сразу.
Множественное перенаправление удобно использовать для суммарного подсчёта числа символов в нескольких файлах таким образом:
$ wc -m <*txt
Что на выводе даст единственное число, например:
5382
Казалось бы, та же команда в «обычной» форме даже короче на один символ:
$ wc -m *txt
Однако вывод её будет развёрнут:
2820 my_file_1.txt
606 my_file_2.txt
401 my_file_3.txt
1555 my_file_4.txt
5382 итого
Что при работе во встроенных терминальных окнах текстовых редакторов вроде Geany или Kate , часто небольших по размеру может оказаться лишним. А ведь именно там приёмы, подобные описанным в этом разделе, оказываются весьма эффективными.
В общем, уже за одну только конструкцию < filename разработчики Zsh заслужили памятник, а все остальные возможности расширенного и множественного перенаправления выступают как бесплатное приложение к ней.
Просто псевдонимы и псевдонимы глобальные
Что такое псевдонимы, по простому aliases, — знают все, кто применяет любую командную оболочку: их поддержка существует со времён перворождённого шелла Борна. Это один из простых способов минимизировать ввод командных директив, начиная с простейшего рекурсивного копирования файлов:
alias cp='cp -R'
И заканчивая бессчётным количеством псевдонимов для команды ls.
Однако в Zsh есть ещё одна фича — глобальные псевдонимы, по сей день не имеющие аналогов, насколько я знаю, во всяких там ваших башах. И даже в почти соплеменных тсишах их нет.
Но начну по порядку. Опять же, кого не раздражала ситуация: в ответ на поиск файла 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 path3 -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.
Разумеется, здесь не описаны все возможные случаи употребления глобальных псевдонимов — они лимитируются только потребностями применителя и его фантазией. И, конечно, наказом, который дал атаман Платов небезызвестному Левше:
Не пей мало, не пей много, а пей средственно.
То есть — не придумывайте глобальных псевдонимов больше, чем сможете запомнить.
Псевдонимы-суффиксы
Кроме обычных и глобальных псевдонимов, в Zsh существует ещё одна их разновидность — псевдонимы «суффиксные», более удачного определения на языке родных осин я не придумал, псевдонимы.
Подобно тому, как добаление к команде alias опции -g с помощью магии превращает обычный псевдоним в глобальный, так и опция -s делает обычный псевдоним «суффиксным». То есть привязывает суффикс имени файла (те, кто, подобно автору этих строк, затронуты порчей чёрным DOS'ом, до сих пор часто называют его «расширением») к некоей программе, которая может сотворить над ним нужное действо. Например, если задать псевдоним такого вида