Уважаемые подписчики!
Это четвертый выпуск из серии, посвященной командному интерпретатору ksh.
Перевод, по сложившейся традиции, сделан по справочному руководству ОС Solaris 8.
Поскольку по правилам оформления рассылок в них не должно быть "висящих" гиперссылок href, не все перекрестные ссылки в выпусках, посвященных ksh, оформлены как гиперссылки. Когда перевод будет закончен, вы сможете скачать с сайта рассылки всю страницу в целом, со всеми необходимыми перекрестными и внешними ссылками.
Есть и еще одна новость. Я больше не участвую в "Проекте Русской Документации FreeBSD". Потому что не хочу. Материалы, которые делались для проекта, с сайта рассылки убраны и публиковаться в рассылке не будут.
После подстановки параметров и результатов выполнения команд, результаты подстановок просматриваются в поисках символов-разделителей полей (указанных в качестве значений IFS) и разбиваются на отдельные аргументы по найденным последовательностям таких символов. Явные пустые аргументы ("" или '') сохраняются. Неявные пустые аргументы (получающиеся в результате подстановки параметров, не имеющих значений) удаляются.
После подстановок каждое слово команды просматривается в поисках символов *, ? и [, если только не установлена опция -f. При выявлении одного из этих символов слово считается шаблоном. Такое слово заменяется лексикографически упорядоченным списком имен файлов, соответствующих шаблону. Если не найдено ни одного имени файла, соответствующего шаблону, слово остается без изменений. Когда шаблон используется для генерации имен файлов, символ точки (.) в начале имени файла или сразу после /, а также сам символ /, должны сопоставляться явно. Имя файла, начинающееся с точки, не будет соответствовать шаблону с точкой в круглых скобках; то есть, команда
ls .@(r*)
выдаст файл с именем .restore, а команда ls @(.r*) - нет. В остальных случаях сопоставления с образцом символы / и . специальным образом не обрабатываются.
Список_шаблонов - это последовательность из одного или более шаблонов, разделенных символами |. Составные шаблоны могут быть сформированы из одной или нескольких следующих конструкций:
Каждый из приведенных выше метасимволов (см. "Определения") имеет специальное значение для командного интерпретатора и вызывает завершение слова, если только не замаскирован. Символ может быть замаскирован (другими словами, можно лишить его специального смысла), если указать перед ним \. Пара \НОВАЯ_СТРОКА удаляется. Все символы между парой апострофов ('') замаскированы. Апостроф нельзя указывать в апострофах. В двойных кавычках ("") выполняется подстановка значений параметров и результатов выполнения команд, а символ \ маскирует \, `, " и $. Значения $* и $@ идентичны, когда не взяты в кавычки или когда используются как значения при присвоении параметра или как имя файла. Однако при использовании в качестве аргумента команды, $* эквивалентно "$1d$2d...", где d - первый символ переменной IFS, тогда как $@ эквивалентно $1 $2 .... В обратных апострофах (``), символ \ маскирует символы \, ' и $. Если обратные апострофы выявляются в двойных кавычках, то \ также маскирует символ ".
Зарезервированные слова или псевдонимы можно лишить специального значения, замаскировав любой символ зарезервированного слова. Распознавание имен функций или имен специальных команд, перечисленных ниже, нельзя изменить, маскируя их.
Возможность выполнять целочисленную арифметику обеспечивается специальной командой let. Вычисления выполняются с помощью "длинной" арифметики. Константы имеют вид [base#]n, где base - десятичное число от 2 до 36, представляющее основание системы счисления, а n - число в этой системе счисления. Если значение base не указано, предполагается значение 10 (десятичная система счисления).
В арифметических выражениях используется тот же синтаксис, приоритеты и ассоциативность операторов, что и в языке C. Поддерживаются все целочисленные операторы, кроме ++, -;, ?: и ,. На переменные в арифметическом выражении можно ссылаться по имени, не используя синтаксис подстановки значений параметров. При указании переменной, ее значение вычисляется как арифметическое выражение.
Внутреннее целочисленное представление переменной можно указать с помощью опции -i специальной команды typeset. Арифметическое вычисление выполняется над значением при каждом присвоении переменной с атрибутом -i. Если система счисления не указана, она определяется при первом присвоении значения переменной. Эта система счисления используется, когда происходит подстановка параметра.
Поскольку многие из арифметических операторов требуют маскировки, предлагается альтернативная форма команды let. Для любой команды, начинающейся с ((, все символы до соответствующей пары )) обрабатываются как замаскированное выражение. Точнее, ((...)) эквивалентно let "...".
При интерактивном использовании командный интерпретатор выдает приглашение, получающееся в результате подстановки значения параметра PS1 перед чтением команды. Если в любой момент вводится новая строка и для завершения команды надо еще вводить символы, выдается вторичное приглашение (т.е., значение PS2).
Условное выражение используется с составной командой [[ для проверки атрибутов файлов и для сравнения строк. Деление на слова и генерация имен файлов не выполняется для слов между [[ и ]]. Каждое выражение может быть построено из одного или нескольких следующих унарных или бинарных выражений:
В каждом из представленных выше выражений, если файл имеет вид /dev/fd/n, где n - целое число, то проверка выполняется для открытого файла с дескриптором n.
Составное выражение может быть построено из этих примитивов с помощью одной из следующих конструкций, перечисленных в порядке понижения приоритета.
Перед выполнением команды, ее входной и выходной потоки могут быть перенаправлены с помощью специальной нотации, обрабатываемой командным интерпретатором. Следующие конструкции могут появляться где угодно в простой команде, или идти перед или после любой команды, и они не передаются вызванной команде. Подстановка результатов выполнения команд и значений параметров выполняется перед использованием слова или цифры, с указанными ниже исключениями. Генерация имен файлов происходит только если шаблону соответствует один файл, а пробельные символы не интерпретируются.
Если одна из представленных выше конструкций предваряется цифрой, то используется файл с соответствующим дескриптором (вместо стандартных 0 или 1). Например:
... 2>&1
означает, что файл с дескриптором 2 должен открываться на запись как дубликат файла с дескриптором 1.
Порядок указания перенаправлений имеет значение. Командный интерпретатор выполняет каждое перенаправление с точки зрения связывания (дескриптор файла, файл) по состоянию на момент обработки. Например, конструкция:
... 1>fname 2>&1
сначала связывает дескриптор файла 1 с файлом fname. Затем он связывает дескриптор файла 2 с файлом, связанным с дескриптором файла 1 (т.е. с fname). Если поменять перенаправления местами, дескриптор файла 2 будет связан с терминалом (предполагается, что дескриптор файла 1 был связан с ним), а затем дескриптор файла 1 будет связан с файлом fname.
Если после команды указан &, и управление заданиями не действует, то по умолчанию входным потоком команды является пустой файл /dev/null. В противном случае, среда выполнения для команды содержит дескрипторы файлов вызывающего командного интерпретатора, с учетом перенаправлений потоков ввода-вывода.
Среда (см. environ(5)) - это список пар имя-значение, который передается выполняемой программе так же, как обычный список аргументов. Имена должны быть идентификаторами, а значения - текстовые строки.
Командный интерпретатор взаимодействует со средой несколькими способами. При вызове командный интерпретатор сканирует среду и создает переменную для каждого найденного имени, присваивая ей соответствующее значение и экспортируя ее. Выполняемые команды наследуют среду. Если пользователь изменяет значения этих переменных или создает новые с помощью команд export или typeset -x, они становятся частью среды. Среда, которую "видит" любая выполняемая команда, таким образом, состоит из всех пар имя-значение, изначально унаследованных командным интерпретатором, значения которых могли быть изменены в текущем интерпретаторе, а также любых добавлений, сделанных с помощью команд export или typeset -x.
Среду для любой простой команды или функции можно дополнить, предварив ее одним или несколькими присвоениями значений переменным. Присвоение значения переменной - это слово вида идентификатор=значение. Таким образом, строки:
TERM=450 cmd args
и
(export TERM; TERM=450; cmd args)
эквиваленты (с точки зрения выполнения cmd, за исключением специальных команд, перечисленных ниже, перед которыми указана звездочка).
Если установлен флаг -k, все аргументы-присвоения значений переменным помещаются в среду, даже если они указаны после имени команды. Следующие команды сначала выдают a=b c, а затем - c:
echo a=b c set -k echo a=b c
Эта возможность предназначена для использования со сценариями, написанными для ранних версий командного интерпретатора, и ее использование в новых сценариях настоятельно не рекомендуется. Вероятно, однажды она исчезнет.
Copyleft (no c) 2005 В. Кравчук, OpenXS Initiative, перевод на русский язык
Следующая часть перевода страницы справочного руководства ksh(1).
С наилучшими пожеланиями,
В.К.
|
|
Украинская Баннерная Сеть |