zsh (перевод)

Как правильно задавать вопросы Правильно сформулированный вопрос и его грамотное оформление способствует высокой вероятности получения достаточно содержательного и по существу ответа. Общая рекомендация по составлению тем: 1. Для начала воспользуйтесь поиском форума. 2. Укажите версию ОС вместе с разрядностью. Пример: LM 19.3 x64, LM Sarah x32 3. DE. Если вопрос касается двух, то через запятую. (xfce, KDE, cinnamon, mate) 4. Какое железо. (достаточно вывод inxi -Fxz в спойлере (как пользоваться спойлером смотрим здесь)) или же дать ссылку на hw-probe 5. Суть. Желательно с выводом консоли, логами. 6. Скрин. Просьба указывать 2, 3 и 4 независимо от того, имеет ли это отношение к вопросу или нет. Так же не забываем об общих правилах Как пример вот
Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1649
Зарегистрирован: 10 сен 2016, 10:16
Решено: 19
Откуда: Москва
Благодарил (а): 693 раза
Поблагодарили: 187 раз
Контактная информация:

zsh (перевод)

#1

19 авг 2018, 09:26

В настоящий момент, это, пожалуй, самая полная информация о zsh на linuxmint.com.ru
Ссылки на источники прилагаются.
==========================
Начну с цитаты от Алексея Федорчука:
"Начинаем настройку
Без этого нам, скорее всего, не обойтись. В свежеустановленном zsh мы имеем шанс не увидеть почти ничего из описанных выше прелестей — ни развертывания сокращений путей, ни автодополнений опций и аргументов, ни выразительных приглашений командной строки. Перед нами будет безликая строка с именем машины (типа localhost%), которая едва-то будет справляться с обычным автодополнением команд и путей (и то — не обязательно). Могут возникнуть проблемы даже с вызовом собственной экранной документации man zsh. Почему?
Дело в том, что zsh имеет очень богатый набор собственных конфигурационных файлов, о которых я скажу чуть ниже. Но при установке его эти файлы не помещаются автоматически ни в каталог /etc, ни в домашний каталог пользователя — то есть ни в одно из тех мест, где их можно было бы ожидать. Конечно, совсем без первичных настроек zsh не останется: он прекрасно воспринимает их из таких общесистемных профильных файлов, как /etc/profile, /etc/login и т.д. Однако, во-первых, для этого он должен быть собран должным образом. А во-вторых, и вести себя при этом он будет почти точно также, как и соответствующие оболочки (bash или tcsh, а то и /bin/sh — почему, например, во FreeBSD zsh по первости не способен даже к автодополнению команд). От одного из этих профильных файлов zsh унаследует и переменные окружения, включая MANPATH — почему подчас не сможет найти и свою собственную документацию."
Не смотря на то, что это было написано в 2009 году, принципиально на этом фронте ничего не изменилось.
http://www.alv.me/zsh/#02

Пожалуй самая свежая статья по zsh которую мне удалось обнаружить в рунете это "Переход с bash на zsh" от 15 апреля 2017 г.
https://habr.com/post/326580/
Она не плоха, но слишком короткая, что бы по ней сделать полную настройку zsh "под себя". В ней есть примеры, но их мало. Разъяснения тоже весьма скупы (это дань краткому формату изложения). К тому же она описывает zsh версии 5.2.х, тогда как сейчас уже актуальная версия 5.5.1. Там же вы найдете ссылку на хорошую подборку плагинов к zsh.
Все остальные статьи еще древнее, и хоть и дают представление о данной оболочке и ее истории развития, но, тем не менее, они несколько устарели по синтаксису и фичам. Они также не особо обременены примерами.

Еще интересным сайтом для настройки zsh является ArchWiki https://wiki.archlinux.org/index.php/Zs ... %B8%D0%B9)
английская страница арч-вики посвященная zsh несколько отличается от русской, но мне показалось, что не значительно. В настройке своего конфига .zshrc я использовал многие советы именно с этого ресурса. Полагаю, что данные советы дистро-независимы.

На сайте альт-линукса тоже есть страничка посвященная настройке zsh (если не ошибаюсь, последняя правка на данной странице была в июне 2015г.; при беглом просмотре мне показалось, что команды для назначения setopt, например, изменились... хотя я могу и ошибаться).
https://www.altlinux.org/DotFiles/Shell ... 0.B8.D1.8F
там вы можете найти и советы, и готовый файл, и много справочной информации.

Для быстрой настройки данной оболочки можно воспользоваться результатами проектов Oh-My-Zsh (наиболее популярный) или Prezto (более новый и по отзывам пользователей более шустрый, но менее раскрученный вариант). Достоинства использования этих вариантов очевидны - вы можете запустить новую оболочку с новой темой и плагинами к ней в кратчайшие сроки подключив репозиторий и установив все пакеты в две-три-пять команд. Кто-то за вас уже позаботился об оптимизации выбраного вами варианта. Но недостатки тоже есть, выбирать вы будете скорее всего по красивому скриншоту, а не по функционалу, вы не будете знать, что же может в реальности данная сборка. Будете ходить как по минному полю, пока привыкнете к новым возможностям. Вполне возможно, что вы получите красивую обертку, но пользоваться ею будете исходя из своего опыта работы с bash (старыми приемами) не используя 90% возможностей такого продвинутого шелла как zsh.

Оптимальный вариант
Исходя из вышеизложенного, оптимальный вариант - это ознакомление с документацией разработчиков.
На сайте разработчика есть полная документация к текущей версии. Но она на английском, что затрудняет ее использование для НЕанглоговорящих россиян. И переводчиков столь нужной документации, к сожалению, не видать.
Я взял на себя труд перевести один-единственный документ из документации с сайта производителя https://sourceforge.net/projects/zsh/files/. Он заинтересовал меня именно обилием примеров. Именно, за счет примеров в этом документе можно многое увидеть и понять в затронутой теме (даже при посредственном переводе).

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

Документ выбраный мной для перевода, это intro.a4.pdf (43 страницы - сравните со ссылкой на хабр, там если распечатать получится 1-2 листа).
Интро (вступление, введение), по мнению разработчиков, должен показать возможности новой версии оболочки zsh и, видимо поэтому, изобилует примерами. Примеры, примеры и еще раз примеры - это главное достоинство этого документа. Для подводки к этим примерам, возможностей машинного перевода оказалось вполне достаточно. Разобраться в примерах опубликованных в Интро сможет даже новичок.

Не с первого раздела у меня выработалась "технология" перевода. Поэтому первый раздел (Filename Generation) получился самый трудночитаемый. Но переделывать его я не буду. Трудоемкость процесса не компенсируется. Та информация которая интересовала лично меня, находится ближе к концу (Shell Parameters и Prompting) и там для меня все более менее понятно. Любой желающий, может поправить мой "перевод" и предложить сообществу свою версию. Также, если позовлят модераторы, я могу вносить правки в текущее изложение на данном форуме linuxmint.com.ru
Для тех, кто легко читает по английски, я сохранил английский текст в первой части каждого из разделов (исключив код), а во второй части разделов вы найдете переведенный текст и блок кода с примерами. В третьей части, которая периодически присутствует, я (иногда) дописывал свои "мысли вслух".
Хотя англоговорящим айтишникам, я думаю, проще скачать документ с сайта разработчика и прочитать его в оригинале, т.к. при переводе и бесконечном копировании блоков текста туда-обратно, правке верстки (от пдф к хтмл, от хтмл к тхт, от тхт опять к хтмл) и т.п. неизбежно в "переводе" появились ошибки.

Также можно ознакомиться с The Z Shell Manual (тоже на английском)
http://zsh.sourceforge.net/Doc/Release/index-frame.html
На сколько я понял, этот Мануал рассчитан на более продвинутых пользователей чем Интро и больше знакомит с синтаксисом zsh. Однако, примеров использования zsh в нем нет.

Многие начинают свое восхищение данной оболочкой из-за удобных возможностей завершения команд в шеле (как самих команд, так и их опций и аргументов). Также сильно расширены возможности Хистори, которые многим заменяют поиск уже единожды выполненых сложных команд.
Но на мой взгляд, это хоть и мега-удобные функции, но по важности они стоят все-таки во втором ряду после глоббинга. Да и вытекают их возможности из него же. Вероятно, туда же, в первый ряд, стоит отнести Редактор командной строки CLE. Все остальные нижеперечисленные возможности оболочки также серьезно дополнены по сравнению с традиционными и вобрали в себя все лучшее, что вы сможете встретить в других *sh. Также есть у zsh и свои уникальные наработки.

Из недостатков стоит отметить пожалуй только один (являющийся неотъемлимым продолжением достоинств). Это сложность в настройке: - потому что каждому потенциальному пользователю zsh придется разобраться в возможностях данной оболочки, выбрать то, что нужно именно ему и уникально настроить ее "под себя".
==========================
И еще маленькое замечание для новичков: знак % в начале строки в zsh по умолчанию обозначает приглашение командной оболочки. А посему не надо его копировать при копировании примера. Конечно же это приглашение вы также можете настроить по своему вкусу и привести к виду $ или # или еще какому-нибудь из того что вам привычнее или извернуться и сделать так, как вам больше нравится (см. п. 16 Prompting (Промптинг - настройка приглашения шелла) и Настройка Приглашения шелла (дополнительный материал).

Ну а теперь содержание документа:
1. Introduction (Введение)
2. Filename Generation (Глоббинг - подстановка регулярных выражений вместо имени файла)
3. Startup Files (Файлы управляющие поведением zsh)
4. Directories (Директории)
5. Directory Stacks (Стеки директорий)
6. Command/Process Substitution (Замена команды / процесса)
7. Redirection (Перенаправление)
8. Aliasing (Алиасинг - Псевдонимы)
9. History (Хистори - История)
10. Command Line Editing (Редактор командной строки CLE)
11. Completion (Завершение)
12. Extended completion (Расширенное завершение)
13. Bindings (Привязки)
14. Parameter Substitution (Замена параметра)
15. Shell Parameters (Параметры оболочки)
16. Prompting (Промптинг - настройка приглашения шелла)
17. Login/logout watching (Вход в систему / выход из системы)
18. Options (Опции)

UPD:
setopt (дополнительный материал)
Настройка Приглашения шелла (дополнительный материал)

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1649
Зарегистрирован: 10 сен 2016, 10:16
Решено: 19
Откуда: Москва
Благодарил (а): 693 раза
Поблагодарили: 187 раз
Контактная информация:

zsh. Introduction (Введение)

#2

19 авг 2018, 09:28

==========================
Introduction
zsh is a shell designed for interactive use, although it is also a powerful scripting language. Many of the useful features of bash, ksh, and tcsh were incorporated into zsh; many original features were added. This document details some of the unique features of zsh. It assumes basic knowledge of the standard UNIX shells; the intent is to show a reader already familiar with one of the other major shells what makes zsh more useful or more powerful. This document is not at all comprehensive; read the manual entry for a description of the shell that is complete and concise, lthough somewhat overwhelming and devoid of examples.
The text will frequently mention options that you can set to hange the behaviour of zsh. You can set these options with the command

% setopt optionname

and unset them again with

% unsetopt optionname

Case is ignored in option names, as are embedded underscores.
==========================
Введение
zsh - это оболочка, предназначенная для интерактивного использования, хотя она также является мощным языком сценариев. Многие полезные функции bash, ksh и tcsh были включены в zsh; добавлено много оригинальных функций. В этом документе описаны некоторые из уникальных особенностей zsh. Он предполагает базовые знания стандартных оболочек UNIX; цель состоит в том, чтобы показать читателю, уже знакомому с одной из других основных оболочек, что делает zsh более полезным или более мощным. Этот документ не является всеобъемлющим; прочитайте ручную запись для описания оболочки, которая является полной и лаконичной, хотя несколько подавляющей и лишенной примеров.
В тексте часто упоминаются параметры, которые можно настроить для изменения поведения zsh. Вы можете установить эти параметры с помощью команды

Код: Выделить всё

% setopt optionname
и снова отключите их

Код: Выделить всё

% unsetopt optionname
Случай игнорируется в именах опций, а также вложенные символы подчеркивания.
==========================

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1649
Зарегистрирован: 10 сен 2016, 10:16
Решено: 19
Откуда: Москва
Благодарил (а): 693 раза
Поблагодарили: 187 раз
Контактная информация:

zsh. Filename Generation (Глоббинг - подстановка регулярных выражений вместо имени файла)

#3

19 авг 2018, 09:33

==========================
Filename Generation
Otherwise known as globbing, filename generation is quite extensive in zsh. Of course, it has all the basics:
...
Also, if the EXTENDEDGLOB option is set, some new features are activated. For example, the ˆ character negates the pattern following it:
...
An expression of the form <x−y> matches a range of integers:
...
The NUMERICGLOBSORT option will sort files with numbers according to the number. This will not work with ls as it resorts its arguments:
...
Grouping is possible:
...
Also, the string **/ forces a recursive search of subdirectories:
...
It is possible to exclude certain files from the patterns using the ̃ character. A pattern of the form *.c ̃bar.c lists all files matching *.c, except for the file bar.c.
...
One can add a number of qualifiers to the end of any of these patterns, to restrict matches to certain file types. A
qualified pattern is of the form

pattern(...)

with single-character qualifiers inside the parentheses.
...
Note that *(x) and *(*) both match executables. *(X) matches files executable by others, as opposed to *(x), which matches files executable by the owner. *(R) and *(r) match readable files; *(W) and *(w), which checks for writable files.
*(W) is especially important, since it checks for world-writable files:
...
If you want to have all the files of a certain type as well as all symbolic links pointing to files of that type, prefix the qualifier with
a -:
...
You can filter out the symbolic links with the ˆ character:
...
To find all plain files, you can use .:
...
*(U) matches all files owned by you. To search for all files not owned by you, use *(ˆU):
...
This searches for setuid files:
...
This checks for a certain user’s files:
...
==========================
Генерация имени файла
В противном случае, известное как globbing, генерация имени файла довольно обширна в zsh. Конечно, он имеет все основы:

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

Кроме того, если установлена опция EXTENDEDGLOB, активируются некоторые новые функции. Например, символ отрицает шаблон, следующий за ним:
...
Выражение формы <x-y> соответствует диапазону целых чисел:
...
Опция NUMERICGLOBSORT будет сортировать файлы с номерами в соответствии с номером. Это не сработает с ls, поскольку он использует свои аргументы:
...
Возможна группировка:
...
Кроме того, строка ** / вызывает рекурсивный поиск подкаталогов:
...
Можно исключить определенные файлы из шаблонов с использованием символа. Образец формы * .c bar.c перечисляет все файлы, соответствующие * .c, за исключением файла bar.c.
...
К концу любого из этих шаблонов можно добавить несколько квалификаторов, чтобы ограничить соответствие определенным типам файлов.
квалифицированный шаблон имеет вид

pattern(...)

с односимвольными квалификаторами внутри круглых скобок.
...
Обратите внимание, что * (x) и * (*) совпадают с исполняемыми файлами. * (X) соответствует файлам, исполняемым другими, в отличие от * (x), который соответствует файлам, исполняемым владельцем. * (R) и * (r) соответствуют читаемым файлам; * (W) и * (w), который проверяет файлы с возможностью записи.
* (W) особенно важно, так как он проверяет файлы, записываемые по всему миру:
...
Если вы хотите, чтобы все файлы определенного типа, а также все символические ссылки указывали на файлы этого типа, префикс квалификатора "-"
...
Вы можете отфильтровать символические ссылки с символом карет (Ctrl, домик) :
...
Чтобы найти все простые файлы, вы можете использовать.:
...
* (U) соответствует всем файлам, принадлежащим вам. Для поиска всех файлов, не принадлежащих вам, используйте * (U):
...
Это ищет файлы setuid:
...
Это проверяет файлы определенных пользователей:
...
==========================
Т.е. (своими словами) если установить опцию EXTENDEDGLOB командой

Код: Выделить всё

setopt extendedglob
то можно в маске поиска пользоваться символом карет (Ctrl, домик) минусующим из поиска маску, например

Код: Выделить всё

% ls -d ˆ*.c
% ls -d ˆ*.*
% ls -d ˆMakefile
% ls -d *.ˆc
А также задавать диапазоны конструкцией <x-y>

Код: Выделить всё

% ls run<200-300>
% ls run<300-400>
% ls run<-200>
% ls run<300->
% ls run<->
А если добавить опцию NUMERICGLOBSORT командой

Код: Выделить всё

% setopt numericglobsort
то мы получим дополнительные возможность сортировки файлов

Код: Выделить всё

% echo run<->
группировки

Код: Выделить всё

% ls (foo|bar).*
% ls *.(c|o|pro)
рекурсивного поиска подкаталогов

Код: Выделить всё

% ls -R
% ls **/*bar
% ls *bar*
% ls **/*bar*
% ls stuff/**/*bar*
исключить определенный файлы из шаблонов

Код: Выделить всё

% ls *.c
% ls *.c ̃bar.c
% ls *.c ̃f*
добавление квалификаторов для ограничения соответствия типов файлов

Код: Выделить всё

pattern(...)
использовать односимвольные квалификаторы внутри круглых скобок

Код: Выделить всё

% alias l=’ls -dF’
% l *
% l *(/)
% l *(@)
% l *(*)
% l *(x)
% l *(X)
% l *(R)
% l *(w)
% l *(W)
% l -l link run240
Еще примеры

Код: Выделить всё

% alias l=’ls -dF’
% l *
% l *(/)
% l *(@)
% l *(*)
% l *(x)
% l *(X)
% l *(R)
использовать квалификатор "-"

Код: Выделить всё

% l *(-/)
поиск символьных ссылок

Код: Выделить всё

% l *(Wˆ@)
% l *(x)
% l *(xˆ@/)
Поиск простых файлов

Код: Выделить всё

% l *(.)
% l *(ˆ.)
% l s*(.)
% l *(p)
% l -l *(p)
Поиск всех принадлежащих *(U) и не принадлежащих *(ˆU) вам файлов

Код: Выделить всё

% l -l *(ˆU)
Поиск setuid файлов

Код: Выделить всё

% l -l *(s)
проверка файлов принадлежащих определанным пользователям

Код: Выделить всё

% l -l *(u[subbarao])
Похоже это полезные и удобные функции (для всех). Рекомендую добавить всем в свой файл .zshrc

Код: Выделить всё

setopt extendedglob
setopt numericglobsort
==========================

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1649
Зарегистрирован: 10 сен 2016, 10:16
Решено: 19
Откуда: Москва
Благодарил (а): 693 раза
Поблагодарили: 187 раз
Контактная информация:

zsh. Startup Files (Файлы управляющие поведением zsh)

#4

19 авг 2018, 09:40

==========================
Startup Files
There are five startup files that zsh will read commands from:
$ZDOTDIR/.zshenv
$ZDOTDIR/.zprofile
$ZDOTDIR/.zshrc
$ZDOTDIR/.zlogin
$ZDOTDIR/.zlogout
If ZDOTDIR is not set, then the value of HOME is used; this is the usual case.
.zshenv is sourced on all invocations of the shell, unless the -f option is set. It should contain commands to set the command search path, plus other important environment variables. .zshenv should not contain commands that produce output or assume the shell is attached to a tty.
.zshrc is sourced in interactive shells. It should contain commands to set up aliases, functions, options, key bind-ings, etc.
.zlogin is sourced in login shells. It should contain commands that should be executed only in login shells.
.zlogout is sourced when login shells exit. .zprofile is similar to .zlogin, except that it is sourced before .zshrc. .zprofile is meant as an alternative to .zlogin for ksh fans; the two are not intended to be used together, although this could certainly be done if desired. .zlogin is not the place for alias definitions, options, environment variable settings, etc.; as a general rule, it should not change the shell environment at all. Rather, it should be used to set the terminal type and run a series of external commands (fortune, msgs, etc).
Shell Functions
zsh also allows you to create your own commands by defining shell functions. For example:
...
This function looks up a user in the NIS password map. The $1 expands to the first argument to yp. The function could have been equivalently defined in one of the following ways:
...
Note that aliases are expanded when the function definition is parsed, not when the function is executed. For example:
...
Since the alias was defined after the function was parsed, it has no effect on the function’s execution. However, if we define the
function again with the alias in place:
...
it is parsed with the new alias definition in place. Therefore, in general you must define aliases before functions.
We can make the function take multiple arguments:
...
The for i loops through each of the function’s arguments, setting i equal to each of them in turn. We can also make the function do something sensible if no arguments are given:
...
$# is the number of arguments supplied to the function. If it is equal to zero, we print a usage message; otherwise, we loop through the arguments, and ypmatch all of them.
Here’s a function that selects a random line from a file:
...
randline has a local variable, z, that holds the number of lines in the file. $[RANDOM % z + 1] expands to a random number between 1 and z. An expression of the form $[...] expands to the value of the arithmetic expression within the brackets, and the RANDOM variable returns a random number each time it is referenced. % is the modulus operator, as in C. Therefore, sed -n $[RANDOM%z+1]p picks a random line from its input, from 1 to z.
Function definitions can be viewed with the functions builtin:
...
Here’s another one:
...
Note that this could also have been implemented as an alias:
...
Instead of defining a lot of functions in your .zshrc, all of which you may not use, it is often better to use the autoload builtin. The idea is, you create a directory where function definitions are stored, declare the names in your .zshrc, and tell the shell where to look for them. Whenever you reference a function, the shell will automatically load it into memory.
...
This idea has other benefits. By adding a #! header to the files, you can make them double as shell scripts. (Although it is faster to use them as functions, since a separate process is not created.)
...
Now other people, who may not use zsh, or who don’t want to copy all of your .zshrc, may use these functions as shell scripts.
==========================
Загрузочные файлы
Существует пять загрузочных файлов, из которых zsh будет читать команды:
$ ZDOTDIR / .zshenv
$ ZDOTDIR / .zprofile
$ ZDOTDIR / .zshrc
$ ZDOTDIR / .zlogin
$ ZDOTDIR / .zlogout
Если ZDOTDIR не установлен, используется значение HOME; это обычный случай.
.zshenv используется во всех вызовах оболочки, если не задана опция -f. Он должен содержать команды для задания пути поиска команд, а также другие важные переменные среды. .zshenv не должен содержать команды, которые производят вывод или предполагают, что оболочка прикреплена к tty.
.zshrc находится в интерактивных оболочках. Он должен содержать команды для настройки псевдонимов, функций, опций, привязок клавиш и т. д.
.zlogin получен в оболочках входа. Он должен содержать команды, которые должны выполняться только в оболочках входа.
.zlogout выдается при выходе из командной строки. .zprofile похож на .zlogin, за исключением того, что он получен до .zshrc. .zprofile предназначен как альтернатива .zlogin для поклонников ksh; эти два не предназначены для совместного использования, хотя это, безусловно, можно сделать, если это необходимо. .zlogin - это не место для определения псевдонимов, параметров, настроек переменных среды и т. д .; как правило, он не должен вообще менять среду оболочки. Скорее, он должен использоваться для установки типа терминала и выполнения ряда внешних команд (fortune, msgs, etc).
Функции оболочки
zsh также позволяет создавать собственные команды, определяя функции оболочки. Например:

Код: Выделить всё

% yp () {
>
 ypmatch $1 passwd.byname
> }
% yp pfalstad
pfalstad:*:3564:35:Paul John Falstad:/u/pfalstad:/usr/princeton/bin/zsh
Эта функция ищет пользователя на карте пароля NIS. $ 1 расширяется до первого аргумента yp. Функция могла бы быть эквивалентно определена одним из следующих способов:

Код: Выделить всё

% function yp {
>  ypmatch $1 passwd.byname
> }
% function yp () {
> ypmatch $1 passwd.byname
> }
% function yp () ypmatch $1 passwd.byname
Обратите внимание, что псевдонимы расширяются, когда определение функции анализируется, а не когда функция выполняется. Например:

Код: Выделить всё

% alias ypmatch=echo
% yp pfalstad
pfalstad:*:3564:35:Paul John Falstad:/u/pfalstad:/usr/princeton/bin/zsh
Поскольку псевдоним был определен после того, как функция была проанализирована, это не влияет на выполнение функции. Однако, если мы определим снова с помощью псевдонима:

Код: Выделить всё

% function yp () { ypmatch $1 passwd.byname }
% yp pfalstad
pfalstad passwd.byname
он анализируется с новым определением псевдонимов. Поэтому, в общем, вы должны определить псевдонимы перед функциями.
Мы можем заставить функцию принимать несколько аргументов:

Код: Выделить всё

% unalias ypmatch
% yp () {
> for i
> do ypmatch $i passwd.byname
> done
> }
% yp pfalstad subbarao sukthnkr
pfalstad:*:3564:35:Paul John Falstad:/u/pfalstad:/usr/princeton/bin/zsh
subbarao:*:3338:35:Kartik Subbarao:/u/subbarao:/usr/princeton/bin/zsh
sukthnkr:*:1267:35:Rahul Sukthankar:/u/sukthnkr:/usr/princeton/bin/tcsh
Для i проходит через каждый из аргументов функции, устанавливая i равным каждому из них по очереди. Мы также можем заставить функцию делать что-то разумное, если аргументы не приводятся:

Код: Выделить всё

% yp () {
> if (( $# == 0 ))
> then echo usage: yp name ...; fi
> for i; do ypmatch $i passwd.byname; done
> }
% yp
usage: yp name ...
% yp pfalstad sukthnkr
pfalstad:*:3564:35:Paul John Falstad:/u/pfalstad:/usr/princeton/bin/zsh
sukthnkr:*:1267:35:Rahul Sukthankar:/u/sukthnkr:/usr/princeton/bin/tcsh
$ # - количество аргументов, переданных функции. Если он равен нулю, мы печатаем сообщение об использовании; в противном случае мы прокручиваем аргументы и ypmatch все из них.
Вот функция, которая выбирает случайную строку из файла:

Код: Выделить всё

% randline () {
> integer z=$(wc -l <$1)
> sed -n $[RANDOM % z + 1]p $1
> }
% randline /etc/motd
PHOENIX WILL BE DOWN briefly Friday morning, 5/24/91 from 8 AM to
% randline /etc/motd
SunOS Release 4.1.1 (PHOENIX) #19: Tue May 14 19:03:15 EDT 1991
% randline /etc/motd
| Please use the "msgs" command to read announcements. Refer to the |
% echo $z

%
randline имеет локальную переменную z, которая содержит количество строк в файле. $ [RANDOM% z + 1] расширяется до случайного числа между 1 и z. Выражение формы $ [...] расширяется до значения арифметического выражения в скобках, а переменная RANDOM возвращает случайное число при каждом упоминании. % - оператор модуля, как и в С. Поэтому sed -n $ [RANDOM% z + 1] p выбирает случайную линию с ее ввода, от 1 до z.
Определения функций можно просмотреть с помощью встроенных функций:

Код: Выделить всё

% functions randline
randline () {
integer z=$(wc -l <$1)
sed -n $[RANDOM % z + 1]p $1
}
% functions
yp () {
if let $# == 0
then
echo usage: yp name ...
fi
for i
do
ypmatch $i passwd.byname
done
}
randline () {
integer z=$(wc -l <$1)
sed -n $[RANDOM % z + 1]p $1
}
Вот еще один:

Код: Выделить всё

% cx () { chmod +x $* }
% ls -l foo bar
-rw-r--r-- 1 pfalstad  29 May 24 04:38 bar
-rw-r--r-- 1 pfalstad  29 May 24 04:38 foo
% cx foo bar
% ls -l foo bar
-rwxr-xr-x 1 pfalstad  29 May 24 04:38 bar
-rwxr-xr-x 1 pfalstad  29 May 24 04:38 foo
Обратите внимание, что это также можно было реализовать как псевдоним:

Код: Выделить всё

% chmod 644 foo bar
% alias cx=’chmod +x’
% cx foo bar
% ls -l foo bar
-rwxr-xr-x 1 pfalstad  29 May 24 04:38 bar
-rwxr-xr-x 1 pfalstad  29 May 24 04:38 foo
Вместо определения множества функций в вашем .zshrc, которые вы не можете использовать, часто лучше использовать встроенную автозагрузку. Идея заключается в том, что вы создаете каталог, в котором хранятся определения функций, объявляйте имена в вашем .zshrc и рассказывайте оболочке, где их искать. Всякий раз, когда вы ссылаетесь на функцию, оболочка будет автоматически загружать ее в память.

Код: Выделить всё

% mkdir /tmp/funs
% cat >/tmp/funs/yp
ypmatch $1 passwd.byname
ˆD
% cat >/tmp/funs/cx
chmod +x $*
ˆD
% FPATH=/tmp/funs
% autoload cx yp
% functions cx yp
undefined cx ()
undefined yp ()
% chmod 755 /tmp/funs/{cx,yp}
% yp egsirer
egsirer:*:3214:35:Emin Gun Sirer:/u/egsirer:/bin/sh
% functions yp
yp () {
ypmatch $1 passwd.byname
}
Эта идея имеет и другие преимущества. Добавив #! заголовок в файлы, вы можете сделать их двойными в качестве сценариев оболочки. (Хотя быстрее использовать их как функции, так как отдельный процесс не создается.)

Код: Выделить всё

% ed /tmp/funs/yp
25
i
#! /usr/local/bin/zsh
w
42
q
% </tmp/funs/yp
#! /usr/local/bin/zsh
ypmatch $1 passwd.byname
% /tmp/funs/yp sukthnkr
sukthnkr:*:1267:35:Rahul Sukthankar:/u/sukthnkr:/usr/princeton/bin/tcsh
Теперь другие люди, которые не могут использовать zsh, или которые не хотят копировать все ваши .zshrc, могут использовать эти функции в качестве сценариев оболочки.

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1649
Зарегистрирован: 10 сен 2016, 10:16
Решено: 19
Откуда: Москва
Благодарил (а): 693 раза
Поблагодарили: 187 раз
Контактная информация:

zsh (перевод)

#5

19 авг 2018, 09:44

==========================
Directories
One nice feature of zsh is the way it prints directories. For example, if we set the prompt like this:
...
the shell will print the current directory in the prompt, using the ̃ character. Howev er, zsh is smarter than most other shells in this respect:
...
Note that zsh prints other users’ directories in the form ̃user. Also note that you can set a parameter and use it as a directory name; zsh will act as if foo is a user with the login directory /usr/princeton/common/src. This is convenient, especially if you’re sick of seeing prompts like this:
...
If you get stuck in this position, you can give the current directory a short name, like this:
...
When you reference a directory in the form ̃inews, the shell assumes that you want the directory displayed in this form; thus simply typing echo ̃inews or cd ̃inews causes the prompt to be shortened. You can define a shell function for this purpose:
...
You may want to add this one-line function to your .zshrc.
zsh can also put the current directory in your title bar, if you are using a windowing system. One way to do this is with the chpwd function, which is automatically executed by the shell whenever you change directory. If you are using xterm, this will work:
...
The -P option tells print to treat its arguments like a prompt string; otherwise the % ̃ would not be expanded. The -n option suppresses the terminating newline, as with echo.
If you are using an IRIS wsh, do this:
...
The print -D command has other uses. For example, to print the current directory to standard output in short form, you can do this:
...
and to print each component of the path in short form:
...
==========================
Директории (иногда переводится как каталоги или справочники)
Одной из приятных особенностей zsh является то, как он печатает каталоги. Например, если мы установим приглашение следующим образом:

Код: Выделить всё

phoenix% PROMPT=’% ̃> ’
 ̃> cd src
 ̃/src>
оболочка будет печатать текущий каталог в приглашении, используя символ. Однако, zsh умнее большинства других оболочек в этом отношении:

Код: Выделить всё

 ̃/src> cd  ̃subbarao
 ̃subbarao> cd  ̃maruchck
 ̃maruchck> cd lib
 ̃maruchck/lib> cd fun
 ̃maruchck/lib/fun> foo=/usr/princeton/common/src
 ̃maruchck/lib/fun> cd  ̃foo
 ̃foo> cd ..
/usr/princeton/common> cd src
 ̃foo> cd news/nntp
 ̃foo/news/nntp> cd inews
 ̃foo/news/nntp/inews>
Обратите внимание, что zsh печатает каталоги других пользователей в форме пользователя. Также обратите внимание, что вы можете установить параметр и использовать его как имя каталога; zsh будет действовать так, как если бы foo был пользователем с каталогом входа / usr / princeton / common / src. Это удобно, особенно если вам больно видеть подсказки вроде этого:

Код: Выделить всё

phoenix:/usr/princeton/common/src/X.V11R4/contrib/clients/xv/docs>
Если вы застряли в этой позиции, вы можете дать текущему каталогу короткое имя, например:

Код: Выделить всё

/usr/princeton/common/src/news/nntp/inews> inews=$PWD
/usr/princeton/common/src/news/nntp/inews> echo  ̃inews
/usr/princeton/common/src/news/nntp/inews
 ̃inews>
Когда вы ссылаетесь на каталог в форме inews, оболочка предполагает, что вы хотите, чтобы каталог отображался в этой форме; поэтому просто набирать echo inews или cd inews заставляет сокращать запрос. Вы можете определить функцию оболочки для этой цели:

Код: Выделить всё

 ̃inews> namedir () { $1=$PWD ; :  ̃$1 }
 ̃inews> cd /usr/princeton/bin
/usr/princeton/bin> namedir pbin
 ̃pbin> cd /var/spool/mail
/var/spool/mail> namedir spool
 ̃spool> cd .msgs
 ̃spool/.msgs>
Вы можете добавить эту однострочную функцию в свой .zshrc.
zsh также может поместить текущий каталог в строку заголовка, если вы используете систему окон. Один из способов сделать это - это функция chpwd, которая автоматически запускается оболочкой всякий раз, когда вы меняете каталог. Если вы используете xterm, это будет работать:

Код: Выделить всё

chpwd () { print -Pn ’ˆ[]2;% ̃ˆG’ }
Опция -P сообщает print для обработки своих аргументов, как строка приглашения; в противном случае% не будет расширяться. Параметр -n подавляет завершающую новую строку, например, с помощью эха.
Если вы используете IRIS wsh, сделайте следующее:

Код: Выделить всё

chpwd () { print -Pn ’\2201.y% ̃\234’ }
Команда print -D имеет другие функции. Например, чтобы напечатать текущий каталог до стандартного вывода в короткой форме, вы можете сделать это:

Код: Выделить всё

% print -D $PWD
 ̃subbarao/src
и печатать каждый компонент пути в краткой форме:

Код: Выделить всё

% print -D $path
/bin /usr/bin  ̃locbin  ̃locbin/X11  ̃/bin

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1649
Зарегистрирован: 10 сен 2016, 10:16
Решено: 19
Откуда: Москва
Благодарил (а): 693 раза
Поблагодарили: 187 раз
Контактная информация:

zsh (перевод)

#6

19 авг 2018, 09:47

==========================
Directory Stacks
If you use csh, you may know about directory stacks. The pushd command puts the current directory on the stack, and changes to a new directory; the popd command pops a directory off the stack and changes to it.
...
zsh’s directory stack commands work similarly. One difference is the way pushd is handled if no arguments are given. As in csh, this exchanges the top two elements of the directory stack:
...
unless the stack only has one entry:
...
or unless the PUSHDTOHOME option is set:
...
As an alternative to using directory stacks in this manner, we can get something like a directory history by setting a few more options and parameters:
...
Note that ̃2 expanded to the second directory in the history list, and that cd -3 recalled the third directory in the list.
You may be wondering what all those options do. AUTOPUSHD made cd act like pushd. (alias cd=pushd is not sufficient, for various reasons.) PUSHDMINUS swapped the meaning of cd +1 and cd -1; we want them to mean the opposite of what they mean in csh, because it makes more sense in this scheme, and it’s easier to type:
...
PUSHDSILENT keeps the shell from printing the directory stack each time we do a cd, and PUSHDTOHOME we mentioned earlier:
...
DIRSTACKSIZE keeps the directory stack from getting too large, much like HISTSIZE:
...
==========================
Пакеты каталога (Стеки директорий)
Если вы используете csh, вы можете узнать о стеках каталогов. Команда pushd помещает текущий каталог в стек и изменяет его на новый каталог; команда popd выдает каталог из стека и изменяется на него.

Код: Выделить всё

phoenix% cd
phoenix% PROMPT=’Z % ̃> ’
Z  ̃> pushd /tmp
/tmp  ̃
Z /tmp> pushd /usr/etc
/usr/etc /tmp  ̃
Z /usr/etc> pushd /usr/bin
/usr/bin /usr/etc /tmp  ̃
Z /usr/bin> popd
/usr/etc /tmp  ̃
Z /usr/etc> popd
/tmp  ̃
Z /tmp> pushd /etc
/etc /tmp  ̃
Z /etc> popd
/tmp  ̃
Аналогично работают команды стека каталога zsh. Одно отличие заключается в том, как обрабатывается pushd, если аргументы не заданы. Как и в csh, это обменивается двумя верхними элементами стека каталога:

Код: Выделить всё

Z /tmp> dirs
/tmp  ̃
Z /tmp> pushd
 ̃ /tmp
если только стек имеет только одну запись:

Код: Выделить всё

Z  ̃> popd
/tmp
Z /tmp> dirs
/tmp
Z /tmp> pushd
 ̃ /tmp
Z  ̃>
или если не установлен параметр PUSHDTOHOME:

Код: Выделить всё

Z  ̃> setopt pushdtohome
Z  ̃> pushd
 ̃  ̃ /tmp
В качестве альтернативы использованию стеков каталогов таким образом мы можем получить что-то вроде истории каталогов, установив еще несколько опций и параметров:

Код: Выделить всё

 ̃> DIRSTACKSIZE=8
 ̃> setopt autopushd pushdminus pushdsilent pushdtohome
 ̃> alias dh=’dirs -v’
 ̃> cd /tmp
/tmp> cd /usr
/usr> cd bin
/usr/bin> cd ../pub
/usr/pub> dh
0  /usr/pub
1  /usr/bin
2  /usr
3  /tmp
4   ̃
/usr/pub> cd -3
/tmp> dh
0  /tmp
1  /usr/pub
2  /usr/bin
3  /usr
4   ̃
/tmp> ls  ̃2/df
/usr/bin/df
/tmp> cd -4
 ̃>
Обратите внимание, что 2 расширен во второй каталог в списке истории и что cd -3 вызвал третий каталог в списке.
Вам может быть интересно, что делают все эти варианты. AUTOPUSHD сделал cd, как pushd. (псевдоним cd = pushd недостаточно, по разным причинам.) PUSHDMINUS заменил значение cd +1 и cd -1; мы хотим, чтобы они имели в виду противоположность тому, что они означают в csh, потому что это имеет больше смысла в этой схеме, и ее легче ввести:

Код: Выделить всё

 ̃> dh
0   ̃
1  /tmp
2  /usr/pub
3  /usr/bin
4  /usr
 ̃> unsetopt pushdminus
 ̃> cd +1
/tmp> dh
0  /tmp
1   ̃
2  /usr/pub
3  /usr/bin
4  /usr
/tmp> cd +2
/usr/pub>
PUSHDSILENT хранит оболочку от печати стека каталога каждый раз, когда мы делаем cd, а PUSHDTOHOME мы упомянули ранее:

Код: Выделить всё

/usr/pub> unsetopt pushdsilent
/usr/pub> cd /etc
/etc /usr/pub /tmp  ̃ /usr/bin /usr
/etc> cd
 ̃ /etc /usr/pub /tmp  ̃ /usr/bin /usr
 ̃> unsetopt pushdtohome
 ̃> cd
/etc  ̃ /usr/pub /tmp  ̃ /usr/bin /usr
/etc>
DIRSTACKSIZE позволяет стеку каталогов стать слишком большим, как HISTSIZE:

Код: Выделить всё

/etc> setopt pushdsilent
/etc> cd /
/> cd  /
/> cd  /
/> cd  /
/> cd  /
/> cd  /
/> cd  /
/> cd  /
/> dh
0  /
1  /
2  /
3  /
4  /
5  /
6  /
7  /
==========================
В этом разделе была рассмотрена работа со стеками каталогов. В том числе такие опции (setopt) zsh как pushdtohome, autopushd, pushdminus, pushdsilent, pushdtohome, pushdminus, pushdtohome.

Честно говоря, я не понял их практического смысла. Включать (setopt) или выключать (unsetopt) в своем файле .zshrc не буду (зачем мне то, чем я пользоваться все равно не умею? если только мне скажут, что эти опции улучшают работу компьютеров пользователей не зависимо от того умеют ли пользователи с ними работать - тогда другое дело)
==========================

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1649
Зарегистрирован: 10 сен 2016, 10:16
Решено: 19
Откуда: Москва
Благодарил (а): 693 раза
Поблагодарили: 187 раз
Контактная информация:

zsh (перевод)

#7

19 авг 2018, 09:51

==========================
Command/Process Substitution
Command substitution in zsh can take two forms. In the traditional form, a command enclosed in backquotes (‘...‘) is replaced on the command line with its output. This is the form used by the older shells. Newer shells (like zsh) also provide another form, $(...). This form is much easier to nest.
...
Many common uses of command substitution, however, are superseded by other mechanisms of zsh:
...
A command name with a = prepended is replaced with its full pathname. This can be very convenient. If it’s not convenient for you, you can turn it off:
...
Another nice feature is process substitution:
...
A command of the form =(...) is replaced with the name of a file containing its output. (A command substitution, on the other hand, is replaced with the output itself.) print -l is like echo, excepts that it prints its arguments one per line, the way fgrep expects them:
...
We could also have written:
...
Using process substitution, you can edit the output of a command:
...
or easily read archived mail:
...
Note that the shell creates a temporary file, and deletes it when the command is finished.
...
If you read zsh’s man page, you may notice that <(...) is another form of process substitution which is similar to =(...). There is an important difference between the two. In the <(...) case, the shell creates a named pipe (FIFO) instead of a file. This is better, since it does not fill up the file system; but it does not work in all cases. In fact, if we had replaced =(...) with <(...) in the examples above, all of them would have stopped working except for fgrep -f <(...). You can not edit a pipe, or open it as a mail folder; fgrep, however, has no problem with reading a list of words from a pipe. You may wonder why diff<(foo) bar doesn’t work, since foo | diff - bar works; this is because diff creates a temporary file if it notices that one of its arguments is -, and then copies its standard input to the temporary file.
>(...) is just like <(...) except that the command between the parentheses will get its input from the named pipe.

% dvips -o >(lpr) zsh.dvi

==========================
Замена команды / процесса
Подстановка команд в zsh может принимать две формы. В традиционной форме команда, заключенная в backquotes («...»), заменяется в командной строке ее выходом. Это форма, используемая старыми оболочками. Новые оболочки (например, zsh) также предоставляют другую форму, $ (...). Эта форма гораздо легче в гнездо.

Код: Выделить всё

% ls -l ‘echo /vmunix‘
-rwxr-xr-x 1 root  1209702 May 14 19:04 /vmunix
% ls -l $(echo /vmunix)
-rwxr-xr-x 1 root  1209702 May 14 19:04 /vmunix
% who | grep mad
subbarao ttyt7  May 23 15:02  (mad55sx15.Prince)
pfalstad ttyu1  May 23 16:25  (mad55sx14.Prince)
subbarao ttyu6  May 23 15:04  (mad55sx15.Prince)
pfalstad ttyv3  May 23 16:25  (mad55sx14.Prince)
% who | grep mad | awk ’{print $2}’
ttyt7
ttyu1
ttyu6
ttyv3
% cd /dev; ls -l $(who |
> grep $(echo mad) |
> awk ’{ print $2 }’)
crwx-w---- 1 subbarao 20, 71 May 23 18:35 ttyt7
crw--w---- 1 pfalstad 20, 81 May 23 18:42 ttyu1
crwx-w---- 1 subbarao 20, 86 May 23 18:38 ttyu6
crw--w---- 1 pfalstad 20, 99 May 23 18:41 ttyv3
Однако многие распространенные применения подстановки команд заменяются другими механизмами zsh:

Код: Выделить всё

% ls -l ‘tty‘
crw-rw-rw- 1 root  20,  28 May 23 18:35 /dev/ttyqc
% ls -l $TTY
crw-rw-rw- 1 root  20,  28 May 23 18:35 /dev/ttyqc
% ls -l ‘which rn‘
-rwxr-xr-x 1 root  172032 Mar  6 18:40 /usr/princeton/bin/rn
% ls -l =rn
-rwxr-xr-x 1 root  172032 Mar  6 18:40 /usr/princeton/bin/rn
Имя команды с a = preend заменяется полным именем пути. Это может быть очень удобно. Если это не удобно для вас Вы можете отключить его:

Код: Выделить всё

% ls
=foo  =bar
% ls =foo =bar
zsh: foo not found
% setopt noequals
% ls =foo =bar
=foo  =bar
Еще одна приятная функция - замещение процесса:

Код: Выделить всё

% who | fgrep -f  =(print -l root lemke shgchan subbarao)
root  console  May 19 10:41
lemke  ttyq0  May 22 10:05  (narnia:0.0)
lemke  ttyr7  May 22 10:05  (narnia:0.0)
lemke  ttyrd  May 22 10:05  (narnia:0.0)
shgchan ttys1  May 23 16:52  (gaudi.Princeton.)
subbarao ttyt7  May 23 15:02  (mad55sx15.Prince)
subbarao ttyu6  May 23 15:04  (mad55sx15.Prince)
shgchan ttyvb  May 23 16:51  (gaudi.Princeton.)
Команда вида = (...) заменяется именем файла, содержащего его вывод. (С другой стороны, замена подстановки заменяется самим результатом.) Print -l подобен echo, за исключением того, что он печатает свои аргументы по одному в строке, как их ожидает fgrep:

Код: Выделить всё

% print -l foo bar
foo
bar
Мы могли бы также написать:

Код: Выделить всё

% who | fgrep -f =(echo ’root
>  lemke
>  shgchan
>  subbarao’)
Используя замещение процесса, вы можете отредактировать вывод команды:

Код: Выделить всё

% ed =(who | fgrep -f  ̃/.friends)
355
g/lemke/d
w /tmp/filbar
226
q
% cat /tmp/filbar
root  console May 19 10:41
shgchan ttys1  May 23 16:52  (gaudi.Princeton.)
subbarao ttyt7  May 23 15:02  (mad55sx15.Prince)
subbarao ttyu6  May 23 15:04  (mad55sx15.Prince)
shgchan ttyvb  May 23 16:51  (gaudi.Princeton.)
или легко прочитать архивированную почту:

Код: Выделить всё

% mail -f =(zcat  ̃/mail/oldzshmail.Z)
"/tmp/zsha06024": 84 messages, 0 new, 43 unread
> 1 U TO: pfalstad, zsh (10)
2 U nytim!tim@uunet.uu.net, Re: Zsh on Sparc1 /SunOS 4.0.3
3 U JAM%TPN@utrcgw.utc.com, zsh fix (15)
4 U djm@eng.umd.edu, way to find out if running zsh? (25)
5 U djm@eng.umd.edu, Re: way to find out if running zsh? (17)
6      r djm@eng.umd.edu, Meta . (18)
7 U jack@cs.glasgow.ac.uk, Re: problem building zsh (147)
8 U nytim!tim@uunet.uu.net, Re: Zsh on Sparc1 /SunOS 4.0.3
9      ursa!jmd, Another fix... (61)
10 U pplacewa@bbn.com, Re: v18i084: Zsh 2.00 - A small complaint (36)
11 U lubkin@cs.rochester.edu, POSIX job control (34)
12 U yale!bronson!tan@uunet.UU.NET
13 U brett@rpi.edu, zsh (36)
14 S subbarao, zsh sucks!!!! (286)
15 U snibru!d241s008!d241s013!ala@relay.EU.net, zsh (165)
16 U nytim!tim@uunet.UU.NET, Re: Zsh on Sparc1 /SunOS 4.0.3
17 U subbarao, zsh is a junk shell (43)
18 U amaranth@vela.acs.oakland.edu, zsh (33)
43u/84 1: x
% ls -l /tmp/zsha06024
/tmp/zsha06024 not found
Обратите внимание, что оболочка создает временный файл и удаляет его, когда команда завершена.

Код: Выделить всё

% diff =(ls) =(ls -F)
3c3
< fortune
---
> fortune*
10c10
< strfile
---
> strfile*
Если вы читаете man-страницу zsh, вы можете заметить, что <(...) - это еще одна форма замещения процесса, которая похожа на = (...). Там является важным различием между ними. В случае <(...) оболочка создает именованный канал (FIFO) вместо файла. Это лучше, поскольку он не заполняет файловую систему; но он не работает во всех случаях. В самом деле, если бы мы заменили = (...) на <(...) в приведенные выше примеры, все они перестали работать, кроме fgrep -f <(...). Вы не можете отредактировать трубку или открыть ее как почтовая папка; Однако fgrep не имеет проблем с чтением списка слов из трубы. Вы можете задаться вопросом, почему diff
<(foo) bar не работает, так как foo | diff-bar работает; это потому, что diff создает временный файл, если он замечает, что один из его аргументов -, а затем копирует свой стандартный ввод во временный файл.
> (...) точно так же, как <(...), за исключением того, что команда между скобками получит свой вход от именованного канала.

Код: Выделить всё

% dvips -o> (lpr) zsh.dvi
==========================
В данной главе машинный переводчик чего-то подвел и половина текста в русском варианте не удобоварима. Я так понял, что для отключения замены команды/процесса (и совместимости с другими более старыми и привычными методами ввода) можно использовать команду

Код: Выделить всё

setopt noequals
Только надо обратить внимание, что в данном случае для отключения будет использоваться setopt , а не unsetopt
Я для себя, наверное, не буду отключать. Если это то, о чем я думаю (стрелка влево показывает в консоли содержание текстового файла без всяких редакторов и более навороченых команд)

Код: Выделить всё

%<.zshrc
то мне это кажется ужасно удобным - и поэтому я оставляю.
==========================

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1649
Зарегистрирован: 10 сен 2016, 10:16
Решено: 19
Откуда: Москва
Благодарил (а): 693 раза
Поблагодарили: 187 раз
Контактная информация:

zsh (перевод)

#8

19 авг 2018, 09:55

==========================
Redirection
Apart from all the regular redirections like the Bourne shell has, zsh can do more. You can send the output of a command to more than one file, by specifying more redirections like
...
and the text will end up in both files. Similarly, you can send the output to a file and into a pipe:
...
The same goes for input. You can make the input of a command come from more than one file.
...
The command will first get the contents of file1 as its standard input, then those of file2 and finally the contents of file3. This, too, works with pipes.
...
The sort will get as its standard input first the output of cut and then the contents of newnames.
Suppose you would like to watch the standard output of a command on your terminal, but want to pipe the standard error to another command. An easy way to do this in zsh is by redirecting the standard error using 2> >(...).
...
The above redirection will actually be implemented with a regular pipe, not a temporary named pipe.
==========================
Перенаправление
Помимо всех регулярных перенаправлений, таких как оболочка Bourne, zsh может сделать больше. Вы можете отправить вывод команды нескольким файлам, указав больше перенаправления, например

Код: Выделить всё

% echo Hello World >file1 >file2
и текст будет в обоих файлах. Аналогично, вы можете отправить вывод в файл и в канал:

Код: Выделить всё

% make > make.log | grep Error
То же самое касается ввода. Вы можете сделать ввод команды из нескольких файлов.

Код: Выделить всё

% sort <file1 <file2 <file3
Сначала команда получит содержимое файла file1 в качестве стандартного ввода, а затем файла file2 и, наконец, содержимое файла3. Это тоже работает с трубами.

Код: Выделить всё

% cut -d: -f1 /etc/passwd | sort <newnames
Эта сортировка в качестве стандартного ввода получит сначала результат вырезания, а затем содержимое новых имен.
Предположим, вы хотите посмотреть стандартный вывод команды на своем терминале, но хотите передать стандартную ошибку другой команде. Простой способ сделать это в zsh - это перенаправить стандартную ошибку, используя 2>> (...).

Код: Выделить всё

% find / -name games 2> >(grep -v ’Permission’ > realerrors)
Вышеперечисленное перенаправление будет фактически реализовано с использованием регулярного канала, а не временного именованного канала.
==========================
Я не гуру консоли, конечно. Здесь мне все понятно. Должно быть удобно.
Но я удивлен, неужели этого нет в bash, раз разработчики об этом рассказывают?
==========================

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1649
Зарегистрирован: 10 сен 2016, 10:16
Решено: 19
Откуда: Москва
Благодарил (а): 693 раза
Поблагодарили: 187 раз
Контактная информация:

zsh (перевод)

#9

19 авг 2018, 10:00

==========================
Aliasing
Often-used commands can be abbreviated with an alias:
...
or commands with certain desired options:
...
Aliases can also be used to replace old commands:
...
or to define new ones:
...
(The pattern *(R) matches all readable files in the current directory, and *(ˆR) matches all unreadable files.)
Most other shells have aliases of this kind (command aliases). However, zsh also has global aliases, which are substituted anywhere on a line. Global aliases can be used to abbreviate frequently-typed usernames, hostnames, etc.
...
Here are some more interesting uses.
...
Another example makes use of zsh’s process substitution. If you run NIS, and you miss being able to do this:
...
you can define an alias that will seem more natural than ypmatch pfalstad passwd:
...
If you’re really crazy, you can even call it /etc/passwd:
...
The last example shows one of the perils of global aliases; they have a lot of potential to cause confusion. For example, if you defined a global alias called | (which is possible), zsh would begin to act very strangely; every pipe symbol would be replaced with the text of your alias. To some extent, global aliases are like macros in C; discretion is advised in using them and in choosing names for them. Using names in all caps is not a bad idea, especially for aliases which introduce shell metasyntax (like M and GF above).
Note that zsh aliases are not like csh aliases. The syntax for defining them is different, and they do not have arguments. All your favorite csh aliases will probably not work under zsh. For example, if you try:
...
no aliases will be defined, but zsh will not report an error. In csh, this line defines an alias that makes rm safe---files that are rm’d will be moved to a temporary directory instead of instantly destroyed. In zsh’s syntax, however, this line asks the shell to print any existing alias definitions for rm, mv, or !* /tmp/wastebasket. Since there are none, most likely, the shell will not print anything, although alias will return a nonzero exit code. The proper syntax is this:
...
However, this won’t work either:
...
While this makes rm safe, it is certainly not what the user intended. In zsh, you must use a shell function for this:
...
While this is much cleaner and easier to read (I hope you will agree), it is not csh-compatible. Therefore, a script to convert csh aliases and variables has been provided. You should only need to use it once, to convert all your csh aliases and parameters to
zsh format:
...
The first two aliases were converted to regular zsh aliases, while the third, since it needed to handle arguments, was converted to a function. c2z can convert most aliases to zsh format without any problems. However, if you’re using some really arcane csh tricks, or if you have an alias with a name like do (which is reserved in zsh), you may have to fix some of the aliases by hand.
The c2z script checks your csh setup, and produces a list of zsh commands which replicate your aliases and parameter settings as closely as possible. You could include its output in your startup file, .zshrc.
==========================
Aliasing
Часто используемые команды могут быть сокращены с помощью псевдонима:

Код: Выделить всё

% alias uc=uncompress
% ls
hanoi.Z
% uc hanoi
% ls
hanoi
или команды с некоторыми желаемыми параметрами:

Код: Выделить всё

% alias fm=’finger -m’
% fm root
Login name: root                                          In real life: Operator
Directory: /                                                    Shell: /bin/csh
On since May 19 10:41:15 on console         3 days 5 hours Idle Time
No unread mail
No Plan.

% alias lock=’lock -p -60000’
% lock
lock: /dev/ttyr4 on phoenix. timeout in 60000 minutes
time now is Fri May 24 04:23:18 EDT 1991
Key:

% alias l=’ls -AF’
% l /
.bash_history            kadb*
.bashrc                  lib@
.cshrc                   licensed/
.exrc                    lost+found/
.login                   macsyma
...
Псевдонимы могут также использоваться для замены старых команд:

Код: Выделить всё

% alias grep=egrep ps=sps make=gmake
% alias whoami=’echo root’
% whoami
root
или определить новые:

Код: Выделить всё

% cd /
% alias sz=’ls -l | sort -n +3 | tail -10’
% sz
drwxr-sr-x 7 bin                            3072 May 23 11:59 etc
drwxrwxrwx 26 root                          5120 May 24 04:20 tmp
drwxr-xr-x 2 root                           8192 Dec 26 19:34 lost+found
drwxr-sr-x 2 bin                           14848 May 23 18:48 dev
-r--r--r-- 1 root                         140520 Dec 26 20:08 boot
-rwxr-xr-x 1 root                         311172 Dec 26 20:08 kadb
-rwxr-xr-x 1 root                        1209695 Apr 16 15:33 vmunix.old
-rwxr-xr-x 1 root                        1209702 May 14 19:04 vmunix
-rwxr-xr-x 1 root                        1209758 May 21 12:23 vmunix.new.kernelmap.old
-rwxr-xr-x 1 root                        1711848 Dec 26 20:08 vmunix.org
% cd
% alias rable=’ls -AFtrd *(R)’ nrable=’ls -AFtrd *(ˆR)’
% rable
README        func/        bin/        pub/        News/        src/
nicecolors    etc/         scr/        tmp/        iris/        zsh*
% nrable
Mailboxes/    mail/        notes
(Шаблон * (R) соответствует всем читаемым файлам в текущем каталоге и * (R) соответствует всем нечитаемым файлам.)
Большинство других оболочек имеют псевдонимы такого типа (командные псевдонимы). Однако zsh также имеет глобальные псевдонимы, которые заменяются где угодно на одной линии. Глобальные псевдонимы могут использоваться для сокращения часто вводимых имен пользователей, имен хостов и т. Д.

Код: Выделить всё

% alias -g me=pfalstad gun=egsirer mjm=maruchck
% who | grep me
pfalstad ttyp0   May 24 03:39  (mickey.Princeton)
pfalstad ttyp5   May 24 03:42  (mickey.Princeton)
% fm gun
Login name: egsirer                 In real life: Emin Gun Sirer
 Directory: /u/egsirer              Shell: /bin/sh
Last login Thu May 23 19:05 on ttyq3 from bow.Princeton.ED
New mail received Fri May 24 02:30:28 1991;
unread since Fri May 24 02:30:27 1991
% alias -g phx=phoenix.princeton.edu warc=wuarchive.wustl.edu
% ftp warc
Connected to wuarchive.wustl.edu.
Вот еще несколько интересных применений.

Код: Выделить всё

% alias -g M=’| more’ GF=’| fgrep -f  ̃/.friends’
% who M    # pipes the output of who through more
% who GF   # see if your friends are on
% w GF     # see what your friends are doing
В другом примере используется замена процесса zsh. Если вы запускаете NIS, и вам не хватает возможности сделать это:

Код: Выделить всё

% grep pfalstad /etc/passwd
вы можете определить псевдоним, который будет казаться более естественным, чем ypmatch pfalstad passwd:

Код: Выделить всё

% alias -g PASS=’<(ypcat passwd)’
% grep pfalstad PASS
pfalstad:*:3564:35:Paul John Falstad:/u/pfalstad:/usr/princeton/bin/zsh
Если вы действительно сумасшедший, вы можете даже назвать его / etc / passwd:

Код: Выделить всё

% alias -g /etc/passwd=’<(ypcat passwd)’
% grep pfalstad /etc/passwd
pfalstad:*:3564:35:Paul John Falstad:/u/pfalstad:/usr/princeton/bin/zsh
Последний пример показывает одну из опасностей глобальных псевдонимов; у них есть много возможностей вызвать путаницу. Например, если вы определили глобальный псевдоним, называемый | (что возможно), zsh начнет действовать очень странно; каждый символ трубы будет заменен текстом вашего псевдонима. В какой-то степени глобальные псевдонимы похожи на макросы в C; дискреционность рекомендуется использовать и выбирать имена для них. Использование имен во всех кепках - неплохая идея, особенно для псевдонимов, которые вводят метасинтакс оболочки (например, M и GF выше).
Обратите внимание, что zsh-псевдонимы не похожи на csh-псевдонимы. Синтаксис их определения различен, и у них нет аргументов. Все ваши любимые псевдонимы csh, вероятно, не будут работать под zsh. Например, если вы попытаетесь:

Код: Выделить всё

alias rm mv ’\!* /tmp/wastebasket’
никакие псевдонимы не будут определены, но zsh не сообщит об ошибке. В csh эта строка определяет псевдоним, который делает rm safe --- файлы, которые rm'd будут перемещены во временный каталог, а не мгновенно уничтожены. Однако в синтаксисе zsh эта строка запрашивает оболочку для печати любых существующих определений псевдонимов для rm, mv или! * / Tmp / wastebasket. Поскольку их нет, скорее всего, оболочка ничего не напечатает, хотя псевдоним вернет ненулевой код выхода. Правильный синтаксис таков:

Код: Выделить всё

alias rm=’mv \!* /tmp/wastebasket’
Однако это тоже не сработает:

Код: Выделить всё

% rm foo.dvi
zsh: no matches found: !*
Хотя это делает rm безопасным, это, конечно, не то, что пользователь намеревался. В zsh вы должны использовать для этого функцию оболочки:

Код: Выделить всё

% unalias rm
% rm () { mv $* /tmp/wastebasket }
% rm foo.dvi
% ls /tmp/wastebasket
foo.dvi
Хотя это намного чище и легче читать (надеюсь, вы согласитесь), это не совместимо с csh. Таким образом, был предоставлен скрипт для преобразования псевдонимов и переменных csh. Вы должны использовать его только один раз, чтобы преобразовать все ваши псевдонимы и параметры csh в формат zsh:

Код: Выделить всё

% csh
csh> alias
l                           ls -AF
more                        less
on                          last -2 !:1 ; who | grep !:1
csh> exit
% c2z >neat_zsh_aliases
% cat neat_zsh_aliases
alias l=’ls -AF’
alias more=’less’
on () { last -2 $1 ; who | grep $1 }
Первые два псевдонима были преобразованы в обычные zsh-псевдонимы, а третий, поскольку он должен обрабатывать аргументы, был преобразована в функцию. c2z может без проблем конвертировать большинство алиасов в формат zsh. Однако, если вы используете какой-то действительно тайный csh трюки, или если у вас есть псевдоним с именем вроде do (который зарезервирован в zsh), вам может понадобиться исправить некоторые из псевдонимов вручную.
Сценарий c2z проверяет вашу настройку csh и создает список команд zsh, которые реплицируют ваши псевдонимы и param- как можно ближе. Вы можете включить его вывод в свой файл запуска, .zshrc.
==========================
Алиасы (псевдонимы) - это наше все! Больше алиасов, хороших и разных!
В принципе, написать алиас много ума не надо. А вот реально хороших, которые подойдут всем, будут интуитивно понятны - не так уж и много. 20? 30? 50?
Впрочем, вы можете создать свой комплект псевдонимов, понятный и удобный только для вас (посторонний в вашей консоли может оказаться как без рук: - это может оказаться получше иной шифровки :-) - и правильно: нефига посторонним делать в вашей консоли!).
==========================

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1649
Зарегистрирован: 10 сен 2016, 10:16
Решено: 19
Откуда: Москва
Благодарил (а): 693 раза
Поблагодарили: 187 раз
Контактная информация:

zsh (перевод)

#10

19 авг 2018, 10:03

==========================
History
There are several ways to manipulate history in zsh. One way is to use csh-style ! history:
...
If you don’t want to use this, you can turn it off by typing setopt nobanghist. If you are afraid of accidentally executing the wrong command you can set the HISTVERIFY option. If this option is set, commands that result from history expansion will not be executed immediately, but will be put back into the editor buffer for further consideration.
If you’re not familiar with ! history, here follows some explanation. History substitutions always start with a !, commonly called “bang”. After the ! comes an (optional) designation of which “event” (command) to use, then a colon, and then a designation of what word of that command to use. For example, !-n refers to the command n commands ago.
...
No word designator was used, which means that the whole command referred to was repeated. Note that the shell will echo the result of the history substitution. The word designator can, among other things, be a number indicating the argument to use, where 0 is the command.
...
In this example, no event designator was used, which tells zsh to use the previous command. A $ specifies the last argument
...
If you use more words of the same command, only the first ! needs an event designator.
...
This is different from csh, where a bang with no event designator always refers to the previous command. If you actually like this
behaviour, set the CSHJUNKIEHISTORY option.
...
Another way to use history is to use the fc command. For example, if you type an erroneous command:
...
typing fc will execute an editor on this command, allowing you to fix it. (The default editor is vi, by the way, not ed).
...
A variant of the fc command is r, which redoes the last command, with optional changes:
...
==========================
история (Хистори)
Существует несколько способов управления историей в zsh. Один из способов - использовать стиль csh ! history :

Код: Выделить всё

% /usr/local/bin/!:0 !-2*:s/foo/bar/ >>!$
Если вы не хотите использовать это, вы можете отключить его, набрав setopt nobanghist. Если вы боитесь случайно выполнить неправильную команду, вы можете установить опцию HISTVERIFY. Если этот параметр установлен, команды, которые являются результатом расширения истории, не будут выполняться немедленно, но будут возвращены в буфер редактора для дальнейшего рассмотрения.
Если вы не знакомы ! history, здесь следует некоторое объяснение. Замены истории всегда начинаются с !, Обычно называемого «bang». После ! приходит (необязательное) обозначение, в котором используется «событие» (команда), затем двоеточие, а затем указание того, какое слово этой команды использовать. Например, ! -n ссылается на команду n команд назад.

Код: Выделить всё

% ls
foo bar
% cd foo
% !-2
ls
baz bam
Никакой указатель слов не использовался, а это означает, что вся команда, о которой идет речь, была повторена. Обратите внимание, что оболочка будет отображать результат замены истории. Обозначение слова может, среди прочего, быть числом, указывающим аргумент для использования, где 0 - это команда.

Код: Выделить всё

% /usr/bin/ls foo
foo
% !:0 bar
/usr/bin/ls bar
bar
В этом примере не был назначен указатель события, который сообщает zsh использовать предыдущую команду. A $ указывает последний аргумент

Код: Выделить всё

% mkdir /usr/local/lib/emacs/site-lisp/calc
% cd !:$
cd /usr/local/lib/emacs/site-lisp/calc
Если вы используете больше слов одной и той же команды, только первый ! требуется обозначение события.

Код: Выделить всё

% make prig >> make.log
make: *** No rule to make target ‘prig’.
 Stop.
% cd src
% !-2:0 prog >> !:$
make prog >> make.log
Это отличается от csh, где ударом без обозначения события всегда ссылается предыдущая команда. Если вам это действительно нравится выполните настройку CSHJUNKIEHISTORY.

Код: Выделить всё

% setopt cshjunkiehistory
% !-2:0 prog2 >> !:$
make prog2 >> cshjunkiehistory
Другой способ использования истории - использовать команду fc. Например, если вы вводите ошибочную команду:

Код: Выделить всё

% for i in ‘cat /etc/clients‘
do
rpu $i
done
zsh: command not found: rpu
zsh: command not found: rpu
zsh: command not found: rpu
...
typing fc выполнит редактор этой команды, что позволит вам исправить ее. (Редактор по умолчанию - vi, кстати, не отредактирован).

Код: Выделить всё

% fc
49
/rpu/s//rup/p
rup $i
w
49
q
for i in ‘cat /etc/clients‘
do
rup $i
done
              beam             up 2 days,  10:17, load average:     0.86, 0.80, 0.50
              bow              up 4 days,   8:41, load average:     0.91, 0.80, 0.50
              burn             up          17:18, load average:     0.91, 0.80, 0.50
              burst            up 9 days,   1:49, load average:     0.95, 0.80, 0.50
              tan              up          11:14, load average:     0.91, 0.80, 0.50
              bathe            up 3 days,  17:49, load average:     1.84, 1.79, 1.50
              bird             up 1 day,    9:13, load average:     1.95, 1.82, 1.51
              bonnet           up 2 days,  21:18, load average:     0.93, 0.80, 0.50

...
Вариантом команды fc является r, который повторяет последнюю команду с дополнительными изменениями:

Код: Выделить всё

% echo foo
foo
% r
echo foo
foo
% echo foo
foo
% r foo=bar
echo bar
bar

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1649
Зарегистрирован: 10 сен 2016, 10:16
Решено: 19
Откуда: Москва
Благодарил (а): 693 раза
Поблагодарили: 187 раз
Контактная информация:

zsh (перевод)

#11

19 авг 2018, 10:08

==========================
Command Line Editing
zsh’s command line editor, ZLE, is quite powerful. It is designed to emulate either emacs or vi; the default is emacs. To set the bindings for vi mode, type bindkey -v. If your EDITOR or VISUAL environment variable is vi, zsh will use vi emulation by default. You can then switch to emacs mode with bindkey -e.
In addition to basic editing, the shell allows you to recall previous lines in the history. In emacs mode, this is done with ˆP (control-P) or (on many terminals) with the cursor-up key:
...
Pressing ˆP once brings up the previous line (echo foobar); pressing it again brings up the line before that (ls ̃). The cursor is left at the end of the line, allowing you to edit the line if desired before executing it. In many cases, ZLE eliminates the need for the fc command, since it is powerful enough to handle even multiline commands:
...
Now you can just move up to the part you want to change...
...
change it, and execute the new command.
...
Also, you can search the history for a certain command using ESC-P, this will look for the last command that started with the (part of the) word at the beginning of the current line. Hitting ESC-P another time gets you the command before that, etc.
...
Another way is to do an incremental search, emacs-style:
...
Suppose you have retrieved an old history event in one of these ways and would like to execute several consecutive old commands starting with this one. ˆO will execute the current command and then put the next command from the history into the editor buffer. Typing ˆO several times will therefore reexecute several consecutive commands from the history. Of course, you can edit some of those commands in between.
In addition to completion (see below), TAB performs expansion if possible.
...
For example, suppose you have a bunch of weird files in an important directory:
...
You want to remove them, but you don’t want to damage foo.c. Here is one way to do this:
...
When you expand *, zsh inserts the names of all the files into the editing buffer, with proper shell quoting. Now, just move back and remove foo.c from the buffer:
...
and press return. Everything except foo.c will be deleted from the directory. If you do not want to actually expand the current word, but would like to see what the matches are, type ˆXg.
...
Here’s another trick; let’s say you have typed this command in:
...
and you forget which library you want. You need to escape out for a minute and check by typing ls /usr/lib, or some other such command; but you don’t want to retype the whole command again, and you can’t press return now because the current command is incomplete. In zsh, you can put the line on the buffer stack, using ESC-Q, and type some other commands. The next time a prompt is printed, the gcc line will be popped off the stack and put in the editing buffer automatically; you can then enter the proper library name and press return (or, ESC-Q again and look for some other libraries whose names you forgot).
A similar situation: what if you forget the option to gcc that finds bugs using AI techniques? You could either use ESC-Q again, and type man gcc, or you could press ESC-H, which essentially does the same thing; it puts the current line on the buffer stack, and executes the command run-help gcc, where run-help is an alias for man.
Another interesting command is ESC-A. This executes the current line, but retains it in the buffer, so that it appears again when the next prompt is printed. Also, the cursor stays in the same place. This is useful for executing a series of similar commands:
...
The ESC-’ command is useful for managing the shell’s quoting conventions. Let’s say you want to print this string:
...
All that is necessary is to type it into the editing buffer:
...
press ESC-’ (escape-quote):
...
then move to the beginning and add the echo command.
...
Let’s say you want to create an alias to do this echo command. This can be done by recalling the line with ˆP and pressing ESC-’ again:
...
and then move to the beginning and add the command to create an alias.
...
If one of these fancy editor commands changes your command line in a way you did not intend, you can undo changes with ˆ_, if you can get it out of your keyboard, or ˆXˆU, otherwise.
Another use of the editor is to edit the value of variables. For example, an easy way to change your path is to use the vared command:
...
You can now edit the path. When you press return, the contents of the edit buffer will be assigned to PATH.
==========================
Редактирование командной строки
Редактор командной строки zsh, ZLE, достаточно мощный. Он предназначен для эмуляции emacs или vi; по умолчанию используется emacs. Чтобы установить привязки для режима vi, введите bindkey -v. Если переменная среды EDITOR или VISUAL - vi, zsh будет использовать эмуляцию vi по умолчанию. Затем вы можете переключиться в режим emacs с помощью bindkey -e.
В дополнение к базовому редактированию оболочка позволяет вам вспомнить предыдущие строки в истории. В режиме emacs это делается с помощью P (control-P) или (на многих терминалах) с помощью клавиши «курсор вверх»:

Код: Выделить всё

% ls  ̃
...
% echo foobar
foobar
% ˆP
% echo foobarˆP
% ls  ̃_
Нажатие P один раз поднимает предыдущую строку (эхо foobar); нажатие на него снова вызывает линию перед этим (ls). Курсор остается в конце строки, позволяя вам отредактировать строку, если это необходимо, перед ее выполнением. Во многих случаях ZLE устраняет необходимость в команде fc, поскольку она достаточно мощна для обработки даже многострочных команд:

Код: Выделить всё

% for i in a b c d e
> do
> echo $i
> done
a
b
c
d
e
% ˆP
% for i in a b c d e
do
echo $i
done_
Теперь вы можете просто перейти к той части, которую хотите изменить ...

Код: Выделить всё

% for i in a b c d e
do
echo $i
done
изменить его и выполнить новую команду.

Код: Выделить всё

% for i in f g h i j
do
echo $i
done
f
g
h
i
j
Кроме того, вы можете искать историю для определенной команды с помощью ESC-P, это будет искать последнюю команду, которая начиналась с (части) слова в начале текущей строки. Нажатие ESC-P еще раз доставляет вам команду до этого и т. Д.

Код: Выделить всё

% set ESC-P
% setopt autolist ESC-P
% setopt nocorrect_
Другой способ - сделать инкрементный поиск, emacs-style:

Код: Выделить всё

% ˆR
% _
i-search:
% ls /usr/bin
i-search: l
% date > foofile.c
i-search: le
Предположим, что одним из этих способов вы получили событие старой истории и хотели бы выполнить несколько последовательных старых команд, начиная с этого. O выполнит текущую команду, а затем добавит следующую команду из истории в буфер редактора. Ввод O несколько раз будет повторно выполнять несколько последовательных команд из истории. Конечно, вы можете редактировать некоторые из этих команд между ними.
В дополнение к завершению (см. Ниже), TAB выполняет расширение, если это возможно.

Код: Выделить всё

% ls *.cTAB
% ls foofile.c fortune.c rnd.c strfile.c unstr.c_
Например, предположим, что у вас есть куча странных файлов в важном каталоге:

Код: Выделить всё

% ls
* * *           ; & % $??foo        dspfok        foo.c
!"foo"!         ‘ \ ‘               foo           rrr
Вы хотите удалить их, но вы не хотите нанести вред foo.c. Вот один из способов сделать это:

Код: Выделить всё

% rm *TAB
% rm \ \ \*\ \*\ \*\ \ \ \!\"foo\"\! \;\ \&\ %\ \$’
 ́ ’foo \‘\ \\\ \‘ dspfok foo foo.c rrr_
Когда вы расширяете *, zsh вставляет имена всех файлов в буфер редактирования, с соответствующим цитированием оболочки. Теперь просто вернитесь назад и удалите foo.c из буфера:

Код: Выделить всё

% rm \ \ \*\ \*\ \*\ \ \ \!\"foo\"\! \;\ \&\ %\ \$’
’foo  ́
 \‘\ \\\ \‘ dspfok foo rrr
и нажмите return. Все, кроме foo.c, будет удалено из каталога. Если вы не хотите фактически расширять текущее слово, но хотите посмотреть, что такое совпадения, введите Xg.

Код: Выделить всё

% rm f*ˆXg
foo
 foo.c
% rm f*_
Вот еще один трюк; допустим, вы набрали эту команду:

Код: Выделить всё

% gcc -o x.out foob.c -g -Wpointer-arith -Wtrigraphs_
и вы забываете, какую библиотеку вы хотите. Вам нужно сбежать на минутку и проверить, набрав ls / usr / lib или какую-либо другую такую ​​команду; но вы не хотите повторно вводить всю команду еще раз, и вы не можете нажать return сейчас, потому что текущая команда неполна. В zsh вы можете поместить строку в стек буфера, используя ESC-Q, и ввести некоторые другие команды. В следующий раз, когда будет напечатано приглашение, строка gcc будет удалена из стека и автоматически добавлена ​​в буфер редактирования; вы можете ввести правильное имя библиотеки и нажать return (или ESC-Q снова и искать другие библиотеки, имена которых вы забыли).
Аналогичная ситуация: что, если вы забудете вариант gcc, который обнаруживает ошибки с использованием методов AI? Вы можете снова использовать ESC-Q и набрать man gcc, или вы можете нажать ESC-H, что по сути делает то же самое; он помещает текущую строку в стек буфера и выполняет команду run-help gcc, где run-help - это псевдоним для человека.
Еще одна интересная команда - ESC-A. Это выполняет текущую строку, но сохраняет ее в буфере, так что она появляется снова при печати следующего приглашения. Кроме того, курсор остается в одном месте. Это полезно для выполнения ряда похожих команд:

Код: Выделить всё

% cc grok.c -g -lc -lgl -lsun -lmalloc -Bstatic -o b.out
% cc fubar.c -g -lc -lgl -lsun -lmalloc -Bstatic -o b.out
% cc fooble.c -g -lc -lgl -lsun -lmalloc -Bstatic -o b.out
Команда ESC- 'полезна для управления условными обозначениями оболочки. Предположим, вы хотите напечатать эту строку:

Код: Выделить всё

don’t do that; type ’rm -rf \*’, with a \ before the *.
Все, что необходимо - это ввести его в буфер редактирования:

Код: Выделить всё

% don’t do that; type ’rm -rf \*’, with a \ before the *.
нажмите ESC- '(escape-quote):

Код: Выделить всё

% ’don’\’’t do that; type ’\’’rm -rf \*’\’’, with a \ before the *.’
затем перейдите в начало и добавьте команду эха.

Код: Выделить всё

% echo ’don’\’’t do that; type ’\’’rm -rf \*’\’’, with a \ before the *.’
don’t do that; type ’rm -rf \*’, with a \ before the *
.
Предположим, вы хотите создать псевдоним для выполнения этой команды echo. Это можно сделать, вызвав линию с помощью P и снова нажав ESC- ':

Код: Выделить всё

% ’echo ’\’’don’\’’\’\’’’\’’t do that; type ’\’’\’\’’’\’’rm -rf
\*’\’’\’\’’’\’’, with a \ before the *.’\’’’
а затем перейдите в начало и добавьте команду для создания псевдонима.

Код: Выделить всё

% alias zoof=’echo ’\’’don’\’’\’\’’’\’’t do that; type ’\’’\’\’’’\’’rm
-rf \*’\’’\’\’’’\’’, with a \ before the *.’\’’’
% zoof
don’t do that; type ’rm -rf \*’, with a \ before the *.
Если одна из этих причудливых команд редактора изменяет вашу командную строку так, как вы ее не предполагали, вы можете отменить изменения с помощью _, если вы можете извлечь ее из своей клавиатуры или XU, в противном случае.
Другое использование редактора - изменить значение переменных. Например, простой способ изменить свой путь - использовать команду vared:

Код: Выделить всё

% vared PATH
> /u/pfalstad/scr:/u/pfalstad/bin/sun4:/u/maruchck/scr:/u/subbarao/bin:/u/maruc
hck/bin:/u/subbarao/scripts:/usr/princeton/bin:/usr/ucb:/usr/bin:/bin:/usr/host
s:/usr/princeton/bin/X11:/./usr/lang:/./usr/etc:/./etc
Теперь вы можете отредактировать путь. Когда вы нажимаете return, содержимое буфера редактирования будет присвоено PATH.
==========================
В данном разделе имел не мало проблем с написанием, форматированием и версткой кода команд. Несколько раз пытался редактировать, но до идеала так и не дотянул. Если вы хотите избежать ошибок - лучше откройте рядом первоисточник (intro.a4.pdf для zsh 5.5.1.) и изучайте код оттуда.
Лично для меня, данный раздел сложноват. И я его в повседневной практике (пока) использовать не собираюсь.
==========================

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1649
Зарегистрирован: 10 сен 2016, 10:16
Решено: 19
Откуда: Москва
Благодарил (а): 693 раза
Поблагодарили: 187 раз
Контактная информация:

zsh (перевод)

#12

19 авг 2018, 10:16

==========================
Completion
Another great zsh feature is completion. If you hit TAB, zsh will complete all kinds of stuff. Like commands or filenames:
...
If the completion is ambiguous, the editor will beep. If you find this annoying, you can set the NOLISTBEEP option. Completion can even be done in the middle of words. To use this, you will have to set the COMPLETEINWORD option:
...
You can list possible completions by pressing ˆD:
...
Or, you could just set the AUTOLIST option:
...
If you like to see the types of the files in these lists, like in ls -F, you can set the LISTTYPES option. Together with AUTOLIST you can use LISTAMBIGUOUS. This will only list the possibilities if there is no unambiguous part to add:
...
If you don’t want several of these listings to scroll the screen so much, the ALWAYSLASTPROMPT option is useful. If set, you can continue to edit the line you were editing, with the completion listing appearing beneath it.
Another interesting option is MENUCOMPLETE. This affects the way TAB works. Let’s look at the /vmunix example again:
...
Each time you press TAB, it displays the next possible completion. In this way, you can cycle through the possible completions until you find the one you want.
The AUTOMENU option makes a nice compromise between this method of completion and the regular method. If you set this option, pressing TAB once completes the unambiguous part normally, pressing the TAB key repeatedly after an ambiguous completion will cycle through the possible completions.
Another option you could set is RECEXACT, which causes exact matches to be accepted, even if there are other possible completions:
...
To facilitate the typing of pathnames, a slash will be added whenever a directory is completed. Some computers don’t like the spurious slashes at the end of directory names. In that case, the AUTOREMOVESLASH option comes to rescue. It will remove these slashes when you type a space or return after them.
The fignore variable lists suffixes of files to ignore during completion.
...
Since foofile.o has a suffix that is in the fignore list, it was not considered a possible completion of foo.
Username completion is also supported:
...
and parameter name completion:
...
Note that in the last example a space is added after the completion as usual. But if you want to add a colon or closing brace, you probably don’t want this extra space. Setting the AUTOPARAMKEYS option will automatically remove this space if you type a colon or closing brace after such a completion.
There is also option completion:
...
and binding completion:
...
The compctl command is used to control completion of the arguments of specific commands. For example, to specify that certain commands take other commands as arguments, you use compctl -c:
...
To specify that a command should complete filenames, you should use compctl -f. This is the default. It can be combined with -c, as well.
...
Similarly, use -o to specify options, -v to specify variables, and -b to specify bindings.
...
You can also use -k to specify a custom list of keywords to use in completion. After the -k comes either the name of an array or a literal array to take completions from.
...
To better specify the files to complete for a command, use the -g option which takes any glob pattern as an argument. Be sure to quote the glob patterns as otherwise they will be expanded when the compctl command is run.
...
Glob patterns can include qualifiers within parentheses. To rmdir only directories and cd to directories and symbolic links pointing to them:
...
RCS users like to run commands on files which are not in the current directory, but in the RCS subdirectory where they all get ,v suffixes. They might like to use
...
The :t modifier keeps only the last part of the pathname and the :s/\,v// will replace any ,v by nothing.
The -s flag is similar to -g, but it uses all expansions, instead of just globbing, like brace expansion, parameter substitution and command substitution.
...
will only complete options which are actually set to be arguments to unsetopt.
Sometimes a command takes another command as its argument. You can tell zsh to complete commands as the first argument to such a command and then use the completion method of the second command. The -l flag with a nullstring argument is used for this.
...
Sometimes you would like to run really complicated commands to find out what the possible completions are. To do this, you can specify a shell function to be called that will assign the possible completions to a variable called reply. Note that this variable must be an array. Here’s another (much slower) way to get the completions for co and friends:
...
Some command arguments use a prefix that is not a part of the things to complete. The kill builtin command takes a signal name after a -. To make such a prefix be ignored in the completion process, you can use the -P flag.
...
The + tells the editor to only take the next thing into account if the current one doesn’t generate any matches. If you have not
changed the default completion, the above example is in fact equivalent to
...
as a lone + at the end is equivalent to specifying the default completion after the +. This form of completion is also frequently
used if you want to run some command only on a certain type of files, but not necessarily in the current directory. In this case
you will want to complete both files of this type and directories. Depending on your preferences you can use either of
...
where the first one will only complete directories (and symbolic links pointing to directories) if no postscript file matches the
already typed part of the argument.
==========================
завершение
Еще одна замечательная функция zsh - это завершение. Если вы нажмете TAB, zsh заполнит всевозможные вещи. Как команды или имена файлов:

Код: Выделить всё

% compTAB
% compress _

% ls nicTAB
% ls nicecolors _

% ls /usr/prTAB
% ls /usr/princeton/_

% ls -l =comTAB
% ls -l =compress _
Если завершение неоднозначно, редактор будет подавать звуковой сигнал. Если вы найдете это раздражающим, вы можете установить опцию NOLISTBEEP. Завершение можно даже сделать посреди слов. Чтобы использовать это, вам необходимо установить параметр COMPLETEINWORD:

Код: Выделить всё

%  setopt completeinword
%  ls /usr/ptonTAB
%  ls /usr/princeton/
%  setopt alwaystoend
%  ls /usr/ptonTAB
%  ls /usr/princeton/_
Вы можете перечислить возможные доработки, нажав D:

Код: Выделить всё

% ls /vmuTAB —beep—
% ls /vmunix_
% ls /vmunixˆD
vmunix                           vmunix.old
vmunix.new.kernelmap.old         vmunix.org
Или вы можете просто установить опцию AUTOLIST:

Код: Выделить всё

% setopt autolist
% ls /vmuTAB —beep—
vmunix                           vmunix.old
vmunix.new.kernelmap.old         vmunix.org
% ls /vmunix_
Если вам нравится просматривать типы файлов в этих списках, например, в ls -F, вы можете установить опцию LISTTYPES. Вместе с AUTOLIST вы можете использовать LISTAMBIGUOUS. Это будет только перечислять возможности, если нет однозначной части для добавления:

Код: Выделить всё

% setopt listambiguous
% ls /vmuTAB —beep—
% ls /vmunix_TAB —beep—
vmunix                           vmunix.old
vmunix.new.kernelmap.old         vmunix.org
Если вы не хотите, чтобы некоторые из этих списков так сильно прокручивали экран, опция ALWAYSLASTPROMPT полезна. Если установлено, вы можете продолжить редактирование строки, которую вы редактировали, с листом завершения, появляющимся под ним.
Еще один интересный вариант - MENUCOMPLETE. Это влияет на работу TAB. Давайте снова рассмотрим пример / vmunix:

Код: Выделить всё

%  setopt menucomplete
%  ls /vmuTAB
%  ls /vmunixTAB
%  ls /vmunix.new.kernelmap.oldTAB
%  ls /vmunix.old_
Каждый раз, когда вы нажимаете TAB, он отображает следующее возможное завершение. Таким образом, вы можете пройти через возможные доработки, пока не найдете тот, который вам нужен.
Опция AUTOMENU делает хороший компромисс между этим методом завершения и регулярным методом. Если вы установите эту опцию, нажатие TAB однажды завершает однозначную часть в обычном режиме, нажимая клавишу TAB несколько раз после того, как неоднозначное завершение будет проходить через возможные доработки.
Другим вариантом, который вы можете установить, является RECEXACT, что приводит к принятию точных совпадений, даже если есть другие возможные доработки:

Код: Выделить всё

% setopt recexact
% ls /vmuTAB —beep—
vmunix                           vmunix.old
vmunix.new.kernelmap.old         vmunix.org
% ls /vmunix_TAB
% ls /vmunix _
Чтобы облегчить ввод имен путей, косая черта будет добавляться всякий раз, когда каталог будет завершен. Некоторым компьютерам не нравятся ложные косые черты в конце имен каталогов. В этом случае опция AUTOREMOVESLASH приходит на помощь. Он удалит эти слэши, когда вы введете пробел или вернетесь после них.
В переменной fignore перечисляются суффиксы файлов, которые игнорируются при завершении.

Код: Выделить всё

% ls fooTAB —beep—
foofile.c foofile.o
% fignore=( .o \ ̃ .bak .junk )
% ls fooTAB
% ls foofile.c _
Поскольку foofile.o имеет суффикс, который находится в списке fignore, это не считалось возможным завершением foo.
Поддержка имени пользователя также поддерживается:

Код: Выделить всё

% ls  ̃pfalTAB
% ls  ̃pfalstad/_
и завершение имени параметра:

Код: Выделить всё

% echo  $ORGTAB
% echo  $ORGANIZATION _
% echo  ${ORGTAB
% echo  ${ORGANIZATION _
Обратите внимание, что в последнем примере пространство добавляется после завершения, как обычно. Но если вы хотите добавить двоеточие или закрытие скобки, вы, вероятно, не хотите этого лишнего места. Установка параметра AUTOPARAMKEYS автоматически удалит это пространство, если вы наберете двоеточие или замыкающую фигуру после такого завершения.
Существует также вариант завершения:

Код: Выделить всё

% setopt noclTAB
% setopt noclobber _
и завершение привязки:

Код: Выделить всё

% bindkey ’ˆXˆX’ puTAB
% bindkey ’ˆXˆX’ push-line _
Команда compctl используется для управления завершением аргументов определенных команд. Например, чтобы указать, что некоторые команды принимают другие команды в качестве аргументов, вы используете compctl -c:

Код: Выделить всё

% compctl -c man nohup
% man uptTAB
% man uptime _
Чтобы указать, что команда должна заполнять имена файлов, вы должны использовать compctl -f. Это значение по умолчанию. Его также можно комбинировать с -c.

Код: Выделить всё

% compctl -cf echo
% echo uptTAB
% echo uptime _
% echo foTAB
% echo foo.c
Аналогично, используйте -o для указания опций, -v для указания переменных и -b для указания привязок.

Код: Выделить всё

% compctl -o setopt unsetopt
% compctl -v typeset vared unset export
% compctl -b bindkey
Вы также можете использовать -k для указания пользовательского списка ключевых слов для использования в завершении. После -k приходит либо имя массива, либо литерал-массив, из которого нужно выполнить завершение.

Код: Выделить всё

%  ftphosts=(ftp.uu.net wuarchive.wustl.edu)
%  compctl -k ftphosts ftp
%  ftp wuTAB
%  ftp wuarchive.wustl.edu _
%  compctl -k ’(cpirazzi subbarao sukthnkr)’ mail finger
%  finger cpTAB
%  finger cpirazzi _
Чтобы лучше указать файлы для завершения для команды, используйте параметр -g, который принимает любой шаблон glob в качестве аргумента. Не забудьте указать шаблоны glob, так как иначе они будут расширены при запуске команды compctl.

Код: Выделить всё

% ls
letter.tex letter.dvi letter.aux
 letter.log
 letter.toc
% compctl -g ’*.tex’ latex
% compctl -g ’*.dvi’ xdvi dvips
% latex lTAB
% latex letter.tex _
% xdvi lTAB
% xdvi letter.dvi _
Шаблоны Glob могут включать квалификаторы в круглых скобках. Для rmdir только каталоги и cd к каталогам и символическим ссылкам, указывающим на них:

Код: Выделить всё

% compctl -g ’*(-/)’ cd
% compctl -g ’*(/)’ rmdir
Пользователи RCS любят запускать команды в файлах, которые не находятся в текущем каталоге, но в подкаталоге RCS, где они все получают, v суффиксы. Они могут захотеть использовать

Код: Выделить всё

% compctl -g ’RCS/*(:t:s/\,v//)’ co rlog rcs
% ls RCS
builtin.c,v lex.c,v        zle_main.c,v
% rlog buTAB
% rlog builtin.c _
Модификатор: t хранит только последнюю часть имени пути и: s / \, v // заменяет любой, v ничем.
Флаг -s похож на -g, но он использует все расширения, а не просто глобусы, такие как расширение фигурных скобок, замещение параметров и замена команд.

Код: Выделить всё

% compctl -s ’$(setopt)’ unsetopt
будут только завершать параметры, которые на самом деле устанавливаются как аргументы для unsetopt.
Иногда команда принимает в качестве аргумента другую команду. Вы можете указать zsh, чтобы завершить команды в качестве первого аргумента для такой команды, а затем использовать метод завершения второй команды. Для этого используется флаг -l с аргументом nullstring.

Код: Выделить всё

%  compctl -l ’’ nohup exec
%  nohup compTAB
%  nohup compress _
%  nohup compress filTAB
%  nohup compress filename _
Иногда вам нужно запускать очень сложные команды, чтобы узнать, какие возможны доработки. Для этого вы можете указать вызываемую функцию оболочки, которая будет назначать возможные доработки переменной, называемой ответом. Обратите внимание, что эта переменная должна быть массивом. Вот еще один (гораздо более медленный) способ получить доработки для друзей и друзей:

Код: Выделить всё

%  function getrcs {
>  reply=()
>  for i in RCS/*
>  do
>  reply=($reply[*] $(basename $i ,v))
>  done
>  }
%  compctl -K getrcs co rlog rcs
Некоторые аргументы команды используют префикс, который не является частью вещей, которые нужно выполнить. Команда kill builtin принимает имя сигнала после a. Чтобы этот префикс был проигнорирован в процессе завершения, вы можете использовать флаг -P.

Код: Выделить всё

% compctl -P - -k signals kill
% kill -HTAB
% kill -HUP _
TeX обычно запускается на файлах, заканчивающихся на .tex, но иногда и на другие файлы. Это несколько раздражает, чтобы указать, что аргументы TeX должны заканчиваться на .tex, а затем не смогут завершить эти другие файлы. Поэтому вы можете указать такие вещи, как «Завершить файлы, заканчивающиеся на .tex, если они доступны, в противном случае завершены до любого имени файла». Это делается с завершенным завершением:

Код: Выделить всё

% compctl -g ’*.tex’ + -f tex
«+» Сообщает редактору учитывать только следующее, если текущий не генерирует совпадений. Если у вас нет изменил значение по умолчанию, приведенный выше пример фактически эквивалентен

Код: Выделить всё

% compctl -g ’*.tex’ + tex
поскольку одиночный + в конце эквивалентен заданию завершения по умолчанию после +. Эта форма завершения также часто используется, если вы хотите запустить некоторую команду только для определенного типа файлов, но не обязательно в текущем каталоге. В этом случае вы захотите завершить оба файла этого типа и каталогов. В зависимости от ваших предпочтений вы можете использовать любой из

Код: Выделить всё

% compctl -g ’*.ps’ + -g ’*(-/)’ ghostview
% compctl -g ’*.ps *(-/)’ ghostview
где первый будет заполнять только каталоги (и символические ссылки, указывающие на каталоги), если файл postscript не соответствует уже введенной части аргумента.
==========================
Очень много всего. Ужасно интересно. Но как это все запомнить?
==========================

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1649
Зарегистрирован: 10 сен 2016, 10:16
Решено: 19
Откуда: Москва
Благодарил (а): 693 раза
Поблагодарили: 187 раз
Контактная информация:

zsh (перевод)

#13

19 авг 2018, 10:19

==========================
Extended completion
If you play with completion, you will soon notice that you would like to specify what to complete, depending on what flags you give to the command and where you are on the command line. For example, a command could take any filename argument after a -f flag, a username after a -u flag and an executable after a -x flag. This section will introduce you to the ways to specify these things. To many people it seems rather difficult at first, but taking the trouble to understand it can save you lots of typing in the end. Even I keep being surprised when zsh manages to complete a small or even empty prefix to the right file in a large directory.
To tell zsh about these kinds of completion, you use “extended completion” by specifying the -x flag to compctl.
The -x flag takes a list of patterns/flags pairs. The patterns specify when to complete and the flags specify what.
The flags are simply those mentioned above, like -f or -g glob pattern.
As an example, the r[string1,string2] pattern matches if the cursor is after something that starts with string1 and before something that starts with string2. The string2 is often something that you do not want to match anything at all.
...
In the above example, if the cursor is after the -d the pattern will match and therefore zsh uses the -g *.Z flag that will only complete files ending in .Z. Otherwise, if no pattern matches, it will use the flags before the -x and in this case complete every file that does not end in .Z.
The s[string] pattern matches if the current word starts with string. The string itself is not considered to be part of the completion.
...
The tar command takes a tar file as an argument after the -f option. The c[offset,string] pattern matches if the word in position offset relative to the current word is string. More in particular, if offset is -1, it matches if the previous word is string. This suggests
...
But this is not enough. The -f option could be the last of a longer string of options. C[...,...] is just like c[...,...], except that it uses glob-like pattern matching for string. So
...
will complete tar files after any option string ending in an f. But we’d like even more. Old versions of tar used all options as the first argument, but without the minus sign. This might be inconsistent with option usage in all other commands, but it is still supported by newer versions of tar. So we would also like to complete tar files if the first argument ends in an f and we’re right behind it.
We can ‘and’ patterns by putting them next to each other with a space between them. We can ‘or’ these sets by putting comma’s between them. We will also need some new patterns. p[num] will match if the current argument (the one to be completed) is the numth argument. W[index,pattern] will match if the argument in place index matches the pattern. This gives us
...
In words: If the previous argument is an option string that ends in an f, or the first argument ended in an f and it is now the second argument, then complete only filenames ending in .tar.
All the above examples used only one set of patterns with one completion flag. You can use several of these pattern/flag pairs separated by a -. The first matching pattern will be used. Suppose you have a version of tar that supports compressed files by using a -Z option. Leaving the old tar syntax aside for a moment, we would like to complete files ending in .tar.Z if a -Z option has been used and files ending in .tar otherwise, all this only after a -f flag. Again, the -Z can be alone or it can be part of a longer option string, perhaps the same as that of the -f flag. Here’s how to do it; note the backslash and the secondary prompt which are not part of the compctl command.
...
The first pattern set tells us to match if either the previous argument was an option string including a Z and ending in an f or there was an option string with a Z somewhere and the previous word was any option string ending in an f. If this is the case, we need a compressed tar file. Only if this is not the case the second pattern set will be considered. By the way, R[pattern1,pattern2] is just like r[...,...] except that it uses pattern matching with shell metacharacters instead of just strings.
You will have noticed the -- before the command name. This ends the list of pattern/flag pairs of -x. It is usually used just before the command name, but you can also use an extended completion as one part of a list of xored completions, in which case the -- appears just before one of the + signs.
Note the difference between using extended completion as part of a list of xored completions as in
...
and specifying something before the -x as in
...
In the first case, the alternative glob pattern (ˆ*.Z) will be used if the first part does not generate any possible completions, while in the second case the alternative glob pattern will only be used if the r[...] pattern doesn’t match.
==========================
Расширенное завершение
Если вы играете с завершением, вы скоро заметите, что хотите указать, что делать, в зависимости от того, какие флажки вы даете команде и где вы находитесь в командной строке. Например, команда может принимать любой аргумент имени файла после флага -f, имя пользователя после флага -u и исполняемый файл после флага -x. В этом разделе мы расскажем вам о способах определения этих вещей. Для многих это кажется довольно сложным сначала, но, беря на себя труд понять это, может сэкономить много ввода в конце. Даже я все время удивляюсь, когда zsh удается завершить небольшой или даже пустой префикс в правильный файл в большой директории.
Чтобы сообщить zsh об этих типах завершения, вы используете «расширенное завершение», указав флаг -x в compctl.
Флаг -x принимает список пар паттернов / флагов. Шаблоны указывают, когда нужно заполнить, а флажки - что.
Флаги - это просто те, что указаны выше, например, -f или -g glob pattern.
В качестве примера шаблон r [string1, string2] соответствует, если курсор находится после чего-то, начинающегося с string1, и перед тем, что начинается с string2. Строка2 часто является чем-то, что вы вообще не хотите сопоставлять.

Код: Выделить всё

% ls
foo1         bar1         foo.Z         bar.Z
% compctl -g ’ˆ*.Z’ -x ’r[-d,---]’ -g ’*.Z’ -- compress
% compress fTAB
% compress foo1 _
% compress -d fTAB
% compress -d foo.Z _
В приведенном выше примере, если курсор находится после -d, шаблон будет соответствовать, и поэтому zsh использует флаг -g * .Z, который будет заполнять только файлы, заканчивающиеся на .Z. В противном случае, если шаблон не совпадает, он будет использовать флаги перед -x и в этом случае заполнить каждый файл, который не заканчивается на .Z.
Шаблон s [string] соответствует, если текущее слово начинается со строки. Сама строка не считается частью завершения.

Код: Выделить всё

% compctl -x ’s[-]’ -k signals -- kill
% kill -HTAB
% kill -HUP _
Команда tar принимает файл tar в качестве аргумента после параметра -f. Образец c [offset, string] совпадает, если слово в смещении положено относительно текущего слова является строкой. В частности, если смещение равно -1, оно соответствует, если предыдущее слово является строкой. Это предполагает

Код: Выделить всё

% compctl -f -x ’c[-1,-f]’ -g ’*.tar’ -- tar
Но этого недостаточно. Параметр -f может быть последним из более длинной строки параметров. C [..., ...] аналогичен c [..., ...], за исключением того, что он использует сопоставление шаблонов с глобусом для строки. Так

Код: Выделить всё

% compctl -f -x ’C[-1,-*f]’ -g ’*.tar’ -- tar
будет заполнять tar-файлы после любой строки опций, заканчивающейся символом f. Но мы хотели бы еще больше. Старые версии tar использовали все параметры в качестве первого аргумента, но без знака «минус». Это может быть несовместимо с использованием опций во всех других командах, но оно по-прежнему поддерживается более новыми версиями tar. Поэтому мы также хотели бы заполнить tar-файлы, если первый аргумент заканчивается на f, и мы прямо за ним.
Мы можем «и» моделировать, помещая их рядом друг с другом в пространство между ними. Мы можем «или» эти множества, помещая запятую между ними. Нам также понадобятся новые шаблоны. p [num] будет соответствовать, если текущий аргумент (тот, который должен быть завершен) является аргументом numass. W [index, pattern] будет соответствовать, если аргумент в месте индекса соответствует шаблону. Это дает нам

Код: Выделить всё

% compctl -f -x ’C[-1,-*f] , W[1,*f] p[2]’ -g ’*.tar’ -- tar
В словах: Если предыдущим аргументом является строка опций, которая заканчивается на f, или первый аргумент заканчивается на f, и теперь это второй аргумент, то завершайте только имена файлов, заканчивающиеся на .tar.
Все приведенные выше примеры использовали только один набор шаблонов с одним значком завершения. Вы можете использовать несколько пар этих паттернов / флагов, разделенных символом -. Будет использоваться первый шаблон соответствия. Предположим, у вас есть версия tar, которая поддерживает сжатые файлы с помощью опции -Z. Оставив старый синтаксис tar на некоторое время, мы хотели бы завершить файлы, заканчивающиеся на .tar.Z, если была использована опция -Z и файлы, заканчивающиеся на .tar, в противном случае все это только после флага -f. Опять же, -Z может быть одним или может быть частью более длинной строки опций, возможно, такой же, как флаг -f. Вот как это сделать; обратите внимание на обратную косую черту и вторичное приглашение, которые не являются частью команды compctl.

Код: Выделить всё

% compctl -f -x ’C[-1,-*Z*f] , R[-*Z*,---] C[-1,-*f]’ -g ’*.tar.Z’ - \
> ’C[-1,-*f]’ -g ’*.tar’ -- tar
Первый набор шаблонов подсказывает нам совпадение, если либо предыдущий аргумент был опциональной строкой, включающей Z, и заканчивающийся в f, либо была строка опций с Z где-то, а предыдущее слово - любая строка опций, заканчивающаяся на f. Если это так, нам нужен сжатый файл tar. Только если это не так, будет рассмотрен второй набор шаблонов. Кстати, R [pattern1, pattern2] подобен r [..., ...], за исключением того, что он использует сопоставление шаблонов с метасимволами оболочки вместо простых строк.
Вы заметили бы - перед именем команды. Это завершает список паттернов / флагов -x. Он обычно используется непосредственно перед именем команды, но вы также можете использовать расширенное завершение как одну часть списка xored-дополнений, и в этом случае - появляется непосредственно перед одним из знаков +.
Обратите внимание на разницу между использованием расширенного завершения как части списка xored доработок, как в

Код: Выделить всё

% ls
foo bar
% compctl -x ’r[-d,---]’ -g ’*.Z’ -- + -g ’ˆ*.Z’ compress
% compress -d fTAB
% compress -d foo _
и указав что-то перед -x, как в

Код: Выделить всё

% compctl -g ’ˆ*.Z’ -x ’r[-d,---]’ -g ’*.Z’ -- compress
% compress -d fTAB
% compress -d f_
В первом случае альтернативный шаблон glob (* .Z) будет использоваться, если первая часть не создает никаких возможных завершений, тогда как во втором случае альтернативный шаблон glob будет использоваться, только если шаблон r [...] не совпадает.
==========================
Высший пилотаж. Не для меня.
==========================

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1649
Зарегистрирован: 10 сен 2016, 10:16
Решено: 19
Откуда: Москва
Благодарил (а): 693 раза
Поблагодарили: 187 раз
Контактная информация:

zsh (перевод)

#14

19 авг 2018, 10:21

==========================
Bindings
Each of the editor commands we have seen was actually a function bound by default to a certain key. The real names of the commands are:
...
These bindings are arbitrary; you could change them if you want. For example, to bind accept-line to ˆZ:
...
Another idea would be to bind the delete key to delete-char; this might be convenient if you use ˆH for backspace.
...
Or, you could bind ˆXˆH to run-help:
...
Other examples:
...
universal-argument multiplies the next command by 4. Thus ˆXˆZˆW might delete the last four words on the line. If you bind space to magic-space, then csh-style history expansion is done on the line whenever you press the space bar.
...
Something that often happens is that I am typing a multiline command and discover an error in one of the previous lines. In this case, push-line-or-edit will put the entire multiline construct into the editor buffer. If there is only a single line, it is equivalent to push-line.
The -s flag to bindkey specifies that you are binding the key to a string, not a command. Thus bindkey -s ’ˆT’ ’uptime\n’ lets you VMS lovers get the load average whenever you press ˆT.
If you have a NeXT keyboard, the one with the | and \ keys very inconveniently placed, the following bindings may come in handy:
...
Now you can type ALT-/ to get a backslash, and ALT-= to get a vertical bar. This only works inside zsh, of course; bindkey has no effect on the key mappings inside talk or mail, etc.
Some people like to bind ˆS and ˆQ to editor commands. Just binding these has no effect, as the terminal will catch them and use them for flow control. You could unset them as stop and start characters, but most people like to use these for external commands. The solution is to set the NOFLOWCONTROL option. This will allow you to bind the start and stop characters to editor commands, while retaining their normal use for external commands.
==========================
Наручники (привязки?)
Каждая из команд редактора, которые мы видели, фактически была функцией, привязанной по умолчанию к определенному ключу. Реальные имена команд:

Код: Выделить всё

expand-or-complete         TAB
push-line                  ESC-Q
run-help                   ESC-H
accept-and-hold            ESC-A
quote-line                 ESC-’
Эти привязки произвольны; вы можете изменить их, если хотите. Например, чтобы связать accept-line с Z:

Код: Выделить всё

% bindkey ’ˆZ’ accept-line
Другая идея заключалась бы в привязке ключа delete к delete-char; это может быть удобно, если вы используете H для backspace.

Код: Выделить всё

% bindkey ’ˆ?’ delete-char
Или вы можете связать XH с run-help:

Код: Выделить всё

% bindkey ’ˆXˆH’ run-help
Другие примеры:

Код: Выделить всё

%  bindkey     ’ˆXˆZ’ universal-argument
%  bindkey     ’ ’ magic-space
%  bindkey     -s ’ˆT’ ’uptime
>  ’
%  bindkey     ’ˆQ’ push-line-or-edit
универсальный аргумент умножает следующую команду на 4. Таким образом, XZW может удалить последние четыре слова в строке. Если вы связываете пространство с магическим пространством, то расширение истории в стиле csh выполняется на линии всякий раз, когда вы нажимаете пробел.
Часто случается то, что я набираю многострочную команду и обнаруживаю ошибку в одной из предыдущих строк. В этом случае push-line-or-edit помещает всю многострочную конструкцию в буфер редактора. Если есть только одна строка, это эквивалентно push-строке.
Флаг -s для bindkey указывает, что вы привязываете ключ к строке, а не к команде. Таким образом, bindkey -s 'T' 'uptime \ n' позволяет любителям VMS получать среднее значение нагрузки, когда вы нажимаете T.
Если у вас есть клавиатура NeXT, одна с | и \ ключи очень неудобно размещены, следующие привязки могут пригодиться:

Код: Выделить всё

% bindkey -s ’\e/’ ’\\’
% bindkey -s ’\e=’ ’|’
Теперь вы можете набрать ALT- /, чтобы получить обратную косую черту, и ALT- = получить вертикальную полосу. Конечно, это работает только внутри zsh; bindkey не влияет на сопоставления клавиш внутри разговора или почты и т. д.
Некоторым людям нравится связывать S и Q с командами редактора. Просто привязка к ним не имеет никакого эффекта, поскольку терминал будет их и использовать для управления потоком. Вы можете отключить их как остановить и запустить персонажей, но большинство людей предпочитают использовать они для внешних команд. Решение состоит в том, чтобы установить опцию NOFLOWCONTROL. Это позволит вам связать запускать и останавливать символы для команд редактора, сохраняя при этом их нормальное использование для внешних команд.
==========================

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1649
Зарегистрирован: 10 сен 2016, 10:16
Решено: 19
Откуда: Москва
Благодарил (а): 693 раза
Поблагодарили: 187 раз
Контактная информация:

zsh (перевод)

#15

19 авг 2018, 10:26

==========================
Parameter Substitution
In zsh, parameters are set like this:
...
Spaces before or after the = are frowned upon:
...
Also, set doesn’t work for setting parameters:
...
Note that no error message was printed. This is because both of these commands were perfectly valid; the set builtin assigns its arguments to the positional parameters ($1, $2, etc.).
...
If you’re really intent on using the csh syntax, define a function like this:
...
But then, of course you can’t use the form of set with options, like set -F (which turns off filename generation). Also, the set command by itself won’t list all the parameters like it should. To get around that you need a case statement:
...
For the most part, this should make csh users happy.
The following sh-style operators are supported in zsh:
...
Also, csh-style : modifiers may be appended to a parameter substitution.
...
The equivalent constructs in ksh (which are also supported in zsh) are a bit more general and easier to remember. When the shell expands ${foo#pat}, it checks to see if pat matches a substring at the beginning of the value of foo. If so, it removes that portion of foo, using the shortest possible match. With ${foo##pat}, the longest possible match is removed. ${foo%pat} and ${foo%%pat} remove the match from the end. Here are the ksh equivalents of the : modifiers:
...
zsh also has upper/lowercase modifiers:
...
and a substitution modifier:
...
There is yet another syntax to modify substituted parameters. You can add certain modifiers in parentheses after the opening brace like:
...
For example, o sorts the words resulting from the expansion:
...
One possible source of confusion is the fact that in zsh, the result of parameter substitution is not split into words. Thus, this will
not work:
...
This is considered a feature, not a bug. If splitting were done by default, as it is in most other shells, functions like this would not work properly:
...
Of course, a hackish workaround is available in sh (and zsh):
...
If you like the sh behaviour, zsh can accomodate you:
...
Another way to get the $srcs trick to work is to use an array:
...
or an alias:
...
Another option that modifies parameter expansion is RCEXPANDPARAM:
...

==========================
Замена параметра
В zsh параметры задаются следующим образом:

Код: Выделить всё

% foo=bar
% echo $foo
bar
Пробелы до или после = недопустимы:

Код: Выделить всё

% foo = bar
zsh: command not found: foo
Кроме того, установка не работает для настройки параметров:

Код: Выделить всё

% set foo=bar
% set foo = bar
% echo $foo

%
Обратите внимание, что сообщение об ошибке не было напечатано. Это связано с тем, что обе эти команды были абсолютно правильными; набор builtin присваивает свои аргументы позиционным параметрам ($ 1, $ 2 и т. д.).

Код: Выделить всё

% set foo=bar
% echo $1
foo=bar
% set foo = bar
% echo $3 $2
bar =
Если вы действительно намерены использовать синтаксис csh, определите такую ​​функцию:

Код: Выделить всё

% set () {
> eval "$1$2$3"
> }
% set foo = bar
% set fuu=brrr
% echo $foo $fuu
bar brrr
Но тогда, конечно, вы не можете использовать форму набора с параметрами, например set -F (которая отключает создание имени файла). Кроме того, команда set сама по себе не будет перечислять все параметры, как это должно быть. Чтобы обойти это, вам понадобится аргумент case:

Код: Выделить всё

% set () {
>      case $1 in
>      -*|+*|’’) builtin set $* ;;
>      *) eval "$1$2$3" ;;
>      esac
> }
По большей части это должно сделать пользователей csh счастливыми.
В zsh поддерживаются следующие операторы sh-style:

Код: Выделить всё

% unset null
% echo ${foo-xxx}
bar
% echo ${null-xxx}
xxx
% unset null
% echo ${null=xxx}
xxx
% echo $null
xxx
% echo ${foo=xxx}
bar
% echo $foo
bar
% unset null
% echo ${null+set}
% echo ${foo+set}
set
Кроме того, csh-style: модификаторы могут быть добавлены к подстановке параметров.

Код: Выделить всё

% echo $PWD
/home/learning/pf/zsh/zsh2.00/src
% echo $PWD:h
/home/learning/pf/zsh/zsh2.00
% echo $PWD:h:h
/home/learning/pf/zsh
% echo $PWD:t
src
% name=foo.c
% echo $name
foo.c
% echo $name:r
foo
% echo $name:e
c
Эквивалентные конструкции в ksh (которые также поддерживаются в zsh) немного более общие и более простые для запоминания. Когда оболочка расширяет $ {foo # pat}, она проверяет, соответствует ли pat подстроке в начале значения foo. Если это так, он удаляет ту часть foo, используя кратчайшее возможное совпадение. С $ {foo ## pat} удаляется максимально возможное совпадение. $ {foo% pat} и $ {foo %% pat} удаляют совпадение с конца. Ниже приведены эквиваленты ksh: модификаторов:

Код: Выделить всё

% echo ${PWD%/*}
/home/learning/pf/zsh/zsh2.00
% echo ${PWD%/*/*}
/home/learning/pf/zsh
% echo ${PWD##*/}
src
% echo ${name%.*}
foo
% echo ${name#*.}
c
zsh также имеет модификаторы верхнего / нижнего регистра:

Код: Выделить всё

% xx=Test
% echo $xx:u
TEST
% echo $xx:l
test
и модификатор замещения:

Код: Выделить всё

% echo $name:s/foo/bar/
bar.c
% ls
foo.c         foo.h         foo.o         foo.pro
% for i in foo.*; mv $i $i:s/foo/bar/
% ls
bar.c        bar.h        bar.o         bar.pro
Существует еще один синтаксис для изменения замещаемых параметров. Вы можете добавить определенные модификаторы в круглые скобки после открытия скобки, например:

Код: Выделить всё

${(modifiers)parameter}
Например, o сортирует слова, полученные в результате расширения:

Код: Выделить всё

% echo ${path}
/usr/bin /usr/bin/X11 /etc
% echo ${(o)path}
/etc /usr/bin /usr/bin/X11
Одним из возможных источников замешательства является тот факт, что в zsh результат замены параметров не разбивается на слова. Таким образом, это будет не работа:

Код: Выделить всё

% srcs=’glob.c exec.c init.c’
% ls $srcs
glob.c exec.c init.c not found
Это считается особенностью, а не ошибкой. Если расщепление было выполнено по умолчанию, как и в большинстве других оболочек, такие функции не будут работать должным образом:

Код: Выделить всё

$ ll () { ls -F $* }
$ ll ’fuu bar’
fuu not found
bar not found
% ll ’fuu bar’
fuu bar not found
Конечно, в sh (и zsh) доступно хакерское обходное решение:

Код: Выделить всё

% setopt shwordsplit
% ll () { ls -F "$@" }
% ll ’fuu bar’
fuu bar not found
Если вам нравится поведение sh, zsh может разместить вас:

Код: Выделить всё

% ls ${=srcs}
exec.c glob.c init.c
% setopt shwordsplit
% ls $srcs
exec.c glob.c init.c
Другой способ получить трюк $ srcs - использовать массив:

Код: Выделить всё

% unset srcs
% srcs=( glob.c exec.c init.c )
% ls $srcs
exec.c glob.c init.c
или псевдоним:

Код: Выделить всё

% alias -g SRCS=’exec.c glob.c init.c’
% ls SRCS
exec.c glob.c init.c
Другой вариант, который изменяет расширение параметра, - RCEXPANDPARAM:

Код: Выделить всё

% echo foo/$srcs
foo/glob.c exec.c init.c
% setopt rcexpandparam
% echo foo/$srcs
foo/glob.c foo/exec.c foo/init.c
% echo foo/${ˆsrcs}
foo/glob.c foo/exec.c foo/init.c
% echo foo/$ˆsrcs
foo/glob.c foo/exec.c foo/init.c

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1649
Зарегистрирован: 10 сен 2016, 10:16
Решено: 19
Откуда: Москва
Благодарил (а): 693 раза
Поблагодарили: 187 раз
Контактная информация:

zsh (перевод)

#16

19 авг 2018, 10:31

==========================
Shell Parameters
The shell has many predefined parameters that may be accessed. Here are some examples:
...
($? and $status are equivalent.)
...
̃+ and ̃- are short for $PWD and $OLDPWD, respectively.
...
The cdpath variable sets the search path for the cd command. If you do not specify . somewhere in the path, it is assumed to be the first component.
...
PATH and path both set the search path for commands. These two variables are equivalent, except that one is a string and one is
an array. If the user modifies PATH, the shell changes path as well, and vice versa.
...
The same is true of CDPATH and cdpath:
...
In general, predefined parameters with names in all lowercase are arrays; assignments to them take the form:
...
Predefined parameters with names in all uppercase are strings. If there is both an array and a string version of the same parameter, the string version is a colon-separated list, like PATH. You can use
...
to create more of these yourself.
...
HISTFILE is the name of the history file, where the history is saved when a shell exits.
...
If you have several instances of zsh running at the same time, like when using the X window system, it might be preferable to append the history of each shell to a file when a shell exits instead of overwriting the old contents of the file. You can get this behaviour by setting the APPENDHISTORY option.
In zsh, if you say
...
the command cat is normally assumed:
...
Thus, you can view a file simply by typing:
...
However, this is not csh or sh compatible. To correct this, change the value of the parameter NULLCMD, which is cat by default.
...
If NULLCMD is unset, the shell reports an error if no command is specified (like csh).
...
Actually, READNULLCMD is used whenever you have a null command reading input from a single file. Thus, you can set READNULLCMD to more or less rather than cat. Also, if you set NULLCMD to : for sh compatibility, you can still read files with < file if you leave READNULLCMD set to more.
==========================
Параметры оболочки
Оболочка имеет множество предопределенных параметров, к которым можно получить доступ. Вот некоторые примеры:

Код: Выделить всё

% sleep 10 &
[1] 3820
% echo $!
3820
% set a b c
% echo $#
3
% echo $ARGC
3
% ( exit 20 ) ; echo $?
20
% false; echo $status
1
($? и $ status эквивалентны.)

Код: Выделить всё

% echo $HOST $HOSTTYPE
dendrite sun4
% echo $UID $GID
701 60
% cd /tmp
% cd /home
% echo $PWD $OLDPWD
/home /tmp
% ls $OLDPWD/.getwd
/tmp/.getwd
 + И - сокращаются для $ PWD и $ OLDPWD соответственно.

Код: Выделить всё

% ls  ̃-/.getwd
/tmp/.getwd
% ls -d  ̃+/learning
/home/learning
% echo $RANDOM
4880
% echo $RANDOM
11785
% echo $RANDOM
2062
% echo $TTY
/dev/ttyp4
% echo $VERSION
zsh v2.00.03
% echo $USERNAME
pf
Переменная cdpath задает путь поиска для команды cd. Если вы не укажете. где-то на пути, он считается первым компонентом.

Код: Выделить всё

% cdpath=( /usr  ̃  ̃/zsh )
% ls /usr
...
% cd spool
/usr/spool
% cd bin
/usr/bin
% cd func
 ̃/func
% cd
% cd pub
% pwd
/u/pfalstad/pub
% ls -d /usr/pub
/usr/pub
PATH и path устанавливают путь поиска для команд. Эти две переменные эквивалентны, за исключением того, что один является строкой, а один - массив. Если пользователь изменяет PATH, оболочка также меняет путь, и наоборот.

Код: Выделить всё

% PATH=/bin:/usr/bin:/tmp:.
% echo $path
/bin /usr/bin /tmp .
% path=( /usr/bin . /usr/local/bin /usr/ucb )
% echo $PATH
/usr/bin:.:/usr/local/bin:/usr/ucb
То же самое относится к CDPATH и cdpath:

Код: Выделить всё

% echo $CDPATH
/usr:/u/pfalstad:/u/pfalstad/zsh
% CDPATH=/u/subbarao:/usr/src:/tmp
% echo $cdpath
/u/subbarao /usr/src /tmp
В общем, предопределенные параметры с именами во всех строчных строках являются массивами; присваивания им принимают форму:

Код: Выделить всё

name=( elem ... )
Предопределенные параметры с именами во всех прописных строках являются строками. Если есть и массив, и строковая версия того же параметра, строка-версия представляет собой список разделенных двоеточиями, например PATH. Вы можете использовать

Код: Выделить всё

% typeset -T FOO foo
чтобы создать их больше.

Код: Выделить всё

% foo=( a b c )
% echo $FOO
a:b:c
HISTFILE - это имя файла истории, в котором история сохраняется при выходе оболочки.

Код: Выделить всё

% zsh
phoenix% HISTFILE=/tmp/history
phoenix% SAVEHIST=20
phoenix% echo foo
foo
phoenix% date
Fri May 24 05:39:35 EDT 1991
phoenix% uptime
     5:39am up 4 days, 20:02, 40 users,
 load average: 2.30, 2.20, 2.00
phoenix% exit
% cat /tmp/history
HISTFILE=/tmp/history
SAVEHIST=20
echo foo
date
uptime
exit
% HISTSIZE=3
% history
     28 rm /tmp/history
     29 HISTSIZE=3
     30 history
Если у вас есть несколько экземпляров zsh, работающих одновременно, например, при использовании системы окон X, может быть предпочтительнее добавить историю каждой оболочки в файл, когда оболочка выйдет вместо перезаписывания старого содержимого файла. Вы можете получить это поведение, установив опцию APPENDHISTORY.
В zsh, если вы говорите обычно используется команда cat:

Код: Выделить всё

% >file
foo!
ˆD
% cat file
foo!
Таким образом, вы можете просмотреть файл, просто набрав:

Код: Выделить всё

% <file
foo!
Однако это не совместимо с csh или sh. Чтобы исправить это, измените значение параметра NULLCMD, который по умолчанию является cat.

Код: Выделить всё

% NULLCMD=:
% >file
% ls -l file
-rw-r--r-- 1 pfalstad
 0 May 24 05:41 file
Если NULLCMD отключен, оболочка сообщает об ошибке, если не указана команда (например, csh)

Код: Выделить всё

% unset NULLCMD
% >file
zsh: redirection with no command
На самом деле READNULLCMD используется всякий раз, когда у вас есть команда ввода нулевой команды из одного файла. Таким образом, вы можете установить READNULLCMD более или менее, чем cat. Кроме того, если вы установили NULLCMD в: для совместимости с sh, вы все равно можете читать файлы с <file, если вы оставите READNULLCMD установленным больше.
==========================
Последний совет - вредный! Зачем отключать NULLCMD? С ним гораздо удобнее!
==========================

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1649
Зарегистрирован: 10 сен 2016, 10:16
Решено: 19
Откуда: Москва
Благодарил (а): 693 раза
Поблагодарили: 187 раз
Контактная информация:

zsh (перевод)

#17

19 авг 2018, 10:34

==========================
Prompting
The default prompt for zsh is:
...
The %m stands for the short form of the current hostname, and the %# stands for a % or a #, depending on whether the shell is running as root or not. zsh supports many other control sequences in the PROMPT variable.
...
%h represents the number of current history event.
...
PROMPT2 is used in multiline commands, like for-loops. The %_ escape sequence was made especially for this prompt. It is replaced by the kind of command that is being entered.
...
Also available is the RPROMPT parameter. If this is set, the shell puts a prompt on the right side of the screen.
...
These special escape sequences can also be used with the -P option to print:
...
The POSTEDIT parameter is printed whenever the editor exits. This can be useful for termcap tricks. To highlight the prompt and command line while leaving command output unhighlighted, try this:
...
This trick is mostly superceded by the zle_highlight array parameter.
==========================
Prompting
По умолчанию для zsh:

Код: Выделить всё

phoenix% echo $PROMPT
%m%#
где %m обозначает короткую форму текущего имени хоста, а %# обозначает % или #, в зависимости от того, работает ли оболочка как root или нет. zsh поддерживает множество других управляющих последовательностей в переменной PROMPT.

Код: Выделить всё

% PROMPT=’%/> ’
/u/pfalstad/etc/TeX/zsh>

% PROMPT=’% ̃> ’
 ̃/etc/TeX/zsh>
 
% PROMPT=’%h % ̃> ’
6  ̃/etc/TeX/zsh>
где %h представляет собой число текущего события истории.

Код: Выделить всё

% PROMPT=’%h % ̃ %M> ’
10  ̃/etc/TeX/zsh apple-gunkies.gnu.ai.mit.edu>

% PROMPT=’%h % ̃ %m> ’
11  ̃/etc/TeX/zsh apple-gunkies>

% PROMPT=’%h %t> ’
12 6:11am>

% PROMPT=’%n %w tty%l>’
pfalstad Fri 24 ttyp0>
PROMPT2 используется в многострочных командах, например for-loops. Для этой подсказки была сделана escape-последовательность % _escape. Он заменяется типом команды, которая вводится.

Код: Выделить всё

% PROMPT2=’%_> ’
% for i in foo bar
for>

% echo ’hi
quote>
Также доступен параметр RPROMPT. Если это установлено, оболочка помещает приглашение в правую сторону экрана.

Код: Выделить всё

%
RPROMPT=’%t’
%                                                                           6:14am
% RPROMPT=’% ̃’
%                                                                      ̃/etc/TeX/zsh
% PROMPT=’%l %T %m[%h] ’ RPROMPT=’ % ̃’
p0 6:15 phoenix[5]                                                     ̃/etc/TeX/zsh
Эти специальные escape-последовательности также могут использоваться с параметром -P для печати:

Код: Выделить всё

% print -P %h tty%l
15 ttyp1
Параметр POSTEDIT печатается всякий раз, когда редактор выходит. Это может быть полезно для трюков termcap. Чтобы выделить подсказку и командную строку, не выходя из вывода команды, попробуйте следующее:

Код: Выделить всё

% POSTEDIT=‘echotc se‘
% PROMPT=’%S%% ’
Этот трюк в основном превосходит параметр массива zle_highlight.
==========================

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1649
Зарегистрирован: 10 сен 2016, 10:16
Решено: 19
Откуда: Москва
Благодарил (а): 693 раза
Поблагодарили: 187 раз
Контактная информация:

zsh (перевод)

#18

19 авг 2018, 10:36

==========================
Login/logout watching
You can specify login or logout events to monitor by setting the watch variable. Normally, this is done by specifying a list of usernames.
...
The log command reports all people logged in that you are watching for.
...
If you specify hostnames with an @ prepended, the shell will watch for all users logging in from the specified host.
...
If you give a tty name with a % prepended, the shell will watch for all users logging in on that tty.
...
The format of the reports may also be changed.
...
If you have a .friends file in your home directory, a convenient way to make zsh watch for all your friends is to do this:
...
If watch is set to all, then all users logging in or out will be reported.
==========================
Вход в систему / выход из системы
Вы можете указать события входа или выхода из системы для мониторинга, установив переменную просмотра. Обычно это делается путем указания списка имен пользователей.

Код: Выделить всё

% watch=( pfalstad subbarao sukthnkr egsirer )
Команда журнала сообщает всем зарегистрированным пользователям, за которыми вы смотрите.

Код: Выделить всё

% log
pfalstad
 has logged on p0 from mickey.
pfalstad
 has logged on p5 from mickey.
% ...
subbarao
 has logged on p8 from phoenix.
% ...
subbarao
 has logged off p8 from phoenix.
% ...
sukthnkr
 has logged on p8 from dew.
% ...
sukthnkr
 has logged off p8 from dew.
Если вы укажете имена хостов с добавлением @, оболочка будет следить за тем, чтобы все пользователи вошли в систему с указанного узла.

Код: Выделить всё

% watch=( @mickey @phoenix )
% log
djthongs has logged on q2 from phoenix.
pfalstad has logged on p0 from mickey.
pfalstad has logged on p5 from mickey.
Если вы укажете имя tty с% preended, оболочка будет следить за тем, чтобы все пользователи вошли в эту tty.

Код: Выделить всё

% watch=( %ttyp0 %console )
% log
root has logged on console from .
pfalstad has logged on p0 from mickey.
Формат отчетов также может быть изменен.

Код: Выделить всё

% watch=( pfalstad gettes eps djthongs jcorr bdavis )
% log
jcorr has logged on tf from 128.112.176.3:0.
jcorr has logged on r0 from 128.112.176.3:0.
gettes has logged on p4 from yo:0.0.
djthongs has logged on pe from grumpy:0.0.
djthongs has logged on q2 from phoenix.
bdavis has logged on qd from BRUNO.
eps has logged on p3 from csx30:0.0.
pfalstad has logged on p0 from mickey.
pfalstad has logged on p5 from mickey.
% WATCHFMT=’%n on tty%l from %M’
% log
jcorr on ttytf from 128.112.176.3:0.
jcorr on ttyr0 from 128.112.176.3:0.
gettes on ttyp4 from yo:0.0
djthongs on ttype from grumpy:0.0
djthongs on ttyq2 from phoenix.Princeto
bdavis on ttyqd from BRUNO.pppl.gov
eps on ttyp3 from csx30:0.0
pfalstad on ttyp0 from mickey.Princeton
pfalstad on ttyp5 from mickey.Princeton
% WATCHFMT=’%n fm %m’
% log
jcorr fm 128.112.176.3:0
jcorr fm 128.112.176.3:0
gettes fm yo:0.0
djthongs fm grumpy:0.0
djthongs fm phoenix
bdavis fm BRUNO
eps fm csx30:0.0
pfalstad fm mickey
pfalstad fm mickey
% WATCHFMT=’%n %a at %t %w.’
% log
jcorr logged on at 3:15pm Mon 20.
jcorr logged on at 3:16pm Wed 22.
gettes logged on at 6:54pm Wed 22.
djthongs logged on at 7:19am Thu 23.
djthongs logged on at 7:20am Thu 23.
bdavis logged on at 12:40pm Thu 23.
eps logged on at 4:19pm Thu 23.
pfalstad logged on at 3:39am Fri 24.
pfalstad logged on at 3:42am Fri 24.
Если у вас есть файл .friends в вашем домашнем каталоге, удобный способ сделать zsh-часы для всех ваших друзей:

Код: Выделить всё

% watch=( $(<  ̃/.friends) )
% echo $watch
subbarao maruchck root sukthnkr ...
Если для часов установлено значение «Все», будет сообщено о всех входах пользователя или выходе из системы.

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1649
Зарегистрирован: 10 сен 2016, 10:16
Решено: 19
Откуда: Москва
Благодарил (а): 693 раза
Поблагодарили: 187 раз
Контактная информация:

zsh (перевод)

#19

19 авг 2018, 10:40

==========================
Options
Some options have already been mentioned; here are a few more:
Using the AUTOCD option, you can simply type the name of a directory, and it will become the current directory.
...
With CDABLEVARS, if the argument to cd is the name of a parameter whose value is a valid directory, it will become the current directory.
...
CORRECT turns on spelling correction for commands, and the CORRECTALL option turns on spelling correction for all arguments.
...
If you press y when the shell asks you if you want to correct a word, it will be corrected. If you press n, it will be left alone.
Pressing a aborts the command, and pressing e brings the line up for editing again, in case you agree the word is spelled wrong but you don’t like the correction.
Normally, a quoted expression may contain a newline:
...
With CSHJUNKIEQUOTES set, this is illegal, as it is in csh.
...
GLOBDOTS lets files beginning with a . be matched without explicitly specifying the dot. This can also be specified for a particular pattern by appending (D) to it.
...
HISTIGNOREDUPS prevents the current line from being saved in the history if it is the same as the previous one;
...
HISTIGNORESPACE prevents the current line from being saved if it begins with a space.
...
IGNOREBRACES turns off csh-style brace expansion.
...
IGNOREEOF forces the user to type exit or logout, instead of just pressing ˆD.
...
INTERACTIVECOMMENTS turns on interactive comments; comments begin with a #.
...
NOBEEP makes sure the shell never beeps.
NOCLOBBER prevents you from accidentally overwriting an existing file.
...
If you really do want to clobber a file, you can use the >! operator. To make things easier in this case, the > is stored in the history list as a >!:
...
RCQUOTES lets you use a more elegant method for including single quotes in a singly quoted string:
...
Finally, SUNKEYBOARDHACK wins the award for the strangest option. If a line ends with ‘, and there are an odd number of them on the line, the shell will ignore the trailing ‘. This is provided for keyboards whose RETURN key is too small, and too close to the ‘ key.
...
Closing Comments
I (Bas de Bakker) would be happy to receive mail if anyone has any tricks or ideas to add to this document, or if there are some points that could be made clearer or covered more thoroughly. Please notify me of any errors in this document.
==========================
Опции
Некоторые варианты уже упомянуты; вот еще несколько:
Используя опцию AUTOCD, вы можете просто ввести имя каталога и стать текущим каталогом.

Код: Выделить всё

% cd /
% setopt autocd
% bin
% pwd
/bin
% ../etc
% pwd
/etc
С CDABLEVARS, если аргумент cd является именем параметра, значение которого является допустимым каталогом, оно станет текущим каталогом.

Код: Выделить всё

% setopt cdablevars
% foo=/tmp
% cd foo
/tmp
CORRECT включает орфографическую коррекцию для команд, а опция CORRECTALL включает орфографическую коррекцию для всех аргументов.

Код: Выделить всё

% setopt correct
% sl
zsh: correct ‘sl’ to ‘ls’ [nyae]? y
% setopt correctall
% ls x.v11r4
zsh: correct ‘x.v11r4’ to ‘X.V11R4’ [nyae]? n
/usr/princton/src/x.v11r4 not found
% ls /etc/paswd
zsh: correct to ‘/etc/paswd’ to ‘/etc/passwd’ [nyae]? y
/etc/passwd
Если вы нажмете y, когда оболочка спросит вас, хотите ли вы исправить слово, оно будет исправлено. Если вы нажмете n, он останется в покое.
Нажатие кнопки 'a' отменяет команду, и нажатие 'e' снова выводит строку для редактирования, если вы согласитесь, что слово написано неправильно, но вам не нравится исправление.
Обычно цитируемое выражение может содержать новую строку:

Код: Выделить всё

% echo ’
> foo
> ’
foo
%
С установленным CSHJUNKIEQUOTES это незаконно, как и в csh.

Код: Выделить всё

% setopt cshjunkiequotes
% ls ’foo
zsh: unmatched ’
GLOBDOTS разрешает файлы, начинающиеся с символа. быть согласованы без явного указания точки. Это также можно указать для определенного шаблона, добавив к нему (D).

Код: Выделить всё

% ls -d *x*
Mailboxes
% ls -d *x*(D)
.exrc             .pnewsexpert      .xserverrc
.mushexpert       .xinitrc           Mailboxes
% setopt globdots
% ls -d *x*
.exrc           .pnewsexpert     .xserverrc
.mushexpert     .xinitrc         Mailboxes
HISTIGNOREDUPS предотвращает сохранение текущей строки в истории, если она аналогична предыдущей;
HISTIGNORESPACE предотвращает сохранение текущей строки, если она начинается с пробела.

Код: Выделить всё

% PROMPT=’%h> ’
39> setopt histignoredups
40> echo foo
foo
41> echo foo
foo
41> echo foo
foo
41> echo bar
bar
42> setopt histignorespace
43> echo foo
foo
43> echo fubar
fubar
43> echo fubar
fubar
IGNOREBRACES отключает расширение скобки в стиле csh.

Код: Выделить всё

% echo x{y{z,a},{b,c}d}e
xyze xyae xbde xcde
% setopt ignorebraces
% echo x{y{z,a},{b,c}d}e
x{y{z,a},{b,c}d}e
IGNOREEOF заставляет пользователя вводить exit или logout, а не просто нажимать D.

Код: Выделить всё

% setopt ignoreeof
% ˆD
zsh: use ’exit’ to exit.
INTERACTIVECOMMENTS включает интерактивные комментарии; комментарии начинаются с символа #.

Код: Выделить всё

% setopt interactivecomments
% date # this is a comment
Fri May 24 06:54:14 EDT 1991
NOBEEP гарантирует, что оболочка никогда не подаст звуковой сигнал.
NOCLOBBER предотвращает случайную перезапись существующего файла.

Код: Выделить всё

% setopt noclobber
% cat /dev/null > ̃/.zshrc
zsh: file exists: /u/pfalstad/.zshrc
Если вы действительно хотите сжать файл, вы можете использовать>! оператор. Чтобы упростить ситуацию в этом случае,> хранится в списке истории в виде> !:

Код: Выделить всё

% cat /dev/null >!  ̃/.zshrc
% cat /etc/motd >  ̃/.zshrc
zsh: file exists: /u/pfalstad/.zshrc
% !!
cat /etc/motd >!  ̃/.zshrc
% ...
RCQUOTES позволяет использовать более элегантный метод для включения одинарных кавычек в строку с одиночным кавычками:

Код: Выделить всё

% echo ’"don’\’’t do that."’
"don’t do that."
% echo ’"don’’t do that."’
"dont do that."
% setopt rcquotes
% echo ’"don’’t do that."’
"don’t do that."
Наконец, SUNKEYBOARDHACK получает награду за самый странный вариант. Если строка заканчивается на ', и на ней есть нечетное число, оболочка будет игнорировать конечный'. Это предусмотрено для клавиатур, чей ключ RETURN слишком мал и слишком близко к клавише.

Код: Выделить всё

% setopt sunkeyboardhack
% date‘
Fri May 24 06:55:38 EDT 1991
Закрывающий комментарий
Я (Bas de Bakker) был бы рад получить почту, если у кого есть какие-либо трюки или идеи, которые нужно добавить в этот документ, или если есть некоторые моменты, которые можно было бы сделать более ясными или охватить более тщательно. Пожалуйста, сообщите мне об ошибках в этом документе.
==========================

Аватара пользователя

Автор темы
StarMAUGLI
Сообщения: 1649
Зарегистрирован: 10 сен 2016, 10:16
Решено: 19
Откуда: Москва
Благодарил (а): 693 раза
Поблагодарили: 187 раз
Контактная информация:

zsh (перевод)

#20

19 авг 2018, 10:41

Упоминания об опциях setopt в файле intro.a4.pdf (замеченные дубликаты экранированы #):

setopt extendedglob ## эта опция включает расширенный глоббинг
setopt numericglobsort ## дополнительные возможности сортировки, группировки, рекурсивного поиска, исключения имен из шаблонов, добавление квалификаторов и мн. др. ## Включается как расширение опции extendedglob
# setopt pushdtohome ## "что-то вроде истории каталогов" см. 5 Directory Stacks
setopt autopushd pushdminus pushdsilent pushdtohome ## см. 5 Directory Stacks
# unsetopt pushdminus ## см. 5 Directory Stacks
# unsetopt pushdsilent ## см. 5 Directory Stacks
# unsetopt pushdtohome ## см. 5 Directory Stacks
# setopt pushdsilent ## см. 5 Directory Stacks
setopt noequals ## см. 6 Command/Process Substitution "отключение полного имени пути при замене команды/процесса"
setopt nobanghist ## см. 9 History ## отключение банга (восклицательного знака "!") может привести к случайному выполнению просматриваемой в истории команды
HISTVERIFY ## см. 9 History "Если этот параметр установлен, команды, которые являются результатом расширения истории, не будут выполняться немедленно, но будут возвращены в буфер редактора для дальнейшего рассмотрения."
setopt cshjunkiehistory ## см. 9 History включение опции выполнение последней команды в стиле csh
NOLISTBEEP ## см. 11 Completion ## "Если завершение неоднозначно, редактор будет подавать звуковой сигнал. Если вы найдете это раздражающим, вы можете установить опцию NOLISTBEEP."
setopt autolist ## см. 11 Completion ## Завершение по TAB посередине слова
setopt nocorrect_ ## см. 11 Completion
setopt completeinword ## см. 11 Completion ## Завершение по TAB посередине слова (дублирует autolist или имеет свои особенности?)
LISTTYPES ## см. 11 Completion ## Просмотр типов файлов. Дополняет опцию autolist
setopt alwaystoend ## см. 11 Completion ## Ограничение прокрутки экрана с листом завершения под ним и возможностью продолжения редактирования своей команды в строке
# setopt autolist ## см. 11 Completion ## Завершение по TAB посередине слова
setopt listambiguous ## см. 11 Completion ##
setopt menucomplete ## см. 11 Completion ## компромисное решение автозавершения по клавише TAB, позволяет завершить однозначную часть в обычном режиме. Расширяет возможности automenu (?)
setopt recexact ## см. 11 Completion ## аналог menucomplete (по видимому работает без привязки к automenu)
setopt noclobber ## см.
# setopt unsetopt ##
setopt shwordsplit ##
# setopt shwordsplit
setopt rcexpandparam ##
setopt autocd ## включение автодополнения в командной строке
setopt cdablevars ##
setopt correct ##
setopt correctall ##
setopt cshjunkiequotes ##
setopt globdots ##
setopt histignoredups ##
setopt histignorespace ##
setopt ignorebraces ##
setopt ignoreeof ##
setopt interactivecomments ##
setopt noclobber ##
setopt rcquotes ##
setopt sunkeyboardhack ##
Последний раз редактировалось пользователем 7 StarMAUGLI; всего редактировалось раз: 19

Закрыто

Вернуться в «Системные утилиты»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей