Оболочка 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 дублируют свойства оболочки С, но с другим синтаксисом. Это сделано умышленно. Хотя оболочка С предоставляет множество необходимых свойств, ее общий синтаксис несовместим с оболочкой 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 состоит в том, чтобы использовать расширения и специальные свойства, которые не применяются в оболочке 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. Расширенные выражения шаблона.

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

Читатели, должно быть, заметили, что выражения *(шаблон[| шаблон]...) и +(шаблон[ [шаблон]...) будут соответствовать любой комбинации указанных шаблонов Это может быть как удобно, так и опасно. В сомнительных случаях используйте команду 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.

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

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

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

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

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

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

Опция -А может использоваться в командной строке 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с точнее -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.

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

Редактирование команд, бесспорно, наиболее важное расширение оболочки 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.

ПРИМЕЧАНИЕ

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

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

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

Большинству команд 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.

ПРИМЕЧАНИЕ

Последовательность 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.

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

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

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

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

.

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

ПРИМЕЧАНИЕ

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

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[*]}.

Next