Оболочка Korn


Основные свойства оболочки
Псевдонимы
Опции оболочки
История команд
Редактирование команд
Переменные
Программирование оболочки
Настройка оболочки Коrn


В главе 8 были описаны основные свойства оболочек UNIX, а в главе 9 - подробно освещена оболочка Bourne. В этой главе тема оболочек находит дальнейшее развитие: мы представляем оболочку Коrn - второй из трех доступных языков оболочек. Третий из основных языков оболочек освещается в главе 12.

Оболочка Коrn названа по имени ее автора Дэвида Г. Корна (David G. Коrn), работающего в AT&T's Bell Laboratories. Он написал первую версию программы в 1986 г. Таким образом, оболочка Коrn является прямой наследницей оболочки Bourne. Она почти полностью совместима с оболочкой Bourne; практически любой сценарий оболочки, написанный для оболочки Bourne, может быть корректно выполнен оболочкой Коrn. Однако сценарии оболочки Коrn, как правило, не могут корректно обрабатываться оболочкой Bourne.

Такая обратная совместимость обеспечивает ряд преимуществ, в частности, не последнюю роль играет возможность использовать знания оболочки Bourne. При этом также значительно уменьшается объем материала, с которым необходимо ознакомиться, чтобы начать работать с оболочкой Коrn.

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

Перечень усовершенствований, имеющихся в оболочке Коrn, весьма обширен, от тривиальных до весьма существенных. Наиболее серьезные улучшения связаны с упрощением клавиатурного взаимодействия с оболочкой, значительно расширен синтаксис и технология программирования оболочки. Усовершенствования можно разделить на следующие категории:


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

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

Редактирование команд. Оболочка Коrn обеспечивает два стиля редактирования команд, которые предоставляют возможность просматривать и корректировать команды в процессе их ввода. Редактирование команд может значительно уменьшить время, затрачиваемое на повторный ввод команд.

Управление каталогами. Оболочка Коrn обеспечивает расширения команды cd, новый синтаксис записи путей и новые переменные оболочки, способствующие упрощению перехода между каталогами и сокращению длинных имен путей.

Арифметические выражения. Оболочка Bourne обеспечивает выполнение лишь минимального набора арифметических операций. Оболочка Коrn обладает гораздо большими возможностями обработки чисел, хотя карманный калькулятор все же является более подходящим инструментом для вычислений.

Улучшения синтаксиса. Оболочка Коrn предоставляет усовершенствования синтаксиса оператора if, встроенной команды test и выражений подстановки команд, которые расширяют возможности и улучшают удобочитаемость сценариев оболочки.

Шаблоны. Оболочка Коrn поддерживает большее число форматов шаблонов, что снижает объем работы с клавиатурой.

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

Выполнение заданий. Оболочка Коrn включает в себя свойства мониторинга пакетных заданий, упрощающих выполнение процессов в фоновом режиме и предоставляющих возможность одновременного выполнения большего числа заданий.

Переключение в привилегированный режим. Оболочка Bourne не обеспечивает никаких специальных свойств для использования возможности смены идентификатора пользователя (Set User ID). С другой стороны, привилегированный режим оболочки Коrn позволяет переключаться в режим Set User ID и разрабатывать процедуры так же просто, как сценарии оболочки, а ранее для этого требовалось программирование на языке С.
Хотя читатели еще не знакомы с оболочкой С, они обнаружат, что многие свойства оболочки Коrn дублируют свойства оболочки С, но с другим синтаксисом. Это сделано умышленно. Хотя оболочка С предоставляет множество необходимых свойств, ее общий синтаксис несовместим с оболочкой Bourne, что делает эту оболочку несколько выпадающей из общего стиля UNIX. Оболочка Коrn разрешает это долго существовавшее противоречие в мире UNIX, предоставляя требуемые свойства клавиатуры и программирования оболочки, но в форме, совместимой со старым, хорошо проработанным стандартом оболочки Bourne.


Основные свойства оболочки


Как уже упоминалось ранее, оболочка Коrn - это, по существу, оболочка Bourne с дополнительным слоем новых свойств. Оболочка Кот может полностью заменить оболочку Bourne, не требуя каких-либо специальных знаний свойств оболочки Коrn. Расширения оболочки Кот не вступают в действие, пока не будут явно вызваны.

В частности, оболочка Коrn идентична оболочке Bourne в следующих областях:

- Перенаправление ввода и вывода. Операции перенаправления оболочки Bourne <,<<,> и>> и свойство вызова документа (<<label) имеют идентичный синтаксис и работают таким же образом. Вызов документа - способ вставки в сценарий текстового блока, который можно перенаправить в другой процесс или файл. Например,

$ cat <<-!

This is a demonstration of a here document. As you can see, the document uses the operator р to tell the shell that all the text on the

line

next to the label, in this case !, is all to be read in and

redirected to

the cat command. This - tells the shell to remove leading tabs at the start of the line.

!

отобразило бы на экране следующий текст:

This is demonstration of here document. As you can see, the document uses the operator р to tell the shell that all the text on the next line to the label, in this case is i, is ail to be read in and redirected to the cat command. This - tells the shell to remove leading tabs at the start of the line

(Это демонстрация вызова документа. Как можно видеть, документ использует операцию р для указания оболочке, что весь текст в строке, следующей за меткой (в данном случае !), должен быть считан и перенаправлен команде cat. Этот символ - указывает оболочке удалить головные символы табуляции в начале строки)


Ввод нескольких команд в одной строке. Точка с запятой (;) отмечает конец оператора оболочки. Для ввода нескольких команд в одной строке достаточно просто завершать каждую команду, кроме последней, точкой с запятой.

Поддержка подстановок в именах файлов. Оболочка Коrn поддерживает знакомые символы шаблонов *, ? и [...]; при использовании в слове эти символы вызывают замещение слова всеми подходящими именами файлов. Оболочка Коrn поддерживает также дополнительные шаблоны имен файлов, которые имеют общую форму *(выражение) и сокращение с применением тильды (~), однако их можно не использовать. Например, если имеется три файла, скажем time.x, time.y и tame.x, то time.? Будет соответствовать time.x и time.y, t* будет соответствовать всем трем файлам, a t[ai]me.x будет соответствовать time.x и tame.x. Шаблон *(выражение) в основном аналогичен шаблону [...]; однако, в отличие от шаблона [...], в новом шаблоне *(выражение) могут применяться более длинные выражения. Кроме того, в него могут быть вложены другие шаблоны. Поэтому можно было бы использовать в шаблоне выражение, подобное следующему: file*([123].*(doc|txt)|0?.doc), что соответствовало бы следующим именам: filel.doc, filel.txt, file2.doc, file2.txt, file03.doc, fileOd.doc... Полный список был бы слишком длинным, чтобы приводить его здесь, но даже из этих примеров можно видеть возможности нового шаблона.

Подстановка переменных. Оболочка Коrn поддерживает подстановку переменных в форме $пате, а также все ссылки на специальные переменные $*, $@, $$, $-, $?, а также параметры $0-$9. Специальная форма ${пате} и форма ${name[op}text} поддерживаются с их обычным значением. Кроме того, оболочка Кот поддерживает переменные - массивы ${name[index}}, подстановки специальных команд $(...) и другие. Эти расширения не вступают в конфликт с синтаксисом оболочки Bourne, однако их можно не использовать.

Подстановка команд. Форма подстановки команд оболочки Bourne 'command' полностью поддерживается в оболочке Коrn с таким же синтаксисом и поведением. Оболочка Коrn также поддерживает вариант синтаксиса $(...) для упрощения использования подстановки команд.

Распознавание символа отмены и кавычек. Оболочка Коrn распознает заключенные в кавычки строки в форме "..." и '...' совершенно аналогично оболочке Bourne. Отдельный специальный символ может быть лишен своего особого значения с помощью обратной косой черты (); обратная косая черта удаляется из сгенерированной командной строки, если только она не находится внутри одиночных кавычек. Использование кавычек и escape-последовательностей аналогично таковому в оболочке Bourne.

Расширение команды на несколько строк. Чтобы записать команду в нескольких строках, необходимо в конце каждой строки, кроме последней, поместить символ обратной косой черты (). Этот символ должен быть последним в строке. Последовательность, состоящая из символа косой черты и следующего за ним символа новой строки, распознается и удаляется из ввода команды. Это поведение полностью аналогично поведению оболочки Bourne.
Основная идея оболочки Коrn состоит в том, чтобы использовать расширения и специальные свойства, которые не применяются в оболочке Bourne. Поэтому любые команды и сценарии оболочки, которые корректны с точки зрения синтаксиса оболочки Bourne, совершенно идентично будут интерпретироваться оболочкой Коrn. В то же время все расширения оболочки Коrn используют синтаксические формы, которые отсутствуют в языке оболочки Bourne.

Свойства, которые не вызываются командами непосредственно, например, история и редактирование команд, управляются опциями оболочки. Чтобы использовать редактирование команды, сперва необходимо ввести команду set -о vi или set -о emacs. В противном случае командная строка оболочки Коrn работает так же, как в оболочке Bourne. Отметьте также, что команда set -о недопустима для оболочки Bourne и генерирует синтаксическую ошибку.

Совместимость между оболочками Bourne и Коrn является почти полной; одним из условий разработки оболочки Коrn было обеспечение возможности выполнения поставляющихся с системой сценариев оболочки Bourne, без их изменения или вызова оболочки Bourne специально для их выполнения. Это означает, что ни один случай несовместимости с оболочкой Bourne не мог оказаться незамеченным; разработка оболочки Коrn должна была решить все эти проблемы.

Поэтому все, что описано в главе 9, без каких-либо ограничений или исключений применимо и к оболочке Коrn.


Выражения шаблонов


Оболочка Bourne поддерживает ряд синтаксических форм для сокращенных ссылок на имена файлов в командной строке. Символами шаблонов, поддерживаемыми оболочкой Bourne, являются *, ? и выражение в квадратных скобках [...].

Кроме того, оболочкой Коrn поддерживается также символ ~, предназначенный для сокращения имен путей, и выражения, позволяющие использовать в шаблонах проверку соответствия заданной подстроке: *(), ?(), +(), @() и !(). Данный синтаксис основывается на распознавании в слове круглых скобок без кавычек - (). Круглые скобки имеют специальное значение в обеих оболочках: и Bourne, и Коrn; для отмены их специального значения они должны быть заключены в кавычки. Оболочка Bourne не придаст никакого особого значения такому слову, как here+(by|with), однако выдаст сообщение о неверном использовании круглых скобок. Таким образом, слова, содержащие круглые скобки, не встречаются в оболочке Bourne. Следовательно, оболочка Коrn использует этот синтаксис без ущерба для совместимости с оболочкой Bourne.


Раскрытие тильды


Слова, начинающиеся с символа ~ (тильды), обрабатываются в оболочке Коrn специальным образом. Для отмены специального значения тильды она должна быть заключена в кавычки. Обратите внимание, что слова, содержащие тильду в любой позиции, кроме первой, обрабатываются как обычно. Тильда имеет специальное значение только в том случае, если является первым символом в слове.

В табл. 11.1 перечисляются четыре формы использования тильды.

Таблица 11.1. Формы использования тильды.

Синтаксис
Описание
Пример

~
При самостоятельном использовании или перед косой чертой {/) тильда замещается именем пути начального каталога /usr/home/fran пользователя. Это аналогично вводу $НОМЕ или $НОМЕ/...
$ echo ~

/usr/home/fran

$ echo ~/bin

/usr/home/fran/bin

~string
Тильда, за которой следует алфавитно-цифровая строка, замещается начальным каталогом пользователя, регистрационное имя которого соответствует строке. Если в файле /etc/passwd отсутствует указанное имя пользователя, будет выводиться сообщение об ошибке.
$ echo ~bill

/usr/home/bill

~+
Тильда, за которой следует знак плюса, замещается полным путем к текущему каталогу. Это аналогично вводу $PWD или $PWD/р
$ pwd

/usr/lib

$echo ~+/bin

/usr/lib/bin

~-
Тильда, за которой следует знак минуса, замещается полным путем к предыдущему каталогу. Это аналогично вводу $OLDPWD или $OLDPWD/...
$ pwd

/usr/lib

$ cd ~/iib

/usr/home/fran/lib/

$ echo ~-/bin

/usr/lib/bin




Выражения-шаблоны


Выражение-шаблон - это любое слово, состоящее из обычных символов и одного или нескольких символов шаблона. Символами шаблона являются знакомые по оболочке Bourne символы*, ? и [...], а также новые расширенные выражения из числа приведенных в табл. 11.2.

Габдица 11.2. Расширенные выражения шаблона.



*(шаблон [(шаблон]...) Соответствует нулю или более случаев совпадения с указанными шаблонами. Например, time*(.x|.y) соответствует именам файлов time, time.x, time.y, time.x.x, time.y.y, time.x.y и time.y.x, но не соответствует имени файла time.z.

+(шаблон[ | шаблон]...) Соответствует одному или более случаев совпадения с указанными шаблонами. Например, time+(.x|.y) соответствует именам файлов time.x, time.x.x, time.y, time.y.y, time.x.y и т.д., но не соответствует имени файла time.

?(шаблон [(шаблон]...) Соответствует любому из указанных шаблонов. При этом не будет выполняться конкатенация или повторение шаблонов, которым должны соответствовать файлы. Например, time?(.x|.y) соответствует только time, time.x и time.y, но не соответствует time.x.x.

@(шаблон [[шаблон]...) Соответствует точно одному из шаблонов. Например, time@(.x|.y) соответствует time.x или time.y, но не соответствует time, time.x.x или time.x.y.

!(шаблон[ | шаблон],..) Аналогично *, за исключением того, что строка, совпадающая с указанными шаблонами, считается не соответствующей. Например, timel(.x|.y) только time, time.x.y, time.0 и любой строке, начинающейся с time, за исключением time.x и time.y.
ПРЕДОСТЕРЕЖЕНИЕ

Читатели, должно быть, заметили, что выражения *(шаблон[| шаблон]...) и +(шаблон[ [шаблон]...) будут соответствовать любой комбинации указанных шаблонов Это может быть как удобно, так и опасно. В сомнительных случаях используйте команду echo для выяснения того, какие файлы будут соответствовать шаблону Вас вряд ли будут приветствовать, если вы по ошибке удалите системный файл!



Обратите внимание, что определение выражений-шаблонов рекурсивно. Каждая форма содержит одну ли более строк шаблонов. Это означает, что допускаются вложенные выражения-шаблоны Рассмотрим, апример, выражение time*(.[cho]|.sh). Оно содержит шаблон [cho] внутри выражения-шаблона, что приводит к соответствию с time*sh, time.с, time.h, time.o, time.sh.c, time.c.o и т.п. Шаблон time *(.*(sh|obj)) сответствует имени файла time.sh или time.obj

Основная ценность этих расширенных выражений заключается в предоставлении возможности выбора подмножества файлов без явного перечисления всех имен файлов в командной строке. Выражения-шаблоны допускаются также в других контекстах, когда оболочка выполняет сравнение с шаблоном, например, случае применения оператора case.


Подстановка команд


Еще одно заслуживающее упоминания свойство оболочки Коrn - более удобный синтаксис для подстановки команд. Вспомните из главы 10, что строка, заключенная в обратные кавычки (`command`) замещается стандартным выводом команды command. Однако использовать обратные кавычки не всегда удобно. оболочка Коrn поддерживает следующую альтернативную форму в дополнение к стандартному использованию обратных кавычек оболочки Bourne:

$(command-list)

где command-list - любой допустимый список команд. В простейшей форме список команд - перечень команд, разделенных точками с запятой. Внутри скобок можно использовать кавычки в любой стандартной форме без обратной косой черты, т.е. не применяя esc-последовательности. Более того, скобки могут быть вложенными; можно без труда использовать выражения $() внутри других выражений $().

Например, выражение 'ls' может быть замещено выражением $(ls). Аналогично, 'ls;who' может быть замещено строкой $(ls;who).


Усовершенствованная команда cd


Для перемещения по каталогам оболочка Коrn поддерживает две новые формы команды cd:

cd -

cd oldname newname

Команда cd - особенно удобна. Она выполняет переход в каталог, который был текущим до выполнения последней команды cd. Эта команда упрощает возвращение к рабочему каталогу после временного перехода в другой каталог - для этого нужно лишь ввести cd -. Для передачи полных путей к текущему и предшествующему каталогам поддерживаются, соответственно, переменные PWD и OLDPWD. Эти переменные можно использовать при написании команд для ссылок на файлы, содержащиеся в каталоге, без ввода полных путей.

Команду cd oldname newname можно использовать для изменения компонента пути текущего каталога. Это несколько упрощает горизонтальные перемещения по структуре каталогов.

Предположим, что текущим каталогом является /usr/prod/bin и необходимо перейти к каталогу /usr/test/bin. Для этого достаточно вести команду cd prod test. Аналогично, команда cd usr jjv выполняет переход из каталога /usr/prod/bin в каталог /jjv/prod/bin, исходя из предположения, что последний существует.


Псевдонимы


Свойство использования псевдонимов команд оболочки Коrn воистину является одним из наиболее привлекательных и гибких усовершенствований в сравнении с оболочкой Bourne. Это усовершенствование пользователи начинают применять, как правило, с самого начала работы с оболочкой Коrn.

При определении псевдонимов команд пользователь вместо длинной командной строки вводит короткое обозначение. Во время выполнения команды оно замещается представляемой им строкой. Командной строкой может быть не только имя команды; она может также определять опции и аргументы команды.

Например, пользователь может предпочитать один или несколько способов вывода содержания каталога. В частности, автор предпочитает использовать в команде ls опцию -FC, когда необходимо только посмотреть содержание каталога. Однако многократный ввод команды ls -FC в течение дня надоест кому угодно. Свойство использования псевдонимов команд дает возможность легко определить сокращенную запись команды ls. Это делается так:

$ alias lx='ls -FC'

Теперь при вводе 1х в командной строке выполняется команда ls -FC.


Определение псевдонимов

Команда alias встроена в оболочку, сие означает, что она доступна только при запущенной оболочке Коrn. Она не является частью операционной системы UNIX в целом. Эта команда используется для определения новых псевдонимов и для вывода списка псевдонимов команд, действующих в данный момент.

Общий синтаксис команды alias следующий:

alias [ -tx ] [ name [ "value] ... ]

Аргументами команды alias является одна или несколько спецификаций, каждая из которых начинается с имени псевдонима. Имя псевдонима - это команда быстрого доступа, вводимая с терминала. После знака равенства (=) вводится текст, которым оболочка должна замещать команду быстрого доступа. Строку значения псевдонима необходимо заключать в одинарные кавычки, чтобы скрыть входящие в нее пробелы и специальные символы от немедленной интерпретации оболочкой. Аргументы -t и -х дают возможность различным способами манипулировать командой alias. Так, указание -t позволяет вывести на экран все отслеживаемые псевдонимы, а использование -х дает возможность определить псевдоним как экспортируемый - во многом подобно тому, как переменные становятся экспортируемыми при использовании команды export. Для более подробного знакомства с этими опциями обратитесь к разделам "Использование отслеживаемых псевдонимов" и "Использование экспортируемых псевдонимов" далее в этой главе.

Оболочка Коrn хранит имена псевдонимов и их определения во внутренней таблице, размещаемой в памяти. Поскольку таблица не сохраняется в дисковом файле, определения псевдонимов теряются при выходе из оболочки Коrn. Для сохранения псевдонимов между сеансами необходимо задать их в файле .profile в начальном каталоге. В этом нет ничего удивительного. Та же команда, которая вводится с клавиатуры для определения псевдонима, работает и при вызове из сценария профиля регистрации. Таким образом, для тех псевдонимов, которые нужно использовать многократно, достаточно ввести команду alias в файл профиля регистрации; это необходимо сделать только один раз. (Для более подробного ознакомления с профилем регистрации обратитесь к разделу "Настройка оболочки Кот" ниже в этой главе.)

Синтаксис команды alias позволяет определять для одной команды более одного псевдонима. Общий синтаксис следующий:

alias name=value [name-value}...

Обычно несколько определений в одной команде alias - редкое явление, поскольку, как правило, они создаются по одному. Имеет смысл в профиле регистрации записывать только по одному определению псевдонима для каждой команды alias. Это упрощает добавление и удаление псевдонимов впоследствии.

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

$ alias

true=let

false=let

lx=ls -FC

Скорее всего, действующих псевдонимов окажется гораздо больше, чем определил пользователь. Оболочка Коrn автоматически определяет ряд псевдонимов при запуске, например при входе в систему, чтобы обеспечить удобные аббревиатуры некоторых команд оболочки Коrn. Определения true и false попадают в эту категорию. Операционная система UNIX обеспечивает команды true и false, но будучи программами, они должны быть найдены и загружены в память для выполнения. В качестве псевдонимов оболочка может выполнять эти команды гораздо быстрее, поэтому эти два конкретных псевдонима обеспечиваются в качестве простого средства повышения производительности многих сценариев оболочки, которые пользователь выполняет, как правило не задумываясь, в течение всего дня.

Для использования псевдонима команды 1х, приведенного в последнем примере, необходимо воспользоваться новым именем команды, как в следующем примере:

$ 1х

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

$ 1х /usr/bin

После подстановки псевдонима оболочка исполняет команду ls -FC /usr/bin.

Возможность заранее указывать в псевдониме опции команды является большим преимуществом. Более того, обычно можно дополнять или отменять опции команды при использовании псевдонима. Предположим, что при выводе содержания каталога /usr/bin нужно добавить опцию -а, чтобы можно было видеть все файлы dot. Можно было бы подумать, что нужно ввести полную команду ls, поскольку псевдоним 1х не содержит букву опции -а. Это не так. Следующая команда работает вполне нормально:

$ 1х -а /usr/bin

Когда оболочка выполняет эту команду, она немедленно замещает 1х значением псевдонима, в результате чего создается следующая строка:

$ is -fc -a /usr/bin

Команда ls, подобно большинству других команд UNIX, успешно работает с командными опциями, указанными несколькими словами.


Удаление псевдонима

Для удаления псевдонима, ранее определенного пользователем или оболочкой Коrn, необходимо использовать команду unalias:

$ unalias name [ name .. * ]

Обратите внимание, что так же, как можно в одной командной строке определять несколько псевдонимов, можно удалить несколько псевдонимов одной командой unalias.


Создание определения псевдонима


Одним из любимых псевдонимов, используемых автором, является псевдоним команды pg:

$ alias pg='/usr/bin/pg -ens -p "Page %d:"'

Псевдоним pg показателен в нескольких отношениях. Давайте рассмотрим его подробней.

Во-первых, обратите внимание, что именем псевдонима является pg. Оно совпадает с именем самой команды pg, поэтому, по существу, псевдоним скрывает команду pg. Действительная команда pg UNIX вызывается посредством использования явного указания пути - путем вызова /usr/bin/pg, а не сокращенной командой pg, которая вызывает псевдоним.

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

В связи со спецификой работы автора опции -с, -n, -s, и -р должны быть встроены в команду pg; они всегда требуются автору. Опция -с заставляет команду pg очищать экран при отображении новой страницы. На видеотерминале это удобней и быстрее, чем прокрутка строк. Опция -n приводит к тому, что pg выполняет команду немедленно, не дожидаясь нажатия клавиши Enter. Все команды pg состоят только из одной буквы. Единственная причина не использовать опцию -n ~ желание избежать снижения производительности, происходящего вследствие генерирования прерываний терминала для каждого нажатия клавиши, чего требует опция -n. Однако рабочие станции одного пользователя и современные высокопроизводительные компьютеры не замечают дополнительной нагрузки. Поэтому, если только работа не выполняется на устаревших PDP-11, опцию -n определенно стоит использовать ради предоставляемых ею удобств.

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

Опция -р заставляет команду pg отображать номер страницы в нижней части каждого экрана. Это удобно, т.к. дает грубое представление о месте текущей позиции в отображаемом документе. По умолчанию номер страницы отображается в виде простого числа, выводимого вместе с остальной частью командной строки. Однако команда pg даст возможность снабжать номер страницы форматом. Автор, в частности, предпочитает указывать -p "Page %d:". Эта строка идентифицирует номер страницы словом Page и двоеточием, отделяющим номер страницы от ввода командной строки.

Поскольку строка формата номера страницы содержит символы, имеющие специальное значение для оболочки (в частности, внутренний пробел), она должна быть заключена в кавычки. Команда alias также требует, чтобы все определение псевдонима было заключено в кавычки. Поэтому требуются кавычки внутри кавычек.

Если читатели разобрались в материале, посвященном кавычкам в главе 9, им должно быть ясно, что существует по меньшей мере три способа написания команды псевдонима pg:

$ alias pg='usr/bin/ls -cns -p "Page %d:"'

$ alias pg="/usr/bin/ls -cns -p'Page %d:'"

$ alias pg="/usr/bin/ls -ens -p"Page %d""

Первая форма была выбрана для примера. Вторая форма внедряет строку в одинарных кавычках вовнутрь строки в двойных кавычках; она работает столь же успешно. Третья форма использует esc-последовательность для использования двойных кавычек внутри строки, заключенной в двойные кавычки. В этом случае сценарии оболочки избавляются от обратных косых черт перед сохранением значения псевдонима. Автор избегает этой формы, т.к. не любит использовать esc-последовательности без крайней необходимости. Esc-последовательность состоит из двух символов, первым из которых является обратная косая черта (). Вторым символом является тот, специальное значение которого должно игнорироваться. Оболочка не будет пытаться как-либо интерпретировать его, а просто обработает в том виде, как он представлен.

Основная идея в данном случае состоит в том, что определения псевдонимов обычно должны быть заключены в кавычки, если только значение псевдонима не является единственным словом. Таким образом, иногда придется вставлять строку, заключенную в кавычки, внутрь еще одних кавычек. Необходимо быть готовым к тому, что такая потребность может возникнуть, а для этого нужно понимать, как работает механизм заключения в кавычки.ПРЕДОСТЕРЕЖЕНИЕ

Если вы полностью разберетесь в синтаксисе заключения в кавычки в языках оболочек, вас будут считать большим специалистом в UNIK Будьте осторожны






Использование экспортируемых псевдонимов


Команда alias поддерживает ряд опций, в том числе -х (экспорт) и -t (отслеживание) Экспортируемый псевдоним во многом подобен экспортируемой переменной Его значение передается в вызываемые сценарии оболочки

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

Команда alias -x используется для отображения только экспортируемых псевдонимов команд. При использовании этой команды в форме alias -x name, псевдоним name переопределяется как экспортируемый; он должен быть определен ранее. Для определения нового экспортируемого псевдонима необходимо использовать полную форму

alias -x name=value


Использование отслеживаемых псевдонимов


По умолчанию оболочка Коrn автоматически создает запись отслеживаемого псевдонима для множества команд, вызываемых с клавиатуры. Это свойство помогает увеличить производительность. Когда псевдоним является отслеживаемым, оболочка Кот запоминает каталог, в котором находится команда. Следовательно, при последующих вызовах не нужно выполнять поиск файла команды в списке PATH. По существу, для псевдонима команды просто устанавливается значение, равное полному пути команды.

Команды, для которых существуют отслеживаемые псевдонимы, можно отобразить посредством команды alias -t.

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

alias -t name

Если псевдоним с данным именем не существует, оболочка Коrn выполняет поиск пути и сохраняет полный путь команды name в качестве значения псевдонима. В противном случае для последующих ссылок оболочка просто помечает псевдоним как отслеживаемый.

Обратите внимание, что в общем случае атрибут отслеживания не устанавливается для создаваемых псевдонимов команд, т.е. для случая, когда имя псевдонима отличается от его значения. Значения для отслеживаемых псевдонимов обычно должны устанавливаться оболочкой Коrn. Эффекта отслеживания псевдонима можно достичь, введя полный путь команды в значение псевдонима; это исключает поиски пути. Например, псевдоним 1х, показанный ранее, лучше было бы записать как

alias lx='/usr/bin/ls -FC'

Тем самым был бы достигнут такой же эффект, как и при отслеживании.

В качестве заключительного примера давайте предположим, что команда vi отсутствует в списке при выдаче команды alias -t, но известно, что эта команда будет часто использоваться. Для указания отслеживания команды vi достаточно просто вывести команду alias -t vi.

Одна из основных причин отслеживания имен в том, что оболочка Коrn учитывает возможность того, что путь поиска (значение переменной оболочки PATH) может содержать каталог . (точка), который является ссылкой на текущий каталог. При переходе в другой каталог доступные ранее команды станут недоступны, и опять потребуется ввод полного пути. Отслеживание псевдонимов взаимодействует с командой cd для хранения текущих путей к псевдонимам. Другим словами, отслеживание псевдонимов обеспечивает сохранение надлежащих полных путей команд при переходе из каталога в каталог и при создании, удалении или перемещении исполняемых файлов. Для включения и отключения отслеживания псевдонимов можно использовать команду set. Ввод

set-o trackall вставляет оболочку отслеживать все используемые команды, а

set +о trackall этопочает отслеживание.


Опции оболочки


Поскольку оболочка Коrn - достаточно сложная программа, многие нюансы пользовательского интерфейса в ней могут быть настроены двумя и более способами. Чтобы помочь пользователю работать с оболочкой наиболее удобным для него образом, оболочка предоставляет возможность настройки своего поведения посредством установки различных опций.

Опции оболочки Korn могут быть заданы двумя способами: с помощью команды ksh при вызове оболочки и с помощью команды set из оболочки после ее запуска. Опции, не устанавливаемые явно, принимают значения по умолчанию. Таким образом, не приходится обращаться к настройке опций, если вы сами нe пожелаете этого.

Команда ksh в целом вызывается для пользователя процессором регистрации UNIX с использованием шаблона, хранящегося в файле /etc/passwd для регистрационного имени каждого пользователя. Как правило, системный администратор, если только он не слишком занят или не слишком высокомерен, с удовольствием настроит запись в файле /etc/passwd для вызова оболочки с желательными для пользователя установками. Конечно, в любой момент можно заместить регистрационную оболочку оболочкой Коrn, воспользовавшись следующей командой:

$ exec ksh options ...

Оператор exec, знакомый читателю по оболочке Bourne, выполняет те же действия и в оболочке Коrn. Он замещает текущую оболочку командой, названной в качестве первого аргумента, - обычно также оболочкой, но, возможно, другого типа или с другими опциями и аргументами.

Синтаксис команды ksh следующий:

ksh [ +aefhlcmnp3tuvx- ] [-cirs] [+o option] ... [+А name] [arg ...]

Опции -с, -i, -r и -s могут быть указаны только в командной строке ksh. Все остальные опции могут быть также указаны в команде set.

В табл. 11.3 приведены опции, которые нельзя задать командой set; они должны присутствовать в командной строке ksh.

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



-с Команда Первый (и единственный) аргумент arg является командой. Опция -с запрещает оболочке считывать команды из любого другого источника. Оболочка просто выполняет команду, переданную в качестве arg, а затем осуществляет выход. Эта опция не очень часто используется с клавиатуры или из сценариев оболочки. Чаще всего она используется внутренним образом, т.е. программами, написанными на языке С.

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

-r Ограниченная оболочка Оболочка Коrn запускается как ограниченная оболочка и не разрешает пользователю использовать команду cd, модифицировать переменную PATH, перенаправлять вывод и вызывать команды с их полными путями. Обычно эта опция представляет интерес только для системных администраторов при установке специализированных бюджетов пользователей. Оболочка Коrn также запускается в качестве ограниченной оболочки, если при вызове первым символом ее имени является r. Например, копирование (или создание ссылки) ksh в rksh, а затем запуск rksh дает такой же результат, как ksh -r. Повод для использования формы rksh заключается в том, что ksh -r не всегда гарантирует запуск ограниченной оболочки, если в базе данных паролей /etc/passwd она определена в качестве регистрирующей.

-s Стандартный ввод Оболочка Коrn не активизирует защиту от ненормального прерывания, предоставляемую опцией -i. Оболочка считывает команды из стандартного ввода до тех пор, пока не встретит символ конца файла, а затем выполняет нормальный выход. Эта опция весьма удобна, т.к. позволяет направлять поток команд в оболочку для выполнения.

В табл. 11.4 приведены дополнительные опции, которые можно указывать при вызове ksh или в команде set. Опции могут указываться обычным образом, т.е. посредством буквы (например, -а), или по имени (например, -о allexport). Опция, установленная явно или по умолчанию, может быть отключена с помощью флага +, как в 4-а или в +о allexport.


Таблица 11.4. Остальные опции, которые могут указываться с помощью команды ksh или set



-а Эквивалентное имя опции - allexport. Все переменные обрабатываются как экспортируемые. Для экспорта переменных нет необходимости вызывать команду typeset-x или псевдоним export. Переменная становится разрешенной для экспорта при ее определении либо посредством оператора typeset, либо посредством оператора присваивания. Команда typeset -x и псевдоним export допускаются, но они не оказывают никакого дополнительного воздействия.

-е Эквивалентное имя опции - errexit. Любая команда, возвращающая ненулевой код выхода exit, вызывает немедленное прерывание оболочки. Когда эта опция установлена в сценарии оболочки, прерывается только сценарий оболочки.

-f Эквивалентное имя опции - noglob. Раскрытие имен файлов отключено. Выражения шаблонов обрабатываются буквально и, при включенной опции -f, не имеют никакого специального значения или воздействия. Для отключения раскрытия шаблонов для не очень длинной последовательности операторов можно использовать команды set -f и set +f.

-h Эквивалентное имя опции - trackall. Любая вызываемая команда автоматически определяется как отслеживаемый псевдоним, как если бы перед каждой командой выполнялась команда -t xxx. По умолчанию для неинтерактивных оболочек опция -h установлена включенной. Команды, указывающие полный путь или использующие имена, которые не допускаются в качестве имен псевдонимов команд, не отслеживаются.

-k Эквивалентное имя опции - keyword. Когда опция -k установлена, аргументы команд, имеющие форму имя=значение, удаляются из командной строки и выполняются в качестве операторов присваивания перед выполнением команды. Присваивания экспортируются временно, на время выполнения одной команды. Эффект аналогичен добавлению аргументов ключевых слов к языку оболочки, командам UNIX и сценариям оболочки, которые поддерживают этот вид аргументов. Однако большинство команд UNIX и сценариев оболочки не поддерживают аргументов ключевых слов. Поэтому опция -k не имеет широкого применения.

-m Эквивалентное имя опции - monitor. Опция -m выполняет команды, запущенные в фоновом режиме, т.е. с использованием оператора оболочки &, в отдельной группе процессов, автоматически сообщает о прерывании таких фоновых задач и делает возможным использование команды jobs для управления фоновыми задачами. Если опция -т не установлена, команды, которые запущены с использованием оператора &, выполняются так же, как в среде оболочки Bourne, а управление задачами не действует. По умолчанию эта опция включается автоматически для интерактивных оболочек.

-n Эквивалентное имя опции - nоехес. Опция -n заставляет оболочку считывать и обрабатывать команды, но не выполнять их. Можно использовать эту опцию в форме ksh -n shell-script-filename для проверки синтаксиса сценария оболочки. Читателям, вероятно, не потребуется использовать эту опцию с регистрирующей оболочкой.

-р Эквивалентное имя опции - privileged. Опция -р полезна пользователям, создающим сценарии. Файл сценария оболочки, с установленным битом Set User ID (Установить идентификатор пользователя), битом Set Group ID (Установить идентификатор группы) или обоими, при вызове оболочкой Коrn будет иметь действующие User ID (Идентификатор пользователя) и Group ID (Идентификатор группы), соответствующие правам доступа файла, Owner ID (Идентификатор владельца) и Group ID; кроме того, опция -р будет включена. В этом режиме сценарий оболочки использует права доступа действующих User ID и Group ID, a не права доступа реального пользователя. Отключение опции -р (например, посредством команды set +p) приводит к тому, что оболочка Коrn устанавливает действующие User ID и Group ID соответствующими идентификаторам реального пользователя, по существу, выполняя переключение на права доступа пользователя, а не на права доступа файла. Впоследствии можно использовать команду set-p, чтобы вернуться в привилегированный режим (Privileged mode). He все версии оболочки Коrn поддерживают это определение опции -р; это свойство появилось лишь в последних версиях операционных систем UNIX.

-s При использовании в команде set опции -s перед сохранением выполняется упорядочивание аргументов команды arg в алфавитно-цифровом порядке. При использовании с командой ksh опция -s считывает команды из стандартного ввода (см. табл. 11.3).

-t При вызове с опцией -t оболочка Коrn считывает и выполняет одну команду, а затем осуществляет выход. Опцию -t следует устанавливать посредством команды ksh, а не команды set.

-u Эквивалентное имя опции - nounset. Опция -u заставляет оболочку генерировать сообщение об ошибке при ссылке на неустановленную переменную, например, при ссылке на $house, когда переменной house не присвоено никакое значение. По умолчанию ссылка на переменную замещается нулевой строкой. Эта опция полезна пользователям, пишущим сценарии, при отладке сценариев оболочки.

-v Эквивалентное имя опции - verbose. Каждая команда выводится перед сканированием, подстановкой или выполнением. Это удобно при тестировании сценариев оболочки, когда опция используется в форме ksh -v shell-script-filename или посредством команд set -v и set +v из сценария оболочки для инициирования отображения ряда команд по мере их готовности к выполнению.

-х Эквивалентное имя опции - xtrace. Опция -х заставляет оболочку Коrn отображать каждую команду после сканирования и подстановки, но перед ее выполнением. Каждая строка предваряется раскрытым значением переменной PS4. Использование этой опции дает возможность видеть в командной строке воздействие подстановок переменных и команд. При использовании в форме ksh -х shell-script-filename опция -х служит создателям сценариев удобным инструментальным средством отладки.

- Используемая с командами ksh или set, эта опция принудительно вызывает интерпретацию остальных слов командной строки в качестве аргументов, а не опций, даже для слов, начинающихся с символа - или +. Опция - часто используется с командой set для установки новых значений аргументов, поскольку она гарантирует, что ни одно из подставленных значений не будет истолковано, как опция оператора set.
ПРЕДОСТЕРЕЖЕНИЕ

Будьте внимательны при написании сценариев, которые будут использовать опцию privileged Небрежно написанный сценарий может открыть доступ потенциальным злоумышленникам к материалам более привилегированного пользователя




В дополнение к буквенным опциям, перечисленным в табл. 11.4, ключ -о поддерживает дополнительные опции, приведенные в табл. 11.5.


Таблица 11.5. Опции, доступные с ключом -о.



bgnice Требует, чтобы оболочка автоматически снижала приоритет фоновых задач, инициированных с использованием оператором & оболочки, как если бы использовалась команда nice.

emacs Вызывает режим EMACS Edit. Редактирование в режиме EMACS остается включенным до тех пор, пока не будет введена команда +о emacs или -о vi.

gmacs Вызывает режим GMACS (Coasting EMACS] Edit с альтернативным определением функции перемещения Ctrl-T.

ignoreeof Требует, чтобы оболочка игнорировала символ конца файла, введенный в начале командной строки. Обычно символ EOF, введенный в этой позиции, приводит к выходу из оболочки. Можно установить эту опцию, чтобы избежать случайного прерывания оболочки. Для прерывания оболочки и выхода из системы необходимо использовать команду exit.

markdirs При раскрытии шаблонов добавляет косую черту (/) к любым сгенерированным путям, являющимся путями каталогов.

noclobber Модифицирует поведение операции перенаправления > во избежание перезаписи существующих файлов. При присвоении имени существующему файлу после > оболочка записывает сообщение об ошибке и не открывает файл вывода. При установленной опции noclobber для перенаправления вывода необходимо использовать операцию >|.

nolog Подавляет сохранение функций в файле истории команд.

vi Активизирует режим vi Edit со строковым вводом. Строковый ввод обеспечивает только поднабор свойств редактирования команд vi, но дает большую производительность, чем опция viraw. Режим vi Edit можно выключить командами set +o vi или set -о emacs.

viraw Активизирует режим vi Edit с символьным вводом. Символьный ввод обеспечивает все свойства режима vi Edit, но с большей перегрузкой, чем опция vi.

Опция -А может использоваться в командной строке ksh или в команде set для определения массива с начальными значениями. При указании опции -А следующим аргументом должно быть имя массива, подлежащего инициализации. Последующие аргументы сохраняются в виде последовательных элементов массива, начиная с нулевого. Опция -А сбрасывает любое предыдущее значение переменной массива перед присвоением новых значений. Таким образом, конечное значение массива состоит только из тех аргументов, которые определены как arg.

Опция +А успешно присваивает значения элементам массива arg, начиная с нулевого элемента, но не сбрасывает ни одно из предшествующих значений элементов массива. Таким образом, если бы ранее бьшо определено, что массив имел 12 элементов, но только шесть значений были переданы опцией +А, то после выполнения первые шесть элементов массива были бы значениями аргументов arg, а вторые шесть остались бы из предыдущего значения массива.

Смысл значений аргументов arg зависит от указанных опций. Если указана опция -А, значения берутся в качестве значений начальньис элементов массива. При указании опций -s или -i, или если выполнить опцию -i не удается, поскольку вводом для оболочки служит терминал, значения элементов массива arg используются для инициализации аргументов $1, $2 и т.д. Если указывается опция -с, первый arg берется в качестве строки команды, подлежащей выполнению. Если ни одна из опций -А, -с, -i или -s не указана, первый элемент массива arg берется в качестве имени файла команд оболочки, подлежащего выполнению, а значения последующих элементов arg на время выполнения файла устанавливаются в качестве аргументов $1, $2 и т.д.


История команд


История команд и редактирование команд - в некоторой степени взаимосвязанные свойства. Однако для полного использования преимуществ, предоставляемых редактированием команд, необходимо понимание работы истории команд.

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

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

Список истории команд можно использовать одним из трех способов:

р Просматривать команды в списке историир используя команду history. Команду history следует использовать, если трудно вспомнить, выполнялось ли уже данное действие, или если нужно использовать синтаксис или операнды ранее введенной команды.

р Повторно вызывать команду из списка, используя команду r. За исключением очень коротких команд, быстрее повторно вызвать ранее введенную команду, воспользовавшись командой r, чем вводить ее снова. Команда r обеспечивает несколько альтернативных способов указания того, какую команду из списка истории необходимо повторно выполнить. Можно также изменить команду из списка истории, а затем выполнить модифицированную команду.

р Модифицировать команду в списке, используя команду fc. Для редактирования выбранной команды можно использовать любой текстовый редактор. По умолчанию оболочка Кот вызывает старый добрый ed, но можно указать любой другой текстовый редактор, изменив значение в переменной FCEDIT. Измененная команда будет выполнена сразу после выхода из редактора.




Хотя редактирование команд с помощью команды fc - удобное и полезное свойство истории команд, это не то же самое, что свойство редактирования команд, описанное далее в разделе "Редактирование команд".

Теперь давайте подробней рассмотрим команды просмотра и манипулирования историей команд


Отображение списка истории команд

Команда history отображает команды из списка истории команд. Каждая команда приводится с предшествующим ей номером строки. Номер строки однозначно идентифицирует каждую команду в списке истории и служит одним из способов ссылки на конкретную строку в списке истории, например,

$ history

[122] cd /usr/home/jim/src/payapp/payOOl

[123] vi main.с

[124] cc -l../include -о main main. с

[125] fgrep include *.c | grep '^#'

[126] vi checkwrite.c checkfile.c checkedit.c

[127] lint -i../include checkfile.c >errs; vi errs

[128] vi checkfile.c

[129] cc -i../include -o checks check*.с

[130] cp checks /usr/home/зlift/bin

ПРИМЕЧАНИЕ

Команда history в действительности является псевдонимом команды fс точнее fс -l




Полный синтаксис команды history следующий

history [first] [last]

Параметр first указывает первую строку, подлежащую отображению Можно указать конкретную строку непосредственно по ее номеру строки (например, history 35) или указать число строк, предшествующих текущей (например, history -10) Можно также передать команде имя строки, с которой должно начаться отображение (например, history vi) Оболочка Коrn выполняет просмотр назад от текущей строки до тех пор, пока не находит команду, начинающуюся с vi, а затем отображает строки от этого места и до конца

Параметр last указывает последнюю строку, подлежащую отображению Если параметр last опущен, строки истории отображаются начиная с first и кончая текущей, самой последней введенной командой в истории команд Для указания последней подлежащей отображению строки можно использовать действительный номер строки, относительный номер или имя команды

Если оба параметра first и last опущены, оболочка Коrn отображает последние 16 строк истории

СОВЕТ

Вы не будете знать какие номера строк использовать, пока впервые не обратитесь к списку истории. Большинство пользователей начинают поиск с команды history без операндов Если, нужно увидеть строки, предшествующие строке номер 160, можно попытаться использовать команду history 140.




Повторное выполнение команд из истории


Команда r позволяет повторно выполнить команду из списка истории команд. Сама команда r не добавляется к истории, а повторно используемая команда будет добавлена.

ПРИМЕЧАНИЕ

Команда r в действительности является предустановленным псевдонимом команды fc, точнее fc -e -.




Общий синтаксис команды r следующий:

r [ old=new ] [ line ]

При опускании параметра line повторно выполняется самая последняя команда.

Для указания команды, которую нужно использовать повторно, в качестве параметра line можно указывать номер строки (например, 25), относительный номер (-8) или имя команды (vi). Как и в случае команды history, при указании имени команды повторно используется последняя введенная команда с этим именем.

Слово или фразу повторно используемой команды можно изменить, используя синтаксис old=new. Предположим, что история команд содержит следующую строку:

135 find /usr -type f -name payroll -print

Команду And можно было бы использовать повторно, изменив только имя файла payroll на vendors, подобно следующему:

$ r payroll=vendor3 find

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

$ г payroll=vendors find find /usr -type f -name vendors -print


Доступ к списку истории: fc


Команда fc (fix command - исправить команду) является встроенной командой оболочки Коrn. Она обеспечивает доступ к списку истории команд Формы команды fc позволяют отображать, редактировать и повторно использовать ранее введенные команды Оболочка Коrn автоматически определяет псевдонимы history и r для уменьшения трудоемкости ввода при выполнении простых функций истории.

Синтаксис команды fc следующий:

fc [ -e editor ] [ -nir ] [ first ] [ last ]

При вызове без опций команда fc выбирает строку из истории команд, используя значения аргументов first и last, вызывает редактор команд, определенный по умолчанию, и ждет, пока пользователь отредактирует выбранную команду или команды. При выходе из редактора команды выполняются.

Команда fc в действительности копирует выбранные команды во временный файл и передает файл текстовому редактору. Содержимое файла после редактирования становится командой или командами, подлежащими выполнению.

Например, при вводе команды

$ fc vi

где vi - значение аргумента first, оболочка Кот копирует самую последнюю команду vi во временный файл Временный файл имеет трудно запоминаемое имя (вроде /usr/tmp/fcl3159) и размещается в каталоге, назначенном для временных файлов. Именно этот файл и редактируется. Независимо от того, изменяется ли текст в файле /usr/tmp/fcl3159, оболочка Кот выполняет содержащиеся в нем команды сразу после выхода из редактора.

Команда или команды, подлежащие обработке, могут быть указаны следующим образом:

р Для обработки самой последней введенной команды вызывается команда fc без аргументов first и last.

р Для выбора и обработки только одной команды вызывается fc с аргументом first, а аргумент last опускается.

р Для выбора диапазона команд укажите первую из них в качестве аргумента first и последнюю в качестве ар1умента last,

р Для указания команды по ее номеру строки в списке истории используйте просто номер, например 219.

р Для указания команды, предшествующей последней в списке истории, используйте отрицательное число. Например, в следующем списке истории команд команда fc -2 выбирает команду vi:

135 mkdir paywork

136 mv paymast/newemps paywork

137 cd paywork

138 vi newemps

139 payedit newemps

р Для выбора команды по ее имени, а не по позиции в списке истории, используйте имя команды или первые символы имени команды. Будет выбрана самая последняя команда, начинающаяся с указанных символов. В этом примере истории команд команду vi можно было бы также выбрать, введя fc vi.

Селекторы командных строк first и last не обязательно должны иметь одинаковый формат. Например, можно было бы выбрать команды в списке истории со 145-ой по пятую с конца, введя fc 145 -5.

По умолчанию команда fc вызывает для выбранных строк текстовый редактор и повторно выполняет их после редактирования. Это поведение, определенное по умолчанию, можно изменить с помощью опций, приведенных в табл. 11.6.


Таблица 11.6. Опции для изменения поведения команды fc.



-е Editor (Редактор) Опция -е используется для замещения редактора, определяемого для оболочки Коrn по умолчанию. Например, чтобы использовать редактор vi для изменения и повторного использования команд, необходимо ввести fc -е vi .... Команда fc -е vi ... используется для замещения редактора, используемого по умолчанию. Специальный формат опции -е - подавляет использование редактора. Выбранные строки выполняются немедленно, без предоставления возможности их изменения. Эта форма команды fc (как в команде fc -е - 135) эквивалентна команде r. При использовании этой формы второе тире должно быть самостоятельным словом. Команда fc -е - 135 немедленно выполняет строку 135 в истории команд, в то время как команда fc -е -135 предпринимает попытку отредактировать последнюю команду в истории команд с помощью редактора -135. которого, скорее всего, не существует. И наоборот, команда fc -е- 135 генерирует другой тип ошибки, поскольку -е- не является допустимой опцией команды fc.

-I List (Список) Выбранные строки отображаются в списке. Никакой редактор не вызывается, и строки не выполняются повторно- Команда fc -I эквивалентна псевдониму history.

-n Numbers (Номера) Использование опции -n подавляет вывод номеров строк перед историей команд. Опция +n имеет смысл только в комбинации с опцией -1, например fc -nl.

-r Reverse (Обратный) Опция -r приводит к отображению истории команд в обратном порядке. Последняя введенная команда отображается первой, а последующие строки представляют все более старые команды. Опция -r используется с опцией -I, например fc -Iг.

Редактирование команд


Редактирование команд, бесспорно, наиболее важное расширение оболочки Bourne, обеспечиваемое оболочкой Коrn. Оно в огромной степени способствует экономии времени и значительно упрощает использование оболочки начинающими пользователями UNIX.

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

Оболочка Коrn поддерживает два различных стиля редактирования команд: режим vi, названный по имени текстового редактора vi, и режим EMACS, названный по имени редактора EMACS. Если читатели знакомы с любым из этих редакторов, они могут начинать редактирование команд.


Включение режима редактирования команд


Прежде чем использовать редактирование команд, необходимо включить этот режим. А до тех пор командная строка оболочки Коrn работает так же, как в оболочке Bourne: все вводимое с клавиатуры поступает в командную строку в виде текста, в том числе нажатия управляющих и функциональных клавиш. Это свойство совместимости нужно будет отключить, как правило, посредством акта визирования редактирования команд в регистрационном профиле, зафиксированном в файле конфигурации оболочки в начальном каталоге пользователя.

Для включения режима vi введите следующую командную строку или поместите ее в профиль (см. раздел "Настройка оболочки Коrn" далее в этой главе):

set -о vi

Для активизирования режима EMACS введите следующую командную строку или поместите ее в профиль:

set -о emacs

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


Режим vi


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

Режим vi можно активизировать, введя следующую команду:

set -о vi

Если предпочитаете использовать режим vi всегда, добавьте эту команду в профиль. Обратите внимание, что нельзя одновременно включить оба режима vi и EMACS. Можно лишь переключаться с одного на другой или отключить оба.

Редактирование команд в vi использует два режима: командный режим и режим ввода текста. Обычно клавиатура находится в режиме ввода и любые набираемые на ней символы вводятся в командную строку. Для перехода в командный режим необходимо нажать клавишу ESC. В режиме Command прописные и строчные буквы клавиатуры представляют команды редактирования, а нажатие клавиши вызывает действие по редактированию. Если данной клавише не соответствует ни одна команда, то ее нажатие в командном режиме вызывает звуковой сигнал терминала; в командном режиме нельзя вводить текст. Эта ошибка является наиболее распространенной у начинающих пользователей. Именно этот камень преткновения является причиной не слишком хорошей репутации vi как текстового редактора.

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

ПРЕДОСТЕРЕЖЕНИЕ

Нажатия клавиш, выполняемые в командном режиме, не отображаются Можно видеть только эффект команды редактирования, но не саму команду. При недостаточном опыте редактирования в стиле vi или при вводе команды, состоящей из значительного числа нажатий клавиш, результат может быть непредсказуем.



СОВЕТ

Если вы забыли, какой включен режим; командный или ввода текста, невидимая природа командного режима может привести к тому, что клавиатуре покажется вам зависшей и не отвечающей на ввод никаким видимым образом. Если такое происходит, лучше всего попытаться полностью отказаться от текущей строки с помощью функции kill - нажав клавишу @ или Ctrl-U. Если эти действия оказываются безрезультатными, нажмите клавишу Enter. Нажатие клавиши Enter может привести к выводу сообщения об ошибке, возникнет при попытке выполнить запорченную команду, но, по крайней мере, гарантирует возвращение в режим ввода текста.




В табл 11 7 сведены команды режима vi Как могут заметить читатели, уже знакомые с vi, поддерживаются почти все команды редактора vi, даже те, что вызывают перемещение вверх и вниз по файлу Команды, которые вызывают перемещение от одной строки к другой, в действительности вызывают перемещение по файлу истории Это дает возможность просматривать историю команд, выбирать команду, изменять ее при необходимости и вводить заново - и все это посредством нескольких простых нажатий клавиш.

Некоторые команды могут предваряться счетчиком, т.е числом, отличным от нуля. Счетчик вызывает повторение команды указанное число раз Например, команда В выполняет возврат на одно слово, но 12В приводит к возврату на 12 слов. Если счетчик не указывается, его значение по умолчанию равно 1.

За некоторыми командами - в первую очередь с (change - изменить), d (delete - удалить) и у (yank - вклеить) - должна следовать команда перемещения курсора Такие команды помечены символом стрелки вправо (->) Использование команд перемещения курсора описывается после табл. 117.

Таблица 11.7. Команды редактирования vi: команды режима Command.



а Вставляет текст после курсора.

А Вставляет текст в конец строки.

[n]b Выполняет перемещение назад на одно слово.

[п]В Выполняет возврат на одно слово, ограниченное пробелами.

[n]с-> Изменяет текст.

С Изменяет до конца строки.

[n]d-> Удаляет текст.

dd Отменяет всю текущую строку.

[n]D Удаляет до конца строки.

[n]е Выполняет перемещение к концу текущего слова.

[n]Е Выполняет перемещение к концу слова, ограниченного пробелами.

[n]fc Перемещает курсор к следующему (либо указанному) символу с в текущей строке.

[n]FC Перемещает курсор к предыдущему (либо указанному) символу с в текущей строке.

[n]G Выполняет перемещение к последней строке (введенной позже всех) в истории команд. При вводе nG выполняется выбор строки п в истории команд.

[n]h Смещает курсор на одну позицию влево, либо на указанное число символов.

i Вставляет текст перед курсором

1 Вставляет текст перед первым отличным от пробела символом в строке.

[n]j Выполняет перемещение на одну строку (либо на указанное число строк) вниз, т.е. к более поздней строке истории. Эта команда отменяет все, что было введено в текущей строке.

[n]k Выполняет перемещение на одну строку (либо на указанное число строк) вверх, т.е. к более ранней строке истории. Эта команда отменяет все, что было введено в текущей строке.

[n]1 Смещает курсор на одну позицию (либо на указанное число символов) вправо.

n Повторяет предшествующую команду / или ?.

N Повторяет предшествующую команду /или ?, но в обратном направлении. Это приводит к тому, что команда / должна быть повторена в качестве эквивалента команды ?, а ? подлежит повторению в качестве эквивалента команды /.

[n]р Вставляет текст в буфер редактирования после текущей (или указанной) позиции курсора.

[n]Р Вставляет текст в буфер редактирования перед текущей (либо указанной) позицией курсора.

[n]rс Замещает текущий символ символом с.

R Заменяет символы в текущей строке - режим Replace (Замещение). Эта команда отличается от С

тем, что не отменяет символы, следующие за курсором; замещаются лишь столько символов, сколько вводится. Режим Replace завершается нажатием клавиши Enter или ESC.

S Удаляет всю строку и выполняет переключение в режим ввода текста.

tc Перемещает курсор к следующему символу с в строке.

Тc Перемещает курсор к предыдущему символу с в строке.

u Отменяет последнее изменение текста. Можно отменить и предшествующую команду u. Последующие команды и выполняют переключение между исходной и измененной формой текста.

U Отменяет все изменения текущей строки.

[n]v Редактирует текущую команду (или строку n в истории команд) с помощью редактора vi. При выходе из vi отредактированный файл выполняется в качестве команд, по одной на строку.

[n]w Перемещает курсор к следующему слову. (Либо на n слов вперед. Далее символ n используется также в качестве счетчика).

[n]W Перемещает курсор к следующему слову, ограниченному пробелами.

[n]х Удаляет символы после курсора.

[n]Х Удаляет символы перед курсором.

[n]у® Помещает текст в буфер редактирования.

уу Помещает в буфер (копирует) всю текущую строку.

Y Помещает в буфер (копирует) текст до конца строки.

^ Перемещает курсор к первому отличному от пробела или символа табуляции символу строки.

0 Перемещает курсор к первой позиции строки.

$ Перемещает курсор к последнему символу строки.

[n]- Выполняет переход к предшествующей строке в истории команд.

[rt]+ $ Выполняет переход к следующей строке в истории команд. Используйте + только если ранее использовали - или k для перемещения назад в файле истории. Опция G используется для перехода к самой ранней строке в файле истории.

[n]| $ Выполняет перемещение к n-ому символу строки, т.е. к столбцу n.

[n]_ $ (Символ подчеркивания) Вставляет последнее (л-ое) слово предшествующей команды.

/string$ Выбирает самую последнюю строку в истории команд, содержащую строку string. Строка не может быть регулярным выражением.

/^strings То же что /, но выбирает только строку, начинающуюся со string, т.е. / выбирает строку, содержащую string в любом месте, а /^ ищет только строки, которые начинаются со string в столбце 1.

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

?^strimg То же что ?, однако выбирает только строку, начинающуюся со string, т.е. ? выбирает строку, содержащую string в любом месте, а ?^ ищет только строки, которые начинаются со string в столбце 1.

; $ Повторяет предыдущую команду - f, F, t или Т.

, Повторяет предыдущую команду - f, F, t или Т, но изменяет порядок просмотра команд на противоположный.

~ Изменяет регистр текущего символа на противоположный. Повторяет предыдущую команду изменения текста.

# Вставляет знак фунта (#) в начале строки. Если затем нажать Enter, оболочка интерпретирует строку как комментарий, а строка добавляется к истории команд.

= Выводит список имен файлов текущего каталога, которые начинаются с того же символа, что и текущее слово. Список имен файлов не вставляется в текущую строку и текущая строка не изменяется. Однако отображенную информацию можно использовать для выбора файла и завершения ввода его полного имени.

Дописывает символы к слову, содержащему курсор, чтобы оно образовывало допустимое имя пути. Оболочка просматривает текущий каталог (или каталог, указанный для неполных слов) на предмет имен файлов, начинающихся с тех же символов, что и данное слово. Затем она дописывает символы из подходящих имен файлов, пока не будет образовано полное имя файла, а в случае нескольких совпадений, пока имена файлов не станут различаться. Эта команда - удобный способ сокращения имен файлов или ввода имени файла, когда удается вспомнить только несколько первых символов его имени.

* Замещает слово списком имен файлов, находящихся в текущем каталоге (или в каталоге, указанном словом) и начинающихся с тех же символов, что и замещаемое слово. Оказывает такое же действие, как выражение шаблона string* при непосредственном вводе, за исключением того, что имена файлов вводятся в командную строку сейчас, а не во время обработки оболочкой.

Space (Пробел) Смещает курсор вправо. Не изменяет пройденные символы.

Backspace (Возврат) Смещает курсор влево. Не изменяет пройденные назад символы.

Enter Выполняет текущую командную строку.

Ctrl-L Обновляет текущую строку. Эта команда полезна, когда изображение на экране повреждается. Эта команда обновляет только строку дисплея, используемую для ввода команд, но не весь экран.
ПРИМЕЧАНИЕ

Хотя многие версии редактора поддерживают .клавиши управления курсором, режим vi не распознает эти клавиши поэтому для управления курсоров нужно использовать команды h, J, it и I.




Свойство редактирования команд поддерживает также несколько операций управления, описанных в табл. 11.8; их можно использовать в режиме ввода текста. Использование одной такой операции не требует переключения в командный режим и при их использовании не выполняется переключение в этот режим.

Таблица 11.8. Редактирование команд в режиме vi: команды режима ввода текста.



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

Erase Обычно это клавиша # или Backspace. Это функция erase, определенная командой stty. Курсор перемещается на одну позицию назад, а символ в этой позиции стирается.

Kill Обычно символ @ или ^u (Ctrl-U). Это функция kill, определенная командой stty. Текущая строка отменяется; строка ввода стирается и курсор возвращается к началу строки. Обратите внимание, что это отличается от обычного действия оболочки, когда редактирование команд не действует. Обычно функция kill прокручивает отмененную строку вверх и начинает новую строку под ней.

Ctrl-v Отменяет специальное, управляющее значение следующего символа. Это дает возможность вводить Erase, Kill или символ в качестве данных, обходя обычную функцию управления.

Ctrl-w Удаляет предшествующее слово. Эта команда аналогична Backspace, но выполняет возврат через предшествующее слово, а не предшествующий символ.

Отменяет следующий символ Erase или Kill. Эта команда аналогична команде Ctrl-v, но она не отменяет других команд.

Большинству команд vi может предшествовать коэффициент повторения, показанный в квадратных скобках как [n]. Если опустить коэффициент повторения, команда выполняет свою обычную функцию один раз. Коэффициент повторения превышающий 1 вызывает повторение действия указанное число раз. Таким образом, 2W вызывает перемещение курсора вперед не на одно, а на два слова, а команда 7г. замещает семь символов, начиная с позиции курсора, семью точками.

Команды, показанные с символом ® требуют использовать команду перемещения курсора, вслед за вводом символа основной команды. За командами с, d и у должны следовать команды перемещения курсора для определения объема текста, подлежащего изменению, удалению или помещению в буфер (копированию). Командой перемещения курсора может быть любая команда, которая сама по себе переместила бы курсор за пределы требуемого текста. Например, команда dw удаляет текущее слово. Команда cte изменяет текст до, но не включая, следующего символа е в строке. Команда у0 вклеивает символы от начала строки до, но не включая, символа в позиции курсора.

Выделение с помощью команд перемещения курсора ничем не ограничено. Не существует никаких ограничений в выборе диапазона текста; можно выбирать любой фрагмент, который наиболее подходит. Однако пока не освоитесь с использованием команд перемещения курсора, ограничивайтесь простыми комбинациями, такими как cw или cW, чтобы изменять отдельные слова.

Команды перемещения курсора, записываемые прописными буквами В, Е и W, отличаются от строчных аналогов выбором ограничителей. Команды строчных букв b, e и w считают слово заканчивающимся следующим не алфавитно-цифровым символом пунктуации, которым может быть пробел или символ табуляции, в их число входят также апострофы, запятые и т.п. Команды В, Е и W считают слова ограниченными строго пробелами или символами табуляции. Они пропускают или выбирают символы пунктуации наравне с алфавитно-цифровыми символами.

Большинство команд оставляют командный режим включенным. Однако некоторые команды (а, А, с, С, i, I, R и S) выполняют переключение в режим ввода текста, давая возможность вводить текст. Если после ввода текста требуется выполнить команду, просто нажмите клавишу Enter. Но если нужно еще немного отредактировать строку, необходимо выполнить переключение обратно в режим Command. В этом случае после ввода требуемого текста нажмите клавишу ESC.

Не все команды, поддерживаемые редактором vi, показаны в табл. 11.8. Неуказанные команды не поддерживаются встроенным режимом vi оболочки Коrn. Упоминания заслуживают такие опущенные команды, как о и О (Open - открыть), m (mark - пометить), и такие команды прокрутки, как z, H и М. Это обусловлено различием между редактором команд и редактором файлов. В контексте редактирования команд эти команды не находят применения.




Для более полного ознакомления с командами редактирования текста vi обратитесь к главе 3 книги "UNIX для Internet. Энциклопедия пользователя "Редактирование текста с помощью vi и emacs"

Режим EMACS


Режим EMACS разработан для повторения интерфейса редактирования, предоставляемого редактором EMACS. Редактор EMACS в целом сложнее редактора vi, но многие находят, что его лишенный специальных режимов полноэкранный стиль более естественен, чем стиль редактора vi. Возможно, это и так, но стиль модального (режимного) редактирования хорошо подходит для редактирования команд. Даже если читатели уже являются приверженцами EMACS, они, наверное, захотят "потрогать" режим vi, прежде чем окончательно от него откажутся.

Режим EMACS включается при вводе следующей команды:

set -о emacs

Если вы предпочитаете всегда использовать режим EMACS, можно добавить эту команду в файл .profile. Однако отметьте себе, что нельзя одновременно включить оба режима - EMACS и vi.

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

Клавиатурные команды EMACS описаны в табл. 11.9. Примечания, касающиеся описанных в таблице команд, следуют сразу за табл. 11.9, Команды перечислены в алфавитном порядке по буквам команд, причем специальные символы (*, = и т.п.) приведены первыми. Все команды представляют собой одну букву, которой предшествует нажатие клавиши Ctrl или ESC. Как обычно, клавишу Ctrl нужно нажать и удерживать во время нажатия клавиши буквы команды, а вот клавишу ESC перед нажатием клавиши командной буквы необходимо нажать и отпустить. После табл. 11.9 приведены примечания, поясняющие записи в таблице.

Многие команды допускают указание перед командой счетчика повторения в форме ESC n. Счетчик повторяет действие команды указанное число раз или указывает столбец, по отношению к которому должна выполняться команда. Значение л начинается с 1. Esc 1 выполняет команду один раз; аналогично можно вообще не вводить ESC п.

ПРЕДОСТЕРЕЖЕНИЕ

Режим EMACS редактирует строки, a не команды История команд может содержать -многострочные команды, например if или while, если подобные команды используются с клавиатуры. Режим vi обрабатывает подобные команды как единый элемент, но в режиме EMACS Edit может потребоваться использование команды Ctrl-O для перешагивания через многострочные команды при получении их из истории команд.




Интерфейс редактирования команд EMACS является примером интерфейса пользователя, разработанного для инопланетных рас, поскольку для успешной работы он требует использования сразу трех рук. Тем не менее начинающий пользователь или пользователь, прибегающий к редактированию команд лишь от случая к случаю, вполне может предпочесть режим EMACS, а не режим vi, поскольку в EMACS отсутствует путаница между командным режимом и режимом ввода. Однако с возрастанием профессионализма и скорости работы с клавиатурой режим vi становится более привлекательным интерфейсом.


Таблица 11.9. Команды режима EMACS.



Enter Выполняет текущую строку. На некоторых терминалах эта клавиша обозначена как Return.

Erase Символ удаления, определенный командой stty. Удаляет символ, предшествующий курсору.

ESC n Erase Осуществляет возврат (с удалением) на п символов.

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

Отменяет специальное значение следующего символа, делая возможным ввод символов Erase, Kill, EOF, ESC и Ctrl-x в текущую строку. Сам символ игнорируется оболочкой. Для ввода одиночного символа обратной косой черты введите \.

ESC ESC Дописывает символы к текущему слову для завершения имени пути.

ESC Space Устанавливает метку в позиции курсора.

ESC * Выполняет раскрытие пути применительно к текущему слову, как если бы к нему был добавлен символ *, и замещает слово списком соответствующих путей, если таковые существуют.

ESC = Выводит список путей, соответствующих текущему слову, как если бы к слову был добавлен символ *. Текущая строка не изменяется.

ESC < Получает из истории команд наиболее раннюю строку.

ESC > Получает из истории команд наиболее позднюю строку.

ESC . Вставляет последнее слово предшествующей команды в текущую позицию курсора.

ESC n ESC . Вставляет л-ое слово предшествующей команды в позицию курсора.

ESC_ To же, что ESC ..

ESC Ctrl-? То же, что ESC Ctrl-H. (см. Примечание)

ESC n ESC Ctrl-? To же, что ESC Ctrl-H. (см. Примечание)

ESC letter Вызывает макрос, определенный в качестве псевдонима, названного letter. (См. Примечание)

Ctrl-] с Перемещает курсор к следующему символу с в данной строке.

Ctrl-A Перемещает курсор к началу строки.

Ctrl-B Перемещает курсор влево на один символ. (См. Примечание)

ESC n Ctrl-B Перемещает курсор влево на п символов.

ESC b Перемещает курсор к началу слова.

ESC n ESC Ь Выполняет перемещение назад на n-1 слов.

Ctrl-C Переводит текущий символ в верхний регистр.

ESC n Ctrl-C Переводит в верхний регистр n символов.

ESC с Переводит в верхний регистр все символы от курсора до конца текущего слова.

ESC n ESC с Переводит в верхний регистр буквы л слов, начиная от позиции курсора. (См. Примечание)

Ctrl-D Удаляет один символ. (См. Примечание)

ESC n Ctrl-D Удаляет п символов. (См. Примечание)

ESC d Удаляет символы до конца текущего слова.

ESC n ESC d Удаляет символы до конца п-го слова вправо.

Ctrl-E Перемещает курсор к концу строки.

Ctrl-F Перемещает курсор на один символ вправо. (См. Примечание)

ESC п Ctri-F Перемещает курсор на п символов вправо.

ESC f Перемещает курсор вправо на одно слово.

ESC n ESC f Перемещает курсор вправо на п слов.

ESC h То же, что ESC Ctrl-H.

ESC n ESC h То же. что ESC n ESC Ctrl-H.

ESC Ctrl-H Удаляет символы от позиции курсора до начала текущего слова. (См. Примечание)

ESC n ESC Ctrl-H Удаляет символы от позиции курсора до начала п-го предшествующего слова. (См. Примечание)

Ctrl-J To же, что Enter.

Ctrl-K Удаляет символы до конца строки.

ESC n Ctrl-K Удаляет символы назад или вверх до столбца n.

Ctrl-L Повторно отображает всю текущую строку.

ESC I Переводит все символы до конца текущего слова в нижний регистр. (См. Примечание)

ESC n ESC I Переводит в нижний регистр л слов, начиная с позиции курсора.

Ctrl-M To же, что Enter.

Ctrl-N Загружает следующую строку из файла истории команд. Последующие нажатия клавиш вызывают все более поздние строки. (См. Примечание)

ESC n Ctrl-N Загружает n-ю от текущей позиции строку по направлению к концу файла истории команд.

Сtrl-О "Выполняет текущую строку, а затем загружает следующую строку из истории команд. (См. Примечание)

Ctrl-P Замещает текущую строку последней строкой истории команд. Последующие нажатия клавиш приводят к загрузке все более ранних строк из истории команд. (См. Примечание)

ESC n Ctrl-P Загружает n-ю (считая от последней) строку из истории команд.

ESC p Копирует текст от курсора до метки во внутренний буфер. Предварительно необходимо установить метку, используя ESC Space.

ESC 0 Ctrl-R. string Просматривает историю команд, начиная с самой ранней на предмет первой строки string. Для повторения предыдущего поиска следует опустить string.

Ctrl-R ^string To же, что Ctrl-R string, за исключением того, что учитывается совпадение со string только в начале строки.

ESC 0 Ctrl-R ^string То же, что ESC 0 Ctri-R string, за исключением того, что учитывается совпадение со string только в начале строки.

Ctrl-T Меняет местами текущий и следующий символы. (См. Примечание)

Ctrl-U Умножает счетчик следующей команды на 4. Таким образом, команда Ctli-U Ctrl-F перемещает курсор вправо на четыре позиции.

Ctrl-V Отображает текущую версию оболочки Коrn. Для повторного отображения текущей строки нажмите любую клавишу.

Ctrl-W Удаляет символы от курсора до метки. Метки устанавливаются предварительно, посредством использования ESC+Space.

Ctrl-X Ctrl-X Перемещает курсор к позиции метки, устанавливая новую метку в старой позиции курсора. Это действие называется обменом местами курсора и метки.

Ctrl-Y Вставляет последний удаленный текст в текущую позицию курсора.
ПРИМЕЧАНИЕ

Последовательность Ctrl-& не должна восприниматься буквально. Она соответствует символу Del (127) ASCII. Большинство терминалов генерируют символ Del в ответ на нажатие клавиши Delete, и в этом случае ESC Delete является синонимом ESC Backspace.




ПРИМЕЧАНИЕ

Макрос определяется с помощью встроенной команды alias оболочки. Его имя должно начинаться с символа подчеркивания (J, за которым должна следовать одна буква. Значение псевдонима обрабатывается так. как если бы эти символы были введены в момент вызова макроса. Таким образом, такие последовательности как Ctrl-f в значении псевдонима перемещают курсор в его текущую позицию. 8 имени макроса не должны использоваться буквы b, с, d, f, h, I или р, эти буквы уже присвоены командам EMACS.



ПРИМЕЧАНИЕ

Кроме использования управляющих последовательностей клавиш для перемещения курсора, клавиши управлений курсором можно использовать для перемещений по списку истории и для перемещения курсора. Однако эта возможность зависит от настроек конкретного терминала.



ПРИМЕЧАНИЕ

Изменение регистра символа также перемещает курсор вправо, пропуская измененный символ(ы).






ПРИМЕЧАНИЕ

Если последовательность клавиш Ctrl-d присвоена функции EOF командой stty, она интерпретируется в качестве клавиши EOF при вводе в начале строки. В противном случае выполняется функция Delete.



ПРИМЕЧАНИЕ

Большинство терминалов генерируют последовательность Ctrl-h в ответ на нажатие клавиши Backspace. Однако некоторые терминалы генерируют символ Del (127), Следовательно, последовательность ESC Backspace может и не работать на конкретном терминале.



ПРИМЕЧАНИЕ

Чтобы использовать команду operate (Ctrl-o), сперва необходимо установить позицию в файле истории команд, используя Ctrl-p, Ctrl-n или другую команду истории. Последующие нажатия клавиш Ctrl-p вызывает перемещение по строкам истории команд в прямом направлении - от более ранних к более поздним - с выполнением одной строки одновременно. Имеется возможность изменить каждую из строк перед нажатием клавиш Ctrl-o для ее выполнения.



ПРИМЕЧАНИЕ

Если вместо команды set -о emacs используется команда set -о gmacs, команда Ctrl-t меняет местами текущий и предшествующий символ, а не текущий и следующий. Это единственное различие между режимами редактирования EMACS и GMACS.




Переменные


Концепция переменных оболочки была представлена в главе 9. Все сказанное в этой главе остается справедливым и для оболочки Коrn. Однако оболочка Коrn обеспечивает некоторые существенные расширения поддержки переменных оболочки. Среди них - значительное расширение набора переменных, которые имеют специальное значение для оболочки. Эти переменные часто называют предопределенными переменными, поскольку оболочка обеспечивает для них начальные значения по умолчанию при входе в систему. Оболочка Коrn также поддерживает переменные массивов и усовершенствованные арифметические операции с переменными оболочки, что является огромным преимуществом для разработчиков сценариев оболочки. Естественно, для поддержки этих возможностей синтаксис ссылок на переменные оболочки расширен.


Предопределенные переменные


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

В число переменных, значения которых устанавливаются оболочкой, входят уже знакомые $@, $*, $#, $-, $? и $$, а также новая переменная $!. Новая переменная $! отображает Process ID (Идентификатор процесса) последней вызванной команды. Она отличается от переменной $$ тем, что значение $$ - текущий Process ID - в общем случае идентично самой оболочке и не изменяется, в то время как значение переменной $! изменяется при каждом вызове команды. Значения остальных переменных оболочки имеют такой же смысл, как и в оболочке Bourne.

В табл. 11.10 приведены именованные переменные, инициализируемые оболочкой Коrn.


Таблица 11.10. Именованные переменные, инициализируемые оболочкой Коrn.



- Вначале эта переменная равна полному пути последней вызванной команды. Однако затем она становится последним аргументом предшествующей команды, поэтому при последующем вводе команды ls -I, значением $_ является -I. Эта переменная также используется оболочкой для хранения имени файла mail при проверке на предмет наличия электронной почты. Эта переменная практически бесполезна для пользователя и используется оболочкой.

ERRNO Ненулевой код выхода последней неудавшейся команды. Эта переменная аналогична переменной $?, но отличается от нее, т.к. ее значение изменяется только в случае неудавшегося выполнения команды. Успешно выполненные команды не изменяют значение переменной $ERRNO. Эта команда прежде всего предназначена для диагностических целей при использовании с клавиатуры; она редко используется в сценариях оболочки.

LINENO Эта переменная имеет смысл только внутри сценария оболочки. Ее значением является номер строки в сценарии, подлежащем выполнению в данный момент. Переменной LINENO можно присвоить значение, но оно будет изменено следующим вызванным сценарием оболочки. Если же переменная находится внутри сценария оболочки, это значение будет изменено следующей выполненной строкой.

OLDPWD Значением этой переменной всегда является полное имя пути каталога, который был текущим непосредственно перед последней командой cd. Иначе говоря, повторные выполнения команды cd $OLDPWD выполняют переключения вперед-назад между текущим и предшествующим каталогами. Важное применение переменной $OLDPWD - улучшение работы команд ср и mv. Команда cd someplace, за которой следует команда ср filelist $OLDPWD, копирует файлы исходного каталога без необходимости ввода его полного имени пути. Затем следует воспользоваться командой cd $OLDPWD для переключения снова на исходный каталог. (В оболочке Когп управляющая последовательность cd - имеет то же значение, что и cd $OLDPWD.)

OPTARG Это значение устанавливается командой getopts - новой встроенной командой оболочки Коrn. (Для получения более подробной информации обратитесь к разделу "Программирование оболочки", ниже в этой главе.)

OPT1ND Это значение устанавливается командой getopts. (Для получения более подробной информации обратитесь к разделу "Программирование оболочки", ниже в этой главе.)

PPID Это значение - текущий родительский Process ID. Т.е., если переменная $$ является текущим Process ID, то $PPID - Process ID родительского процесса переменной $$. Эта переменная особенно полезна разработчикам сценариев оболочки. Она редко используется при работе с клавиатуры.

PWD Указывает полное имя пути текущего каталога. Вследствие символических ссылок значение переменной $PWD не обязательно идентично значению, выводимому командой pwd. Предположим, что существуют каталог /usr/bin и символическая ссылка на него, названная /bin. После выполнения команды cd /bin команда pwd выводит /usr/bin - действительный путь каталога, но оператор print $PWD печатает /bin - имя пути, по которому осуществляется доступ к каталогу. (Ссылки освещаются в главе 4.)

RANDOM Значение является целым числом в диапазоне от 0 до 32767. Значение меняется случайным образом при каждой его проверке. Эта переменная не слишком часто используется при работе с клавиатуры; однако в сценариях оболочки она полезна при генерировании временных имен файлов.

REPLY Оператор select, появившийся в оболочке Коrn, устанавливает значение переменной $REPLY равным тексту, который вводится пользователем. Встроенная команда read сохраняет введенный пользователем текст в переменной $REPLY, если команде read не передаются никакие имена переменных. (Для получения более подробной информации обратитесь к разделу "Использование оператора select", ниже в этой главе.)

SECONDS Целое число секунд, прошедших с момента вызова оболочки Коrn, обычно, с момента входа в систему, если только оболочка Коrn не была вызвана явно командой ksh. Эта переменная просто записывает время, когда оболочка Коrn была запущена на терминале.

Приведенные в табл. 11.10 переменные оболочки, устанавливаемые оболочкой Коrn, не требуют вашего внимания. Если необходимо использовать одну из них при работе с клавиатурой или со сценарием оболочки, обратитесь к этой таблице.

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

Однако некоторые переменные требуют к себе более пристального внимания со стороны пользователя. В большинстве случаев оболочка Коrn при запуске присваивает этим переменным значения по умолчанию. Эти значения по умолчанию можно изменить в профиле регистрации - в файле .profile, расположенном в начальном каталоге, либо в процессе работы, воспользовавшись оператором присваивания. Значения этих переменных влияют на работу оболочки Коrn. Их надлежащая установка может значительно повысить эффективность и производительность работы.

В табл. 11.11 приведены переменные, используемые оболочкой Коrn

.

Таблица 11.11. Переменные, используемые оболочкой Коrn.



CDPATH Значением переменной $CDPATH является список разделенных двоеточиями имен путей каталогов. Значение используется только в команде cd. Переменная CDPATH используется для именования списка каталогов, подлежащих поиску при выдаче команды cd с простым именем файла каталога. Преимущество переменной CDPATH в том, что она позволяет перейти к каталогу, передав только имя каталога вместо полного пути. Для CDPATH не устанавливается значение по умолчанию.

COLUMNS Значение переменной $COLUMNS определяет ширину дисплея, используемого режимом редактирования команд оболочки Коrn - vi или EMACS, как окно просмотра для длинных строк или как ширину экрана для вывода списка select. Значение по умолчанию - 80.

EDITOR Значение $EDITOR используется в первую очередь программами, отличными от оболочки Коrn. Однако при установке значения переменной EDITOR (в профиле или с клавиатуры) оболочка Коrn проверяет значение на предмет имени пути, заканчивающегося vi или emacs. Если любое из этих значений найдено, оболочка Коrn устанавливает соответствующую опцию vi, emacs или gmacs, делая возможным редактирование команд. Это всего лишь вопрос удобства. Можно по-прежнему включать режим редактирования команд, используя команду set -о. Переменная EDITOR не имеет значения по умолчанию.

ENV Значение переменной $ENV- путь к сценарию оболочки, который содержит команды, подлежащие выполнению при вызове оболочки Коrn. Обратите внимание, что оболочка Коrn вызывается явно при вызове команды, написанной в виде сценария оболочки Кот. Оболочка Коrn может вызываться также из других команд UNIX, таких как vi и рg. Посредством помещения команд alias, export и set в файл и передачи пути файла в качестве переменной $ENV можно гарантировать наличие одной и той же среды оболочки при любом вызове оболочки Коrn. Старайтесь сохранять файл, на который указывает переменная $ENV, небольшим по размеру, поскольку он выполняется при запуске каждого сценария оболочки. (Для получения более подробной информации обратитесь к разделу "Настройка оболочки Коrn", ниже в этой главе. Для переменной ENV не устанавливается значение по умолчанию.

FCEDIT Значение переменной $FCEDIT - имя пути текстового редактора, подлежащего вызову командой fc. Значение переменной FCEDIT можно заместить, используя с командой fc опцию -е. Значение переменной FCEDIT по умолчанию - /bin/ed.

FPATH Значением переменной $FPATH является список каталогов, разделенных двоеточиями. Этот формат аналогичен формату переменных CDPATH и PATH. Список каталогов просматривается для автозагрузки определений функций. (Для ознакомления с функциями автозагрузки обратитесь к разделу "Программирование оболочки", далее в этой главе.) Переменная FPATH не имеет значения по умолчанию.

HISTFILE HISTFILE - это имя файла истории оболочки Коrn. Если нужно явно указать имя файла истории, необходимо в профилю регистрации передать значение переменной HISTFILE. Значением переменной HISTFILE является $HOME/.sh_history.

HISTSIZE Значением переменной HISTSIZE является целое число, указывающее максимальное число команд, а не строк, подлежащих хранению в файле истории. В ходе работы оболочка может хранить в памяти большее число команд, чем определено в переменной HISTSIZE, но в файле на диске она будет хранить не более указанного в этой переменной количества команд. Обратите внимание, что устанавливаемое для переменной HISTSIZE значение обрабатывается по-разному. В зависимости от конкретной версии оболочки Коrn оно может иметь смысл максимального количества запоминаемых команд или гарантированного минимального размера файла истории. Значение переменной HISTSIZE по умолчанию - 128.

HOME Переменная HOME работает с оболочкой Коrn так же, как с оболочкой Bourne. Значением этой переменной является имя пути начального каталога. Эта переменная используется прежде всего командой cd в качестве каталога по умолчанию при вызове со без каких-либо аргументов. Она используется также многими другими командами и сценариями оболочки. Переменная инициализируется процедурой входа в систему UNIX прежде, чем вызывается любая оболочка. Значение переменной HOME почти никогда не нужно изменять. Значение этой переменной по умолчанию - запись файла /etc/passwd для регистрационного имени конкретного пользователя.

IFS Переменная IFS работает с оболочкой Коrn так же, как с оболочкой Bourne. Значение переменной IFS - ноль или более символов, подлежащих обработке оболочкой в качестве ограничителей при синтаксическом разбиении командной строки на слова или при использовании команды read. Первый символ переменной IFS используется оболочкой для разделения аргументов переменной $*. Переменная IFS редко используется с клавиатуры и может быть изменена в сценарии оболочки для разбиения строки на подстроки с использованием произвольных ограничителей. Некорректное изменение переменной IFS может привести к серьезным проблемам, поэтому манипулировать ею следует осторожно, всегда восстанавливая первоначальное значение по умолчанию. Это значение состоит из трех последовательных символов: пробела, символа табуляции и символа новой строки.

LINES Значением переменной LINES является целое число, представляющее количество строк, отображаемых терминалом. Оболочка Коrn использует значение переменной LINES, если оно установлено, для ограничения вывода списков select (см. раздел "Использование оператора select", ниже в этой главе). Если никакое значение не установлено, списки select могут быть достаточно длинными, поэтому некоторые строки будут прокручиваться вне пределов экрана. Значение по умолчанию для переменной LINES отсутствует.

LOGNAME Эта переменная - регистрационное имя пользователя, упоминающееся в базе данных пользователей /etc/passwd. Изменение этой переменной может повлиять на некоторые программы, поэтому при ее использовании необходимо соблюдать осторожность и после использования следует восстанавливать исходное значение.

MAIL Переменная MAIL работает с оболочкой Коrn так же, как с оболочкой Bourne. Ее значением является имя пути файла, дата последней модификации которого отслеживается оболочкой. Если изменение даты имеет место, при первой же возможности оболочка выводит сообщение You have mail (На ваше имя пришла почта). Значения по умолчанию для переменной MAIL не существует. Значение MAIL необходимо устанавливать в профиле регистрации. Обычно это имя почтового файла.

MAILCHECK Значение переменной MAILCHECK - целое число секунд, определяющее, как часто оболочка должна проверять наличие изменений в файле mail. Если значение MAILCHECK не установлено или равно нулю, оболочка проверяет наличие изменений в почтовом файле при выводе каждого приглашения командной строки. Значение переменной MAILCHECK по умолчанию - 600.

MA1LPATH Значением переменной MAILPATH является разделенный двоеточиями список путей, каждый из которых идентифицирует файл, подлежащий отслеживанию на предмет изменений в дате последней модификации. Имени пути может предшествовать знак вопроса и сообщение, которое следует выводить вместо сообщения You have mail - например, можно использовать MAILPATH=/var/spool/ mail/jjv?New mail in /var/spool:/usr/mail/jjv?New mail in /usr/mail. В общем случае необходимо инициализировать переменную MAIL или MAILPATH, но не обе. MAILPATH не имеет значения по умолчанию.

PATH Переменная PATH работает с оболочкой Коrn так же, как с оболочкой Bourne. Ее значение по умолчанию является системно-зависимым. Эта переменная не может быть изменена, если оболочка была запущена в качестве ограниченной оболочки.

PS1 PS1 - это строка первичного приглашения. Оболочка Коrn выполняет полную подстановку значения переменной $PS1 перед отображением его в начале каждой строки ввода команды. Таким образом, в среде оболочки Коrn приглашение можно настраивать гораздо в большей степени, чем при использовании оболочки Bourne. Например, можно указать PS1='$pwd: ', чтобы в качестве приглашения отображался текущий каталог. (Кавычки необходимы для предотвращения подстановки значения переменной PWD в момент присваивания; это позволяет выполнить подстановку позднее при выводе значения $PS1.) Можно также использовать в приглашении восклицательный знак (!), который замещается номером команды (см. раздел "История команд", выше в этой главе). Значение этой переменной по умолчанию - "$ ".

PS2 PS2 - это строка вторичного приглашения. Эта переменная та же, что в оболочке Bourne. Ее значение по умолчанию - ">".

PS3 Переменная PS3 - это строка приглашения select. Значение $PS3 выводится командой select в качестве приглашения выбора. (См. "Использование оператора select", ниже в этой главе.)

PS4 Переменная PS4-это строка приглашения отладки. Значение $PS4 просматривается для подстановки переменной и выводится перед каждой строкой, отображаемой командой trace или опцией -х. Переменная SHELL определяет имя пути оболочки. Оболочка Коrn присваивает значение по умолчанию переменной $SHELL только в том случае, если оно не установлено при запуске ksh. Это значение не используется оболочкой Коrn непосредственно, но многие другие команды (например, vi и рд) используют его в качестве имени пути оболочки, подлежащей вызову при вызове субоболочки. Если переменная SSHELL определяется при запуске ksh с опцией r, оболочка Коrn ведет себя как ограниченная оболочка. Т.е. пользователь не может вызывать команды с полными путями, не может использовать команду cd и не может изменять переменную PATH.

TERM Значением переменной TERM является символьная алфавитно-цифровая строка, идентифицирующая тип терминала. Переменная не используется оболочкой Коrn непосредственно, однако имя переменной TERM резервируется для общесистемного использования. Корректная установка $TERM важна для правильного функционирования терминала, и переменная должна инициализироваться надлежащим образом при входе в систему. Относительно допустимых значений для каждого конкретного случая инсталляции следует проконсультироваться с системным администратором. Переменная TERM не имеет значения по умолчанию.

TMOUT Значением переменной TMOUT является целое число, указывающее интервал времени в секундах, по истечение которого отсутствие каких-либо действий на терминале должно вызывать автоматическое прекращение сеанса оболочкой Коrn. Нулевое значение отключает функцию автоматического прекращения сеанса работы с терминалом.

VISUAL Значение $VISUAL используется в первую очередь другими программами, отличными от оболочки Коrn. Однако при установке значения переменной VISUAL (в профиле или с клавиатуры) оболочка Коrn будет искать в ней подстроки vi, emacs или gmacs. Если одно из этих значений обнаруживается, оболочка Коrn устанавливает соответствующую опцию vi, emacs или gmacs, делая возможным редактирование команд. Это делается только для удобства. По-прежнему можно включать режим редактирования команд, используя команду set -о. Значения по умолчанию для VISUAL не существует.
ПРИМЕЧАНИЕ

Автор всегда включает в профиль регистрации следующее определение:

CDPATH=.:..:$HOME

Команда cd src сперва ищет каталог src в качестве подкаталога текущего каталога. Если эта попытка не удается команда cd ищет src в родительском каталоге. Если каталог src не существует ни в одном из этих мест, команда пытается перейти в каталог src в начальном каталоге. Автор считает что эффективное использование переменной CDPATH экономит массу времени при вводе.




Как и в случае оболочки Bourne, имена переменных в оболочке Коrn начинаются с буквы или символа подчеркивания и содержат произвольное число букв, символов подчеркивания и цифр. Имя переменной - символическое представление значения переменной, которое может быть изменено оператором присваивания, операторами set, read или select, в результате выполнения встроенной оболочки или других команд, самой оболочкой Коrn. Не существует никакого верхнего предела количества переменных, которые можно определять и использовать, но объем доступной для оболочки памяти устанавливает практический верхний предел (обычно достаточно высокий).

Значение имени переменной можно присвоить явно, используя присваивание в формате name=-value. Обратите внимание, что при этом перед именем name знак доллара ($) не ставится. Этот знак используется только при ссылке на значение переменной.

Значением переменной является строка, т.е. последовательность алфавитно-цифровых и специальных символов, произвольной длины. Оболочка Коrn обеспечивает ряд расширений, которые позволяют манипулировать значениями переменной арифметическими методами. Однако значение переменной по-прежнему хранится в виде строки.

Переменная сохраняет свое значение с момента инициализации (либо явно пользователем, либо неявно оболочкой Коrn) до тех пор, пока оно не будет изменено или пока оболочка не осуществит выход. Обратите внимание, что если переменная не помечена для экспорта, значение ее не передается вызываемым командам и сценариям оболочки. Переменная помечается для экспорта посредством встроенной команды оболочки typeset или псевдонима export. Или же, если опция allexport включена (например, посредством ввода команды set -о allexport), все созданные переменные экспортируются автоматически. Экспортированные переменные становятся составляющей частью среды всех вызываемых команд. Поскольку значения переменных сохраняются оболочкой в таблице распределения памяти, все переменные, не унаследованные оболочкой, утрачиваются при выходе из оболочки. Поэтому нельзя присвоить значение переменной оболочки в сценарии оболочки, выполняющем вызов оболочки, и ожидать, что значение сохранится после выхода из сценария; оболочка выполняет возврат к оболочке более высокого уровня. Иначе говоря, можно присваивать значения переменным и экспортировать переменные для передачи значений субоболочкам текущей оболочки, но нельзя передавать значения оболочкам более высокого уровня или сценариям оболочки.

Это ограничение использования переменных оболочки обычно не заметно при работе с клавиатуры. В общем случае оно возникает при решении задач, связанных с программированием. Однако при вызове оболочки непосредственно (путем ввода команды sh, ksh или CSH) или косвенно (при входе в среду оболочки из другой команды UNIX, например vi или pg) необходимо понимать, что любые изменения среды оболочки, в том числе установки переменных и псевдонимов, утрачиваются при возврате к уровню исходной оболочки путем выхода из субоболочки.


Ссылки на переменные


Оболочка Коrn замещает строки, которые начинаются со знака $ и за которым следует имя переменной, на значение переменной. В одной командной строке может вводиться любое количество ссылок. Соседние ссылки при замещении не вставляют в командную строку новые границы слов. Т.е., одно слово - имя команды, опция или аргумент - не делится на несколько при ссылке, даже если замещающее значение содержит пробелы, символы табуляции или иные символы-ограничители. Если необходимо, чтобы ограничители в замещающем тексте вызывали дальнейшее разбиение слов, можно использовать встроенную команду оболочки eval.

Для оболочки Коrn допустим следующий синтаксис использования ссылок:

name {name#pattern}

{name} {name##pattern}

{name[n]}{name%pattern}

{name[*]}{name%%pattern}

{name[@]} {#@}

{name:word} {#*}

{name-word} {#name}

{name=word} {#name[*]}

{name ?word}{#name[@]}

{name+word}


name

Выражение $nате замещается текущим значением имени пате переменной оболочки. Если значение для переменной не определено, знак доллара и имя переменной замещается нулевой строкой. Например:

$ today="January 13"

$ print Today is:$today.

Today is: January 13.

$ print Today is $tomorrow.

Today is:.


{name}

Выражение ${лате} замещается текущим значением переменной пате оболочки. Фигурные скобки помогают отличать ссылку на переменную от окружающего ее текста; они отменяются после подстановки. Фигурные скобки обязательно использовать для ссылки на параметр оболочки, номер которого превышает $9 (например, ${10} или ${12}), или для ссылки на переменную массива. Например,

$ Personl=John

$ Person2=Mike

$ print $Personl and $Person2

John and Mike

$ print $Personland$Person2

Personland: not defined

$ print ${Personl}and$Person2

JohnandMike


{name[n]}

Значением выражения является значение n-ого элемента массива пате, оно равно нулю, если п-ый элемент не инициализирован. Первым элементом переменной массива является ${name[0]}. Например,

$ set -A words hello goodbye

$ echo $words[l]

hello[l]

$ echo ${words[l]}

goodbye

$ echo $words

hello


{name[*]}

Значением выражения являются значения всех инициализированных элементов массива name, разделенные пробелами. Подстановка выполняется таким же образом, как и для выражения $*, с учетом внутренних пробелов и разбиения слов. Например,

$ set -A planets Mercury Venus Earth Mars

$ planet[9]рPluto

$ print $(planets[*]}

Mercury Venus Earth Mars Pluto


{name[@]}


Значением переменной являются значения всех инициализированных элементов массива name, разделенные пробелами. Если элементы массива содержат строки с внутренними пробелами и если выражение {пате[@}} заключено в кавычки, то число слов в замещающем выражении равно числу ненулевых элементов массива. В противном случае внутренние пробелы вызывают разбиение слов, и число замещающих слов будет больше числа ненулевых элементов массива. Например,

$ set -A committee "В Jones" "M Hartly" "С Rogers"

$ for word in ${ committee [@]}

> do

> print $word

> done

В

Jones

M

Hartly

С

Rogers

$ for word in "${committee [6]}"

> do

> print $word

> done

В Jones

M Hartly

С Rogers}


{name:-word}


Замещается значением переменной name, если оно состоит по меньшей мере из одного символа. В противном случае выражение замещается словом word. Обратите внимание, что слово word не должно содержать внутренних пробелов и символов табуляции, хотя и может содержать строки, заключенные в кавычки.

Комбинация двоеточия (:) с символами -, =, ? или + для обработки переменной, имеющей нулевое значение (т.е. строки нулевой длины), равносильна неустановленной переменной. В случае отсутствия двоеточия (:) переменная проверяется только на предмет того, установлена ли она. Например,

$ month*January

$ print This month is ${month:-unknown}

This month is January

$ print This year is ${year:-unknown}

This year is unknown


{name-word}


Выражение замещается значением name, если переменная имеет значение. В противном случае оно замещается словом word. Выражение ${name-word} можно использовать, чтобы игнорировать неустановленное или нулевое значение. Например,

$unset month

$ month=January

$ print This month is ${month-unknown}

This month is January

$ print This year is $(year- unknown}

This year is unknown

Это может показаться аналогичным предшествующему выражению {name:-word}, поэтому, чтобы внести ясность, давайте рассмотрим следующий пример:

$ unset month

$ month-" "

$ echo ${ month-unknown}

$echo ${month-unknown}

unknown


{name=word}

Выражение замещается значением имени пате, если переменная имеет значение. В противном случае слово word присваивается в качестве значения имени пате, а выражение замещается словом word. Выражение ${name=word) можно использовать для присвоения слова word переменной name, если переменная не установлена или ее значение равно нулю. Например,

$ print This month is $month.

This month is .

$ print This month is ${month-January}.

This month is January*

$ print This month is $month.

This month is January.


{name?word}


Выражение замещается значением переменной пате, если переменная имеет значение. В противном случае строка word выводится в качестве сообщения об ошибке. Неинициализированная переменная распознается в качестве ошибки и выполнение текущей командной строки останавливается. Если ошибка возникает при исполнении сценария оболочки, выполнение сценария оболочки прерывается. Выражение ${name?word) следует использовать для распознавания неинициализированной переменной или нулевого значения в качестве ошибки. Строка word в выражении может быть опущена; в этом случае отображается стандартное сообщение об ошибке. Например,

$ month""January

$ print This month is ${month?unknown}

This month is January

$ print This year is ${ year?unknown}

This year is ${ year?unknown}

ksh: year: unknown

$ print This year is ${ year?}

ksh: year: parameter null or not set


{name+word}


Выражение замещается значением строки word, если переменная name имеет значение. Если переменная не установлена, выражение замещается нулевой строкой. Т.е. если переменная name имеет значение, это значение временно обрабатывается так, как если бы им было word. Если name не имеет значения, выражение также не имеет значения. Выражение ${name+word) используется для того, чтобы обрабатывать нулевое значение так же, как неустановленное. Например,

$ month='January

$ print This month is ${month+unknown}

This month is unknown.

This year is ${ year+unknown}

This year is .


{name#pattern}


Значением выражения является значение name с удаленной левой частью, совпадающей с шаблоном. Распознается наиболее короткая часть, совпадающая с шаблоном. В качестве шаблона pattern можно указывать строку, содержащую любую последовательность символов, подстановки переменных и команд, а также шаблонов. Только первое совпадение с pattern удаляется. Например,

$ print $PWD /usr/home/valley $ print ${PWD#*/} usr/home/valley


{name# # pattern}


Значением выражения является значение пате с удаленной частью, содержащей все левее наиболее длинной строки, совпадающей с шаблоном pattern. Например,

$ print $PWD /usr/home/valley $ print ${PWD##*/} valley


{name%pattern}


Значением выражения является значение пате с удаленной правой частью, содержащей наиболее короткую строку, которая совпадает с шаблоном pattern. Например,

$ print $FNAME

s.myfile.c$ print ${PNAME%.*} s.myfile


{name%%pattern}


Значением вражения является значение name с удаленной правой частью, содержащей наиболее длинную строку, которая совпадает с шаблоном pattern. Например,

$ print $FNAME s.myfile.с

$ print ${FNAME%%.*} s

{#@}


Значением выражения является целое число аргументов, которые должны быть возвращены переменной $@.


{#*}


Целое число аргументов, которые должны быть возвращены переменной $*. Это аналогично $#


{#пате}


Значением выражения является длина строкового значения переменной name. Например,

$ print $FNAME s.myfile.c $ print ${#FNAME} 10


{#name[*]}


Значением выражения является число инициализированных элементов переменной массива name. Например,

$ set "A planets Mercury Venus Earth Mars $ print ${#planets[*]} 4


{#name[@]}


{#name[@] } - это то же, что {#name[*]}.

Обновлено: 12.03.2015