Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Интернет: маркетинг, реклама, торговля" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Страницы справочного руководства ОС UNIX на русском : man ksh(1), часть пятая
Информационный Канал Subscribe.Ru |
Выпуск 146
man ksh(1), часть пятая
Уважаемые подписчики!
Это пятый выпуск из серии, посвященной командному интерпретатору ksh.
Перевод, по сложившейся традиции, сделан по справочному руководству ОС Solaris 8.
Поскольку по правилам оформления рассылок в них не должно быть "висящих" гиперссылок href, не все перекрестные ссылки в выпусках, посвященных ksh, оформлены как гиперссылки. Когда перевод будет закончен, вы сможете скачать с сайта рассылки всю страницу в целом, со всеми необходимыми перекрестными и внешними ссылками.
Функции
Зарезервированное слово function, описанное в разделе "Команды" выше, используется для определения функций командного интерпретатора. Функции командного интерпретатора читаются и запоминаются внутренне. Псевдонимы разрешаются при чтении функции. Функции выполняются как команды с аргументами, передаваемыми как позиционные параметры. (См. раздел "Выполнение" ниже.)
Функции выполняются в том же процессе, что и вызывающий командный интерпретатор, и разделяют с ним все файлы и текущий рабочий каталог. Установленные вызывающим процессом обработчики сигналов сбрасываются в стандартные действия внутри функции.
Сигнал, не перехваченный и не проигнорированный функцией, вызывает прекращение ее работы и передачу сигнала вызывающему командному интерпретатору. Обработчик EXIT, установленный внутри функции, выполняется после завершения функции в вызывающей среде. Обычно, переменные совместно используются вызывающей программой и функцией. Однако, специальная команда typeset внутри функции определяет локальные переменные, область действия которых включает текущую функцию и все функции, которые она вызывает.
Специальная команда return используется для возврата из вызовов функции. Ошибки в функциях приводят к возврату управления вызывающему.
Имена всех функций можно получить с помощью команды typeset +f. Команда typeset -f выдает все имена функций вместе с их текстами. Команда typeset -f имена_функций выдает текст только указанных функций. Определения функций можно удалять (undefine) с помощью опции -f специальной команды unset.
Обычно определения функций недоступны при выполнении сценария командным интерпретатором. Опция -xf команды typeset позволяет экспортировать функцию сценариям, выполняемым без отдельного вызова командного интерпретатора. Функции, которые должны быть определены в нескольких отдельных вызовах командного интерпретатора, надо задать в файле ENV с помощью опции -xf команды typeset.
Команда определения функции
Функция - определенное пользователем имя, которое используется как простая команда для вызова составной команды с новыми позиционными параметрами. Функция определяется с помощью команды определения функции.
Формат команды определения функции следующий:
fname() составная_команда[перенаправление_ввода-вывода ...]
Функция получает имя fname; это должно быть допустимое имя. Реализация в качестве расширения может допускать в имени функции и другие символы. Для функций и переменных реализация будет поддеживать различные пространства имен.
Скобки () в команде определения функции состоят из двух операторов. Поэтому пробельные символы между fname, ( и ) допускаются, но необязательны.
Аргумент составная_команда представляет собой составную команду.
При объявлении функции ни одна из подстановок в тексте составной команды или перенаправления ввода-вывода не выполняется; все подстановки будут выполняться как обычно при каждом вызове функции. Аналогично, необязательные перенаправления потоков ввода-вывода и присвоения переменным в составной команде будут выполняться в ходе выполнения самой функции, а не обработки ее определения.
При выполнении функции особенности обработки синтаксических ошибок и присвоений переменным будут такими же, как описано для специальных встроенных утилит.
Составная команда будет выполняться при указании имени функции как имени простой команды. Операнды команды становятся позиционными параметрами на время выполнения составной команды; специальный параметр # также будет изменен в соответствии с количеством операндов. Специальный параметр 0 меняться не будет. Когда функция завершает работу, значения позиционных параметров и специального параметра # будут восстановлены такими, как они были до выполнения функции. Если в составной команде выполняется специальная встроенная команда return, функция завершается и выполнение продолжается со следующей команды после вызова функции.
Пример того, как можно использовать определение функции в любом месте, где допускается простая команда:
# Если переменная i имеет значение "yes", # определить функцию foo как ls -l # [ "$i" = yes ] && foo() { ls -l }
Статус выхода определения функции будет 0, если функция была объявлена успешно; иначе он будет больше нуля. Статус выхода вызова функции будет равен статусу выхода последней команды, выполненной функцией.
Задания
Если опция monitor команды set включена, интерактивный командный интерпретатор ассоциирует задание с каждым конвейером. Он поддерживает таблицу текущих заданий, которую выдает команда jobs и присваивает им небольшие целые числа. Когда задание запускается асинхронно с помощью &, командный интерпретатор печатает строку, которая имеет вид:
[1] 1234
и показывает, что задание, запущенное асинхронно, получило номер задания 1 и имело один (верхнего уровня) процесс с идентификатором 1234.
Если вы выполняете задание и хотите сделать что-то еще, можно нажать комбинацию клавиш ^Z (CTRL-Z), которая посылает сигнал STOP текущему заданию. Командный интерпретатор затем обычно выдает строку о том, что задание было остановлено ('Stopped'), и выдает другое приглашение. Затем вы можете управлять состоянием этого задания, переводя его в фоновый режим командой bg, или выполнить ряд других команд, а затем при необходимости снова вернуть команду в приоритетный режим с помощью команды fg. Комбинация клавиш ^Z срабатывает немедленно и похожа на прерывание в том отношении, что не выданные результаты и непрочитанные входные данные отвергаются, когда она вводится.
Задание, работающее в фоновом режиме, остановится при попытке прочитать с терминала. Фоновым заданиям обычно разрешается выдавать результаты, но это можно отменить, выполнив команду "stty tostop". Если установить эту опцию tty, то фоновые задания будут останавливаться при попытке выдать результат на терминал так же, как и при попытке чтения с терминала.
Есть несколько способов указать задания в командном интерпретаторе. Задание можно указать по идентификатору любого процесса, составляющего задание, или с помощью одной из следующих конструкций:
- %номер
-
Задание с указанным номером.
- %строка
-
Любое задание, командная строка которого начинается с указанной строки.
- %?строка
-
Любое задание, командная строка которого содержит указанную строку.
- %%
-
Текущее задание.
- %+
-
Эквивалент %%.
- %-
- Предыдущее задание.
Командный интерпретатор немедленно узнает об изменении состояния процесса. Обычно он информирует пользователя, когда задание заблокировано так, что не может дальше продолжать работу, но только непосредственно перед выдачей очередного приглашения. Это сделано для того, чтобы не мешать вашей работе в остальных случаях.
Когда включен режим monitor, каждое фоновое задание по завершении работы вызывает срабатывание обработчика сигнала CHLD.
При попытке выйти из командного интерпретатора при наличии работающих или остановленных заданий, вы получите предупреждение 'You have stopped(running) jobs'. Можно использовать команду jobs чтобы узнать, какие занятия остались. Если вы сделаете это или немедленно попытаетесь выйти снова, командный интерпретатор не предупредит вас второй раз и остановленные задания будут прекращены. При наличии непрерываемых заданий, запущенных с помощью nohup, при попытке выхода вы получите предупреждение:
You have jobs running.
Для фактического завершения сеанса надо будет повторить выход еще раз; но ваши фоновые задания продолжат работать.
Сигналы
Сигналы INT и QUIT для вызванной команды игнорируются, если после команды идет & и не действует опция monitor. В противном случае, срабатывают обработчики сигналов, унаследованные командным интерпретатором от родительского процесса (но см. также описание специальной команды trap ниже).
Выполнение
При каждом выполнении команды выполняются описанные выше подстановки. Если имя команды совпадает с одной из перечисленных ниже специальных команд, она выполняется в текущем процессе командного интерпретатора. Затем имя команды проверяется на совпадение с одной из определенных пользователем функций. При совпадении позиционные параметры сохраняются, а затем устанавливаются равными аргументам вызова функции. При завершении выполнения функции или выполнении команды return список позиционных параметров восстанавливается и выполняется любой обработчик сигнала EXIT, заданный в функции. Значением функции будет значение последней выполненной команды. Функция также выполняется в текущем процессе командного интерпретатора. Если имя команды не совпадает с именем специальной команды или именем определенной пользователем функции, создается процесс, а затем делается попытка выполнить команду с помощью exec(2).
Переменная командного интерпретатора PATH задает последовательность просмотра каталогов в поисках команды. Имена каталогов разделяются двоеточием (:). Стандартная последовательность - /bin:/usr/bin: (задающая каталоги /bin, /usr/bin и текущий каталог именно в таком порядке). Текущий каталог можно указать двумя или более подряд идущими двоеточиями или двоеточием в начале или в конце списка каталогов. Если имя команды содержит /, последовательность просмотра не используется. Иначе в каждом из указанных каталогов ищется выполняемый файл. Если для файла установлено право доступа а выполнение, но он не является каталогом или двоичным выполняемым файлом (a.out), предполагается, что этот файл содержит команды интерпретатора. Для его чтения запускается порожденный командный интерпретатор (sub-shell). Все неэкспортированные псевдонимы, функции и переменные в этом случае удаляются. Команда в круглых скобках выполняется в порожденном командном интерпретаторе без удаления неэкспортированных сущностей.
Повторный ввод команд
Текст последних HISTSIZE (по умолчанию - 128) команд, введенных с терминального устройства, сохраняется в файле истории. Если не установлена переменная HISTFILE или указанный ею файл недоступен на запись, используется файл $HOME/.sh_history. Командный интерпретатор может использовать команды всех интерактивных командных интерпретаторов, использующих тот же HISTFILE. Специальная команда fc используется для просмотра или редактирования части этого файла. Часть файла для просмотра или редактирования задается номером или начальными символами команды. Можно указать одну команду или диапазон команд. Если в качестве аргумента fc не указана программа-редактор, используется значение FCEDIT. Если переменная FCEDIT не определена, используется /bin/ed. Редактируемые команды выдаются при выходе из редактора. Имя редактора - используется для пропуска фазы редактирования и повторного выполнения команды. В этом случае, можно использовать подстановку параметров вида старое=новое для изменения команды перед выполнением. Например, если задать псевдоним r для 'fc -e -', то ввод 'r bad=good c' выполнит повторно самую последнюю команду, которая начинается символом c, с заменой первого вхождения bad строкой good.
Опции редактирования вводимой строки
Обычно, каждая командная строка просто вводится с терминального устройства и завершается символами новой строки (RETURN или LINEFEED). Если включена одна из опций emacs, gmacs или vi, пользователь может редактировать командную строку. Чтобы оказаться в одном из этих режимов редактирования, установите соответствующую опцию. Опция редактирования автоматически выбирается при каждом присвоении переменной VISUAL или EDITOR значения, заканчивающегося на одну из этих имен опций.
Для использования возможностей редактирования требуется, чтобы пользовательский терминал принимал RETURN как возврат каретки без перевода строки, и чтобы пробел переписывал текущий символ на экране.
Режимы редактирования реализуют концепцию, по которой пользователь смотрит через окно на текущую строку. Ширина окна - значение переменной COLUMNS, если она определена, и 80 в противном случае. Если ширина окна слишком мала для показа приглашения с учетом как минимум 8 символов для ввода, приглашение усекается слева. Если строка - длиннее чем ширина окна минус два, в конце окна показывается отметка, чтобы уведомить пользователя. По мере перемещения курсора и достижения границ окна, окно будет центрироваться относительно курсора. Отметкой будет >, если строка продолжается справа окна, < - если слева, и * - если строка продолжается с обеих сторон окна.
Команды поиска в каждом из режимов редактирования обеспечивают доступ к файлу истории. Сопоставление производится буквально, не с шаблонами, хотя начальный символ ^ в строке ограничивает сопоставление, требуя начинать его с первого символа в строке.
Режим редактирования emacs
Для входа в этот режим надо включить опцию emacs или gmacs. Единственное отличие между этими двумя режимами состоит в обработке комбинации клавиш ^T. Для редактирования, переместите курсор в позицию, где надо сделать исправление, а затем вставьте или удалите соответствующие символы или слова. Все команды редактирования - управляющие символы или последовательности. Для указания управляющих символов используется ^, за которым идет символ. Например, ^F означает Ctrl+F. Чтобы ввести этот управляющий символ, нажмите клавишу 'f', удерживая нажатой клавишу Ctrl. Клавиша Shift не нажимается. (Запись ^? обозначает клавишу Del (Delete).)
Управляющие последовательности записываются как M-, за которыми идет символ. Например, последовательность M-f (произносится "Meta f") вводится путем нажатия клавиши ESC (ascii-код 033), а затем - 'f'. (M-F означает нажатие ESC, а затем SHIFT (для получения верхнего регистра) и 'F'.)
Все команды редактирования работают в любом месте строки (а не только в начале). Ни RETURN, ни LINEFEED после команд редактирования вводить не надо, если об этом не сказано явно.
- ^F
-
Переместить курсор вперед (вправо) на один символ.
- M-f
-
Переместить курсор вперед на одно слово. (Редактор emacs считает словом
строку, состоящую только из букв, цифр и символов подчеркивания.)
- ^B
-
Переместить курсор назад (влево) на один символ.
- M-b
-
Переместить курсор назад на одно слово.
- ^A
-
Переместить курсор на начало строки.
- ^E
-
Переместить курсор на конец строки.
- ^]char
-
Переместить курсор вперед на символ char в текущей строке.
- M-^]char
-
Переместить курсор назад на символ char в текущей строке.
- ^X^X
-
Поменять местами курсор и отметку.
- erase
-
(Определенный пользователем с помощью команды stty(1) символ erase,
обычно - ^H или #.) Удалить предыдущий символ.
- ^D
-
Удалить текущий символ.
- M-d
-
Удалить текущее слово.
- M-^H
-
(Meta-backspace) Удалить предыдущее слово.
- M-h
-
Удалить предыдущее слово.
- M-^?
-
(Meta-DEL) Удалить предыдущее слово (если ваш символ прерывания - ^?
(DEL, как принято по умолчанию), то эта команда не сработает).
- ^T
-
Поменять местами текущий символ со следующим в режиме emacs. Поменять
местами два предыдущий символа в режиме gmacs.
- ^C
-
Перевести текущий символ в верхний регистр.
- M-c
-
Перевести текущее слово в верхний регистр.
- M-l
-
Перевести текущее слово в нижний регистр.
- ^K
-
Удалить от курсора до конца строки. Если перед этим указан числовой параметр,
значение которого меньше, чем текущая позиция курсора, то удалить от указанной
позиции до курсора. Если перед этим указан числовой параметр, значение которого
больше, чем текущая позиция курсора, удалить от курсора до указанной позиции.
- ^W
-
Удалить от курсора до отметки.
- M-p
-
Поместить область от курсора до отметки в стек.
- kill
-
(Определенный пользователем с помощью команды stty(1) символ kill,
обычно - ^G или @.) Полностью удалить текущую строку. Если введены
два подряд символа kill, все последующие символы kill вызывают
перевод строки (полезно при использовании телетайпов - paper terminals).
- ^Y
-
Восстановить последний элемент, удаленный из строки. (Вернуть (yank back) обратно в строку.)
- ^L
-
Перевести строку и напечатать текущую строку.
- ^@
-
(пустой символ) Установить отметку.
- M-пробел
-
(Meta-пробел) Установить отметку.
- J(Новая строка)
-
Выполнить текущую строку.
- M(Return)
-
Выполнить текущую строку.
- eof
-
Символ конца файла, обычно - ^D, обрабатывается как конец файла только
если текущая строка пуста.
- ^P
-
Извлечь предыдущую команду. При каждом нажатии ^P происходит доступ к
предыдущей по времени команде. Возвращает обратно на одну строку при нажатии на
не первой строке многострочной команды.
- M-<
-
Извлечь самую давнюю (старую) строку истории.
- M->
-
Извлечь самую недавнюю (новую) строку истории.
- ^N
-
Извлечь следующую командную строку. При каждом нажатии ^N происходит
обращение к следующей по времени командной строке.
- ^Rстрока
-
Обратный поиск по истории в поисках предыдущей команды, содержащей строку.
Если указан параметр 0, выполняется прямой поиск. Строка завершается
символами RETURN или NEW LINE. Если строка начинается с ^,
соответствующая команда должна начинаться со строки. Если строка
не указана, то происходит доступ к следующей командной строке, содержащей последнюю
искомую строку. В этом случае параметр 0 обращает направление поиска.
- ^O
-
Обработать. Выполнить текущую строку и выбрать следующую из файла истории.
- M-цифры
-
(Escape) Определить цифровые параметры - цифры используются как параметры
для следующей команды. Параметры принимают команды ^F, ^B, erase,
^C, ^D, ^K, ^R, ^P, ^N, ^],
M-., M-^], M-_, M-b, M-c, M-d,
M-f, M-h, M-l и M-^H.
- M-буква
-
Функциональная клавиша. Ваш список псевдонимов просматривается в поисках псевдонима
_буква и, если соответствующий псевдоним определен, его значение будет
вставлено во входную очередь. Буква не должна совпадать с одной из
перечисленных выше метафункций.
- M-[буква
-
Функциональная клавиша. Ваш список псевдонимов просматривается в поисках псевдонима
__буква и, если соответствующий псевдоним определен, его значение будет
вставлено во входную очередь. Может использоваться для программирования функциональных
клавиш на многих терминалах.
- M-.
-
Последнее слово предыдущей команды вставляется в строку. Если перед командой указан
числовой параметр, значение этого параметра определяет, какое слово вставить вместо
последнего.
- M-_
-
То же, что и M-..
- M-*
-
Звездочка добавляется в конце слова и выполняется попытка подстановки имен файлов.
- M-ESC
-
Завершение имени файла. Заменить текущее слово самым длинным общим префиксом всех
имен файлов, соответствующих текущему слову с добавлением звездочки. Если находится
единственный соответствующий файл, добавляется /, если файл является каталогом,
и пробел, если он каталогом не является.
- M-=
-
Выдать файлы, соответствующие текущему слову как шаблону при условии добавления
в конце звездочки.
- ^U
-
Умножить параметр следующей команды на 4.
- \
-
Замаскировать следующий символ. Символы редактирования, заданные пользователем
символы erase, kill и interrupt (обычно - ^?) можно
вводить в командной строке или в строке поиска, если предварить их символом
\. \ отменяет свойства редатирования следующего символа, если они
ему присущи.
- ^V
-
Выдать версию командного интерпретатора.
- M-#
- Вставить # в начале строки и выполнить ее. Это приводит к вставке комментария в файл истории.
Copyleft (no c) 2005 В. Кравчук, OpenXS Initiative, перевод на русский язык
В следующем выпуске
Следующая часть перевода страницы справочного руководства ksh(1).
С наилучшими пожеланиями,
В.К.
http://subscribe.ru/
http://subscribe.ru/feedback/ |
Подписан адрес: Код этой рассылки: comp.soft.othos.unixman |
Отписаться |
В избранное | ||