Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Страницы справочного руководства ОС UNIX на русском : man ksh(1), часть вторая


Информационный Канал Subscribe.Ru

Выпуск 143

man ksh(1), часть вторая

Уважаемые подписчики!

Это второй выпуск из серии, посвященной командному интерпретатору ksh. Перевод, по сложившейся традиции, сделан по справочному руководству ОС Solaris 8.

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


Замена тильды

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

Переносимое регистрационное имя не может содержать символы, не входящие в набор, представленный в описании переменной среды LOGNAME. Если регистрационное имя - пустое (т.е. тильда-префикс содержит только тильду), тильда-префикс будет заменен значением переменной HOME. Если переменная HOME не определена, результаты не регламентируются. В противном случае, тильда-префикс заменяется полным именем начального каталога соответствующего пользователя, регистрационное имя которого получается с помощью функции getpwnam. Если система не распознает регистрационное имя, результаты не определены.

Замена тильды обычно происходит только в начале слов, но есть также исключение, основанное на исторической практике. Здесь:

 
PATH=/posix/bin:~dgk/bin 

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

 
PATH=$(printf %s ~karels/bin : ~bostic/bin) 
for Dir in ~maart/bin ~srb/bin . 
do 
PATH=${PATH:+$PATH:}$Dir 
done 

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

Учтите, что выражения в операндах, такие как:

 
make -k mumble LIBDIR=~chet/lib 

не рассматриваются в качестве присвоений переменным командного интерпретатора и замена тильды не выполняется (если только каманда сама этого не делает; make - не делает).

Специальная последовательность $~ была выделена для будущих реализаций, чтобы можно было выполнить замену тильды в любом слове.

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

 
\~hlj/   ~h\lj/   ~"hlj"/   ~hlj\/   ~hlj/ 

Результаты указания тильды с неизвестным регистрационным именем не определены, поскольку конструкции KornShell ~+ и ~- используются, но, в общем случае, передача некорректного регистрационного имени с тильдой - это ошибка. Последствия не установленной переменной HOME не определяются, поскольку некоторые ранее использовавшиеся командные интерпретаторы считают это ошибкой.

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

Стандартный выходной поток команды, взятой в круглые скобки, перед которыми идет символ доллара (т.е. $(команда)), или окруженной парой символов обратного апострофа (``), может быть использован как слово или часть слова; завершающие символы новой строки при этом удаляются. Во второй (устаревшей) форме, строка между апострофами обрабатывается в поисках специальных маскирующих символов перед выполнением команды. (См. раздел "Маскировка" ниже.) Подстановку результатов выполнения команды $(cat файл) можно заменить эквивалентной, но быстрее выполняющейся конструкцией $(<файл). Подстановка результатов выполнения большинства специальных команд, не выполняющих перенаправления ввода-вывода, производится без создания отдельного процесса.

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

 
$(команда) 

или (версия в обратных апострофах):

 
`команда` 

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

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

 
$`\ 

(символ доллара, обратный апостроф, обратная косая). Поиск соответствующего обратного апострофа завершается успешно при нахождении первого же символа обратного апострофа, перед которым не идет обратная косая; в ходе этого поиска, если незамаскированный обратный апостроф обнаруживается в комментарии, в конструкции "документ здесь", во встроенной подстановке результатов выполнения команды в виде $(команда) или в строке в кавычках, результаты непредсказуемы. Строка в одиночных или двойных кавычках, начинающаяся, но не заканчивающаяся последовательностью `...`, приводит к непредсказуемым результатам.

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

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

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

Подстановка результатов выполнения команды может быть вложенной. Чтобы указать вложение в форме с обратными апострофами, приложение должно предварять внутренние обратные апострофы обратными косыми; например:

 
`\`команда\`` 

Форма $() подстановки результатов выполнения команды решает проблему несогласованного поведения при использовании обратных апострофов. Например:

Команда Результат
echo '\$x' \$x
echo `echo '\$x'` $x
echo $(echo '\$x') \$x

Кроме того, синтаксис с обратными апострофами имеет исторические ограниченмия на содерржание встроенной команды. Тогда как новая форма $() может обрабатывать допустимый вложенный сценарий любого вида, форма с обатными апострофами не может обрабатывать некоторые вполне допустимые сценарии, включающие обратные апострофы. Например, эти во всех отношениях допустимые вложенные сценарии не работают в левом столбце, но работают в правом:

 
echo `     | echo $( 
cat <<eof    | cat <<eof 
"документ здесь" с `      | "документ здесь" с ) 
eof     | eof 
`     | ) 
 
echo `     | echo $( 
echo abc # комментарий с `| echo abc # комментарий с ) 
`     | ) 
 
echo `     | echo $( 
echo '`'    | echo ')' 
`     | ) 

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

Если подстановка результатов выполнения команды состоит из единственного вложенного вызова командного интерпретатора, например:

 
$( (команда) ) 

переносимое приложение должно разделять $( и ( на две лексемы (т.е. разделять их пробельным символом). Это требуется во избежание любой путаницы с заменой арифметических выражений.

Замена арифметических выражений

Арифметическое выражение, взятое в двойные круглые скобки, перед которыми идет знак доллара ( $((арифметическое_выражение)) ) заменяется значением указанного арифметического выражения. Замена арифметических выражений обеспечивает механизм вычисления и подстановки значений арифметических выражений. При этом используется следующий формат:

 
$((выражение)) 

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

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

  • Поддерживается только целочисленная арифметика.
  • Оператор sizeof(), а также префиксные и постфиксные операторы ++ и -- не поддерживаются.
  • Операторы выбора, итерации и перехода не поддерживаются.

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

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

 
# повторить команду 100 раз 
x=100 
while [ $x -gt 0 ] 
do 
  команда 
  x=$(($x-1)) 
done 

Подстановка процессов

Эта возможность доступна в SunOS и в версиях ОС UNIX, поддерживающих каталог /dev/fd для открытых файлов. Каждый аргумент команды вида <(список) или >(список) будет запускать процесс список, асинхронно подключенный к некоторому файлу в каталоге /dev/fd. Имя этого файла станет аргументом команды. Если выбрана форма с >, то запись в этот файл будет формировать входные данные для списка. Если же использована форма <, то файл, переданный в качестве аргумента, будет содержать результат процесса список. Например,

 
paste <(cut -f1 file1) <(cut -f3 file2)  |  tee >(process1) >(process2) 

вырезает поля 1 и 3 из файлов file1 и file2, соответственно, соединяет результаты и посылает их процессам process1 и process2, а также выдает в стандартный выходной поток. Учтите, что файл, передаваемый как аргумент команды, - это UNIX pipe(2), так что, программы, предполагающие выполнение функции lseek(2) над файлом, не будут работать.

Подстановка параметра

Параметр - это идентификатор, одна или несколько цифр или любой из символов *, @, #, ?, -, $ и !. Переменная (параметр, представленный идентификатором) имеет значение и ноль или более атрибутов. Переменным можно присваивать значения и задавать атрибуты с помощью специальной команды typeset. Атрибуты, поддерживаемые командным интерпретатором, описаны позже, при рассмотрении специальной команды typeset. При экспортировании переменных значения и атрибуты передаются в среду.

Командный интерпретатор поддерживает одномеррные массивы. К элементам переменной-массива обращаются по индексу. Индекс заджается как [, после которой идет арифметическое выражение (см. раздел "Вычисление арифметических выражений" ниже), а затем - ]. Для присвоения значений массиву используется set -A имя значение .... Значения всех индексов должны быть в диапазоне от 0 до 4095. Массивы не обязательно объявлять. Любая ссылка на перременную с допустимым индексом - законно, и массив будет создан при необходимости. Обращение к массиву без индекса эквивалентно обращению к элементу 0. Если использован идентификатор массива с индексом * или @, то подставляется значение для каждого из элементов (через символ-разделитель полей).

Значение переменной можно присвоить, написав:

 
имя=значение [ имя=значение ] ... 

Если для имени установлен атрибут целочисленности, -i, значение подлежит арнифметическому вычислению, как описано ниже.

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

Copyleft (no c) 2005 В. Кравчук, OpenXS Initiative, перевод на русский язык


В следующем выпуске

Следующая часть перевода страницы справочного руководства ksh(1).

С наилучшими пожеланиями,

  В.К.


http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.othos.unixman
Отписаться

В избранное