Особенности работы оболочки bash.: ВОЗМОЖНОСТИ ОБОЛОЧКИ КОРНА ksh

Вперед Назад Содержание

3. ВОЗМОЖНОСТИ ОБОЛОЧКИ КОРНА ksh

В этой главе описаны возможности, первоначально появившиеся в оболочке Корна (ksh). В некоторых случаях стандарт Posix 1003.2 позаимствовал эти команды и переменные из оболочки Корна. Bash обеспечивает эти возможности, используя стандарт Posix как руководство.

3.1 Конструкции оболочки Корна

Bash включает конструкцию select оболочки Корна. Эта конструкция позволяет облегчать генерацию меню. Она имеет почти тот же синтаксис, что и команда for.

Cинтаксис команды select:

select имя [in список_слов] do команды; done
Cписок слов, следующих за in, расширяется, генерируя список элементов. Набор расширенных слов, каждому из которых предшествует число, выводится в стандартный поток ошибки. Если "in список_слов" пропущено, выводятся позиционные параметры, затем возникает приглашение PS3 и читается строка со стандартного ввода. Если строка состоит из числа, соответствующего одному из выведенных слов, то значение "имени" присваивается этому слову. Если строка пуста, то опять выводятся слова и приглашение. Если читается EOF, то выполняется команда select. Любое другое прочитанное значение вызывает присваивание "имени" нуля. Считанная строка хранится в переменной REPLY.

"Команды" выполняются после каждого выбора до команды break или return. Здесь команда select считается выполненной.

3.2 Встроенные команды оболочки Корна

В этом разделе описаны встроенные команды Bash, взятые из ksh.

fc

fc [-e имя_редактора] [-nlr] [первая] [последняя]
fc -s [pat=rep] [команда]
Команда фиксации. В первой форме ряд команд от первой до последней выбирается из списка истории. И первая, и последняя могут быть указаны как строка (чтобы обнаружить самую последнюю команду, начинающуюся с этой строки) или как число (индекс в списке истории, где отрицательное число используется как смещение числа текущей команды). Если последняя команда не указана, ей присваивается первая. Если первая не указана, ей присваивается предыдущая команда для редактирования и -16 для внесения в список. Если дан флаг -l, команды выносятся в виде списка на стандартный вывод. Флаг -n хранит номера команд при составлении списка. Флаг -r меняет порядок списка на обратный. Иначе редактор, заданный в имя_редактора, вызывается файлом, содержащим эти команды. Если имя_редактора не дано, используется значение следующего расширения переменной: ${FCEDIT:-${EDITOR-vi}}. Если задано значение FCEDIT, используется оно, если значение EDITOR оно, если не задано ни то, ни другое, используется vi. Редактирование завершено, когда команды редактирования отображены на экране и выполнены.

Во второй форме "команда" перевыполняется после каждого случая pat, - в некоторых командах он заменен на rep.

Полезно использовать псевдоним r='fc -s' с командой fc, таким образом при наборе r cc выполняется последняя команда, начинающаяся с сс, и при наборе r перевыполняется последняя команда (см. раздел 3.4. "Псевдонимы").

let

встроенная команда let позволяет выполнять арифметические операции с переменными оболочки. Подробнее см. раздел 4.7.3. "Арифметические встроенные функции".

typeset

Команда typеset обеспечивает согласованность с оболочкой Корна, однако она сделана как рудимент команды declare (см. раздел 4.4 "Встроенные команды Bash").

3.3 Переменные оболочки Корна

REPLY

Переменная по умолчанию для встроенной команды read.

RANDOM

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

SECONDS

Эта переменная зависит от количества секунд, прошедших со старта оболочки. При присваивании переменной значения это количество прибавляется к приписанному значению, и расширенное значение = приписанное значение + число секунд с момента присваивания.

PS3

Значение этой переменной используется как приглашение для команды select.

PS4

Это приглашение, выводимое перед высвечиванием командной строки, когда установлена опция -x (см. раздел 4.5).

PWD

Текущий рабочий каталог, установленный командой cd.

OLDPWD

Предыдущий рабочий каталог, установленный командой cd.

TMOUT

Если заданное значение больше 0, оно рассматривается как количество секунд ожидания ввода после высвечивания первичного приглашения. Если ввод по истечении этого времени не произошел, Bash завершает работу.

3.4 Псевдонимы

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

Для первого слова каждой команды, если нет кавычек, проверяется, имеет ли оно псевдоним. Если имеет, то оно заменяется на текст псевдонима. Имя псевдонима и текст замены могут содержать любые допустимые символы ввода оболочки, включающие метасимволы оболочки, за тем исключением, что имя псевдонима не может содержать =. Первое слово текста замены проверяется на наличие псевдонима, но слово, идентичное псевдониму, не расширяется вторично. Это значит, что можно, например, расширить псевдоним ls до "ls -F", и Bash не будет пытаться рекурсивно расширить текст замены. Если значение последнего символа псевдонима пробел или tab, то слова команды, следующей за псевдонимом, также проверяются на расширение псевдонима.

Псевдонимы создаются и заносятся в список с помощью команды alias, и уничтожаются с помощью команды unalias.

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

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

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

Следует заметить, что почти во всех случаях псевдонимы вытесняются функциями оболочки.

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

alias

alias [имя[=значение]...]
Без аргументов - выводит список псевдонимов на стандартное устройство вывода. Если есть аргументы, псевдоним определяется для каждого имени, чье значение дано. Если значение не дано, выводятся имя и значение псевдонима.

unalias

unalias [-a] [имя...]
Удаляет имя из списка псевдонимов. При использовании -а удаляются все псевдонимы.


Вперед Назад Содержание