Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Интернет: маркетинг, реклама, торговля" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Страницы справочного руководства ОС UNIX на русском : man ksh(1), часть четвертая
Информационный Канал Subscribe.Ru |
Выпуск 145
man ksh(1), часть четвертая
Уважаемые подписчики!
Это четвертый выпуск из серии, посвященной командному интерпретатору 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).
Условные выражения
Условное выражение используется с составной командой [[ для проверки атрибутов файлов и для сравнения строк. Деление на слова и генерация имен файлов не выполняется для слов между [[ и ]]. Каждое выражение может быть построено из одного или нескольких следующих унарных или бинарных выражений:
- -a файл
-
Истинно, если файл существует.
- -b файл
-
Истинно, если файл существует и является специальным блочным устройством.
- -c файл
-
Истинно, если файл существует и является специальным символьным устройством.
- -d файл
-
Истинно, если файл существует и является каталогом.
- -e файл
-
Истинно, если файл существует.
- -f файл
-
Истинно, если файл существует и является обычным файлом.
- -g файл
-
Истинно, если файл существует и у него установлен бит setgid.
- -k файл
-
Истинно, если файл существует и у него установлен бит sticky.
- -n строка
-
Истинно, если длина строки не равна нулю.
- -o опция
-
Истинно, если указанная опция включена.
- -p файл
-
Истинно, если файл существует и является специальным файлом fifo
или каналом (pipe).
- -r файл
-
Истинно, если файл существует и доступен на чтение текущему процессу.
- -s файл
-
Истинно, если файл существует и его размер больше нуля.
- -t дескриптор_файла
-
Истинно, если файл с указанным числовым дескриптором_файла открыт и связан
с терминальным устройством.
- -u файл
-
Истинно, если файл существует и у него установлен бит setuid.
- -w файл
-
Истинно, если файл существует и доступен текущему процессу на запись.
- -x файл
-
Истинно, если файл существует и доступен текущему процессу на выполнение.
Если файл существует и является каталогом, проверяется, имеет ли
текущий процесс право искать в каталоге.
- -z строка
-
Истинно, если длина строки равна нулю.
- -L файл
-
Истинно, если файл существует и является символьной связью.
- -O файл
-
Истинно, если файл существует и принадлежит пользователю, идентификатор
которого совпадает с эффективным идентификатором пользователя этого процесса.
- -G файл
-
Истинно, если файл существует и принадлежит группе, соответствующей
эффективному идентификатору группы этого процесса.
- -S файл
-
Истинно, если файл существует и является сокетом.
- файл1 -nt файл2
-
Истинно, если файл1 существует и новее, чем файл2.
- файл1 -ot файл2
-
Истинно, если файл1 существует и старше, чем файл2.
- файл1 -ef файл2
-
Истинно, если файл1 и файл2 существуют и ссылаются на
один и тот же файл.
- строка
-
Истинно, если указанная строка не является пустой.
- строка = шаблон
-
Истинно, если строка соответствует шаблону.
- строка != шаблон
-
Истинно, если строка не соответствует шаблону.
- строка1 = строка2
-
Истинно, если строки строка1 и строка2 идентичны.
- строка1 != строка2
-
Истинно, если строки строка1 и строка2 не идентичны.
- строка1 < строка2
-
Истинно, если строка1 идет до строки2 при сравнении
с учетом локали, установленной для переменной LC_COLLATE.
- строка1 > строка2
-
Истинно, если строка1 идет после строки2 при сравнении
с учетом локали, установленной для переменной LC_COLLATE.
- выражение1 -eq выражение2
-
Истинно, если выражение1 равно выражению2.
- выражение1 -ne выражение2
-
Истинно, если выражение1 не равно выражению2.
- выражение1 -lt выражение2
-
Истинно, если выражение1 меньше чем выражение2.
- выражение1 -gt выражение2
-
Истинно, если выражение1 больше чем выражение2.
- выражение1 -le выражение2
-
Истинно, если выражение1 меньше или равно выражению2.
- выражение1 -ge выражение2
- Истинно, если выражение1 больше или равно выражению2.
В каждом из представленных выше выражений, если файл имеет вид /dev/fd/n, где n - целое число, то проверка выполняется для открытого файла с дескриптором n.
Составное выражение может быть построено из этих примитивов с помощью одной из следующих конструкций, перечисленных в порядке понижения приоритета.
- (выражение)
-
Истинно, если выражение истинно. Используется для группировки
выражений.
- ! выражение
-
Истинно, если выражение ложно.
- выражение1 && выражение2
-
Истинно, если и выражение1, и выражение2 истинны.
- выражение1 || выражение2
- Истинно, если либо выражение1, либо выражение2 истинно.
Ввод-вывод
Перед выполнением команды, ее входной и выходной потоки могут быть перенаправлены с помощью специальной нотации, обрабатываемой командным интерпретатором. Следующие конструкции могут появляться где угодно в простой команде, или идти перед или после любой команды, и они не передаются вызванной команде. Подстановка результатов выполнения команд и значений параметров выполняется перед использованием слова или цифры, с указанными ниже исключениями. Генерация имен файлов происходит только если шаблону соответствует один файл, а пробельные символы не интерпретируются.
- <слово
-
Использовать файл слово как стандартный входной поток (файл
с дескриптором 0).
- >слово
-
Использовать файл слово как стандартный выходной поток (файл
с дескриптором 1). Если файл не существует, он создается. Если файл
существует и включена опция noclobber, выдается сообщение об ошибке; иначе
файл усекается до нулевой длины.
- >|слово
-
То же, что и >, но опция noclobber игнорируется.
- >>слово
-
Использовать файл слово как стандартный выходной поток. Если файл
существует, выходной поток добавляется в него (в конце файла); иначе файл создается.
- <>слово
-
Открыть файл слово на чтение и запись как стандартный входной поток.
- << [-]слово
-
Входной поток интерпретатора читается вплоть до строки, совпадающей со
словом или до конца файла. В слове не выполняется
подстановка параметров, подстановка результатов выполнения команд или генерация
имен файлов. Получившийся в результате документ, который называют "документ-здесь"
(here-document), становится стандартным входным потоком команды. Если любой символ
в слове замаскирован, то символы в документе никак не
интерпретируются; иначе выполняется подстановка значений параметров и результатов
выполнения команд, символы \новая_строка игнорируются, а символ \
обязательно использовать для маскировки символов \, $, ` и
первого символа слова. Если символ - добавляется к <<, то все
начальные табуляции удаляются из слова и из документа.
- <&цифра
-
Стандартный входной поток дублируется из файла с дескриптором цифра
(см. dup(2)). Аналогично - для стандартного выходного потока, с помощью
конструкции >&цифра.
- <&-
-
Стандартный входной поток закрывается. Аналогично - для стандартного
выходного потока, с помощью конструкции >&-.
- <&p
-
Входной поток сопроцесса переносится на стандартный входной поток.
- >&p
- Выходной поток сопроцесса переносится в стандартный выходной поток.
Если одна из представленных выше конструкций предваряется цифрой, то используется файл с соответствующим дескриптором (вместо стандартных 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).
С наилучшими пожеланиями,
В.К.
http://subscribe.ru/
http://subscribe.ru/feedback/ |
Подписан адрес: Код этой рассылки: comp.soft.othos.unixman |
Отписаться |
В избранное | ||