[ Страница назад | Страница вперед | Содержание | Индекс | Домой | Юридическая информация | Поиск ]

Руководство пользователя: Операционная система и устройства


Расширенная оболочка Korn (ksh93)

Кроме стандартной оболочки Korn (/usr/bin/ksh), AIX содержит ее расширенную версию /usr/bin/ksh93. Расширенная версия совместима сверху со стандартной оболочкой, но содержит несколько дополнительных функций, отсутствующих в /usr/bin/ksh. В следующей таблице перечислены все новые функции.

Функции ksh93

В оболочке /usr/bin/ksh93 есть следующие функции:


Арифметические расширения

Вы можете вызывать функции libm (математические функции, реализованные в языке программирования C) в стандартных арифметических выражениях, например $ value=$((sqrt(9))). В новой оболочке реализовано больше операторов, включая унарные конструкции +, ++, -- и ?: (например, "x ? y : z"), а также оператор , (запятая). Поддерживаются арифметические основания, не превышающие 64. Также поддерживаются вычисления с плавающей точкой. Для указания количества значащих разрядов можно ввести "typeset -E", а для указания количества десятичных позиций в вещественной переменной - "typeset -F". Переменная SECONDS теперь округляет число секунд сверху до ближайшей сотни, а не до целого числа секунд.

Составные переменные

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

$ myvar=( x=1 y=2 ) 
$ print "${myvar.x}" 
1
Присвоения составных переменных

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

$ numbers=( zero one two three ) 
$ print ${numbers[0]} ${numbers[3]} 
zero three   
Именованные массивы Именованный массив - это массив, в котором в качестве индексов применяются строковые значения.

Для работы с именованными массивами применяется команда typeset с флагом -A. Например:

$ typeset -A teammates 
$ teammates=( [john]=smith [mary]=jones ) 
$ print ${teammates[mary]} 
jones
Ссылки на переменные

С помощью команды typeset с флагом -n можно присвоить одной переменной значение ссылки на другую. В этом случае изменение значения одной переменной немедленно вызовет изменение значения другой. Например:

$ greeting="hello"
$ typeset -n welcome=greeting     # создание ссылки
$ welcome="Привет!"     # переопределение значения
$ print $greeting
Привет!   
Развертывание параметров

В оболочке ksh93 применяются следующие конструкции развертывания параметров:

  • ${!переменная} - имя переменной.
  • ${!переменная[@]} - имена индексов массива переменная.
  • ${параметр:смещение} подстрока параметра, начиная со смещения.
  • ${параметр:смещение:число} подстрока параметра, начиная со смещения, заданное число символов.
  • ${@:смещение} задает все позиционные параметры, начиная со смещения.
  • ${@:смещение:число} задает требуемое число позиционных параметров, начиная со смещения.
  • ${параметр/шаблон/замена} заменяет в параметре первое вхождение шаблона на значение замены.
  • ${параметр//шаблон/замена} заменяет в параметре все вхождения шаблона на значение замены.
  • ${параметр/#шаблон/замена} - если параметр начинается с шаблона, то параметр заменяется на значение замены.
  • ${параметр/%шаблон/замена} - если параметр заканчивается на шаблон, то параметр заменяется на значение замены.

Дисциплинарные функции

Дисциплинарная функция - это функция, связанная с конкретной переменной. Эта функция будет вызываться каждый раз при обращении, присвоении или сбросе переменной. Функции задаются в виде переменная.функция, где переменная - это имя переменной, а функция - дисциплинарная функция. Есть три предопределенных дисциплинарных функции: get, set и unset.

  • Функция переменная.get вызывается каждый раз при обращении к переменной. Если этой функцией задается специальная переменная .sh.value, то значение переменной изменяется на это значение. Например:
    $ function time.get 
    > { 
    >     .sh.value=$(date +%r) 
    > } 
    $ print $time 
    09:15:58 AM 
    $ print $time    # изменится через несколько секунд
    09:16:04 AM
    
  • Функция переменная.set вызывается каждый раз при присвоении переменной. Переменная .sh.value становится равной присваиваемому значению. Значение переменной будет равно значению .sh.value после выполнения функции. Например, команда:
    $ function adder.set 
    > { 
    >   let .sh.value="
    $ {.sh.value} + 1" 
    > } 
    $ adder=0 
    $ echo $adder 
    1 
    $ adder=$adder 
    $ echo $adder 
    2  
    
  • Функция переменная.unset вызывается каждый раз при сбросе переменной. Переменная сбрасывается только в том случае, если эта операция явно выполняется функцией; в противном случае, она сохраняет свое значение.

Во всех дисциплинарных функциях специальная переменная .sh.name равна имени переменной, а .sh.subscript - ее индексу, если он есть.

Среда выполнения функции

Функции, объявленные в формате function функция, выполняются в отдельной среде. Функции, объявленные в формате функция(), выполняются в той же среде, что и родительская оболочка.

Переменные

Переменные, начинающиеся с .sh., зарезервированы оболочкой и имеют специальное значение. Переменные .sh.name, .sh.value и .sh.subscript описаны в разделе Дисциплинарные функции. Кроме того, переменная .sh.version содержит значение версии оболочки.

Примечание: Переменная ERRNO более не используется.

Значения, возвращаемые командами

Команды оболочки ksh93 возвращают следующие значения:

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

Правила поиска в PATH

Сначала выполняется поиск специальных встроенных команд, затем всех остальных функций (включая находящиеся в каталогах FPATH), а затем всех встроенных функций. Ранее встроенные функции просматривались до обычных функций, а функции в FPATH просматривались только после завершения просмотра каталогов из PATH.

Хронология оболочки

Команда hist позволяет просматривать список выполнявшихся ранее команд и редактировать выбранные команды. В оболочке ksh применялась команда fc. Теперь команда fc - это псевдоним команды hist. Переменная HISTCMD увеличивается на единицу каждый раз при вызове команды в оболочке, а переменная HISTEDIT указывает, какой редактор нужно применять при вызове команды hist.

Встроенные команды
  • Была добавлена встроенная команда builtin. Команда builtin показывает список всех встроенных команд.
  • Команда printf была добавлена в качестве встроенной. Она работает примерно так же, как и процедура printf() из библиотеки C. См. описание команды printf в справочнике man.
  • Была добавлена встроенная команда disown. Команда disown не позволяет оболочке отправлять SIGHUP указанной команде.
  • Команда getconf была добавлена в качестве встроенной. Она работает точно так же, как и отдельная команда /usr/bin/getconf. См. описание команды getconf в справочнике man.
  • У встроенной команды read есть следующие флаги:
    • read -d {символ} позволяет указать символьный разделитель вместо встроенного значения новой строки.
    • read -t {секунды} позволяет задать число секунд, по истечении которых команда read будет завершена по тайм-ауту. Если команда read завершена по тайм-ауту, она возвратит значение FALSE.
  • У встроенной команды exec есть следующие флаги:
    • exec -a {имя} { команда} указывает, что аргумент 0 команды следует заменить на имя.
    • exec -c {команда} указывает команде exec, что перед вызовом команды нужно очистить среду выполнения.
  • У встроенной команды kill есть следующие флаги:
    • kill -n {номер} применяется для указания номера сигнала, который нужно отправить процессу, а kill -s {имя} применяется для указания имени сигнала.
    • kill -l без аргументов показывает список имен сигналов, без их номеров.
  • У встроенной команды whence есть следующие флаги:
    • Флаг -a показывает все совпадения, а не только первое.
    • Флаг -f указывает команде whence, что функции искать не надо.
  • Для команд print и echo была добавлена esc-последовательность. Клавишу Esc (Escape) можно представить с помощью \E.
  • Все обычные встроенные команды распознают флаг -?, показывающий формат вызова команды.


[ Страница назад | Страница вперед | Содержание | Индекс | Домой | Юридическая информация | Поиск ]