SH(1) SH(1) НАЗВАНИЕ sh - стандартный интерпретатор командного языка shell СИНТАКСИС |sh [-a] [-c цепочка_символов] [-e] [-f] [-h] [-i] [-k] [-n] [-r] [-s] [ | [-x] [аргумент ...] ОПИСАНИЕ Команда sh - запуск интерпретатора командного языка shell, способного выполнять команды, введенные с терми- нала или хранящиеся в файле. О трактовке аргументов sh см. ниже Запуск shell'а. Определения Под пробелом в дальнейшем понимается не только собст- венно пробел, но также и символ табуляции. Имя - это последовательность букв, цифр, символов под- черкивания, начинающаяся с буквы или подчеркивания. Параметр - это имя, цифра или любой из символов *, @, #, ?, -, $, !. Команды Простая команда - это последовательность слов, разде- ленных пробелами. Первое слово определяет имя команды, которая будет выполняться; оставшиеся слова, за исклю- чением описанных ниже случаев, передаются команде в ка- честве аргументов. Имя команды передается как аргумент 0 [см. exec(2)]. Значение простой команды - это ее код завершения, если она выполнилась нормально, или (128 + код ошибки), если ненормально [см. также signal(2)]. Конвейер - это последовательность команд, разделенных знаком |. При этом стандартный вывод всех команд, кроме последней, направляется посредством системного вызова pipe(2) на стандартный ввод следующей команды конвей- ера. Каждая команда выполняется как самостоятельный процесс; shell ожидает завершения последней команды. Ее код завершения становится кодом завершения конвейера. Список - это последовательность одного или нескольких конвейеров, разделенных символами ;, &, && или || и быть может заканчивающаяся символом ; или &. Из четырех указанных операций ; и & имеют равные приоритеты, мень- шие, чем у && и ||. Приоритеты последних также равны между собой. Символ ; означает, что конвейеры будут вы- полняться последовательно, а & - параллельно (то есть shell не ожидает завершения конвейера). Операция && (||) означает, что список, следующий за ней, будет вы- полняться лишь в том случае, если код завершения преды дущего конвейера нулевой (ненулевой). В списке в честве разделителя конвейеров вместо символа ; можно использовать перевод строки. Команда - это либо простая команда, либо одна из управ- ляющих конструкций. Кодом завершения команды является код завершения последней выполненной простой команды. Управляющие конструкции: |for имя [in слово ...] | do список |done При каждой итерации переменная имя принимает сле- дующее значение из набора in слово .... Если конструкция in слово ... опущена, то список выпол- няется для каждого позиционного параметра (см. ни- же Подстановка параметров). |case слово in | [шаблон [| шаблон] ...) список ;;] | ... |esac Выполняется список, соответствующий первому шабло ну, успешно сопоставленному со словом. Формат шаб лона тот же, что и используемый для генерации имен файлов (см. ниже Генерация имен файлов), за исклю- чением того, что в шаблоне не обязательно явно указывать символ /, начальную точку и их комбина цию: элемент шаблона * может успешно сопоставлять- ся и с ними. |if список_1 | then список_2 | [elif список_3 | then список_4] | ... | [else список_5] |fi Выполняется список_1 и если код его завершения 0, то выполняется список_2, иначе - список_3 и если код его завершения 0, то выполняется список_4 и т.д. Если же коды завершения всех списков, исполь- зованных в качестве условий, оказались ненулевыми, выполняется else-часть (список_5). Если else-часть отсутствует, и ни одна then-часть не выполнялась, возвращается нулевой код завершения. |while список_1 | do список_2 |done Пока код завершения последней команды списка_1 есть 0, выполняются команды списка_2. При замене служебного слова while на until условие продолже ния цикла меняется на противоположное. Если коман- ды из списка_2 не выполнялись вообще, код заверше- ния устанавливается равным нулю. (список) Группировка команд для выполнения их порожденным shell'ом. {список;} Группировка команд для выполнения их текущим shell'ом. |имя ( ) | {список;} Определение функции с заданным именем. Тело функ- ции - список, заключенный между { и }. О выполне- нии функций см. ниже Выполнение. Следующие слова трактуются как ключевые, если они явля- ются первым словом команды и не экранированы: |if then elif else fi |case in esac |for while until do done |{ } Комментарии Слово, начинающееся символом #, и все последующие слова вплоть до перевода строки игнорируются. Подстановка результатов выполнения команд Shell читает цепочки символов, заключенные в обратные кавычки (`, в дальнейшем называются символами подста- новки), и интерпретирует эти цепочки как команды. Такие команды выполняются в месте использования. Стандартный вывод этих команд может быть использован как все слово или как его часть. Хвостовые символы перевода строки из стандартного вывода удаляются. До интерпретации цепочек как команд с ними не произво дится никаких действий, кроме удаления символов \, ис- пользующихся для экранирования символов подстановки или другого символа \. Экранирование символов подстановки позволяет использовать вложенную подстановку результа- тов выполнения команд. Если подстановка лежит внутри двойных кавычек ("...`...`..."), то символ \, использу- емый в ней для экранирования двойной кавычки (\"), бу- дет удален; в противном случае он будет оставлен. Если символ \ используется для экранирования перевода строки, то удаляются оба символа (см. ниже Экранирова- ние). Символ \, экранирующий знак доллара (\$), также удаляется. Отметим, что в данном случае экранировать $ не нужно. Другие вхождения символов \ остаются без изменений. Подстановка параметров В рамках данной статьи термин параметр имеет нетрадици- онную трактовку. Различают два типа параметров: позици- онные и ключевые. Если параметр обозначен цифрой, он является позицион- ным. Значения позиционным параметрам присваиваются при вызове shell-процедур и функций и посредством оператора set (параметр 0 - имя процедуры, параметры 1, 2,... - аргументы). Значения параметров, обозначаемых одним из символов *, @, #, ?, -, $, !, автоматически устанавли ваются shell'ом. Ключевые параметры (переменные) обозначаются именами. Значения могут присваиваться им привычным способом: |имя=значение [имя=значение] ... Все значения трактуются как текстовые. Генерация имен в значениях не производится. Не допускаются одинаковые имена для переменных и функций. Знак $ используется для подстановки значений парамет- ров. Различают следующие виды подстановки: ${параметр} Подставляется значение параметра, если оно опреде лено. Скобки используются, только если за парамет- ром следуют буква, цифра или знак подчеркивания, и их нужно отделить от имени параметра. Вместо пара метров * и @ подставляются все позиционные пара- метры, начиная с $1, разделенные пробелами. ${параметр:-слово} Будем говорить, что параметр пуст, если его значе ние не определено или является пустой цепочкой. При данном способе подстановки если параметр не пуст, подставляется его значение; в противном слу- чае подставляется слово. ${параметр:=слово} Если параметр пуст, ему присваивается слово; после этого подставляется значение параметра. Таким спо- собом нельзя изменять значения позиционных пара- метров. ${параметр:?слово} Если параметр не пуст, подставляется его значение; в противном случае в стандартный протокол выдается сообщение "параметр:слово" и выполнение shell'а завершается. Если слово опущено, то выдается сооб щение "параметр:parameter null or not set". ${параметр:+слово} Если параметр не пуст, подставляется слово; в про тивном случае не подставляется ничего. При подстановке слово интерпретируется только тогда, когда оно нужно для подстановки. В следующем примере команда pwd будет выполнена, только если переменная d пуста: |echo ${d:-`pwd`} Значения следующих параметров, так же как * и @, авто- матически устанавливаются shell'ом: # Количество позиционных параметров (десятичное). - Флаги, указанные при запуске shell'а или посредст- вом команды set. ? Десятичное значение, возвращенное предыдущей син- хронно выполненной командой. $ Идентификатор процесса, в рамках которого выполня- ется shell. ! Идентификатор последнего асинхронно запущенного процесса. Напомним: чтобы получить значения этих переменных, пе- ред ними нужно поставить знак $. Shell'ом используются следующие переменные: HOME Подразумеваемый аргумент команды cd(1) - основной каталог. PATH Список имен каталогов для поиска команд (см. ниже Выполнение). В дальнейшем подобные списки называ- ются списками поиска. Элементы списка разделяются двоеточием. Пустой элемент означает текущий ката лог. CDPATH Список поиска для команды cd. MAIL Имя файла, куда будет помещаться почта; если пере менная MAILPATH не определена, shell информирует пользователя о поступлении почты в указанный файл. MAILCHECK Интервал между проверками поступления почты в файл, указанный переменными MAIL или MAILPATH. По умолчанию интервал составляет 600 секунд (10 ми- нут). При установлении значения 0 проверка будет производиться перед каждым выводом приглашения. MAILPATH Список имен файлов, разделенных двоеточием. Если переменная определена, shell информирует пользова- теля о поступлении почты в каждый из указанных файлов. После имени файла может быть указано (вслед за знаком %) сообщение, которое будет выво диться при изменении времени модификации указанно- го файла (сообщение по умолчанию "You have mail"). PS1 Основное приглашение (по умолчанию "$ "). PS2 Вспомогательное приглашение (по умолчанию "> "). IFS Цепочка символов, являющихся разделителями в ко мандной строке (по умолчанию это пробел, табуляция и перевод строки). SHACCT Если значением этой переменной является имя файла, доступного для записи пользователем, shell будет помещать в него сведения о каждой выполняемой им процедуре. Для анализа сведений могут быть приме- нены такие программы, как acctcom(1) и acctcms(1M). SHELL При запуске shell просматривает окружение (см. ни же Окружение) в поисках этой переменной. Если она определена и файловая часть ее значения есть rsh, shell становится ограниченным [см. rsh(1)]. Для переменных PATH, PS1, PS2, MAILCHECK и IFS имеются подразумеваемые значения. Значения переменных HOME и MAIL устанавливаются командой login(1). Интерпретация пробелов После подстановки параметров и результатов выполнения команд полученная строка просматривается в поисках раз делителей (которые определяются значением переменной IFS) и расщепляется на аргументы. Явные пустые аргумен- ты ("" или '') сохраняются. Неявные пустые аргументы (полученные в результате подстановки пустых параметров) удаляются. Генерация имен файлов После всех подстановок, прежде чем команда начнет вы полняться, в каждом составляющем ее слове ищутся симво- лы *, ?, и [. Если находится хотя бы один из них, то это слово рассматривается как шаблон имен файлов и за- меняется именами файлов, удовлетворяющих данному шабло- ну (в алфавитном порядке). Если ни одно имя файла не удовлетворяет шаблону, слово остается неизменным. Сим- вол . в начале имени файла или непосредственно после / так же как и сам символ /, должны быть заданы в шаблоне явно. Трактовка символов *, ? и [: * Сопоставляется с произвольной цепочкой символов, в том числе с пустой. ? Сопоставляется с произвольным символом. [...] Сопоставляется с любым из перечисленных в скобках символов. Пара символов, разделенных знаком -, обозначает отрезок алфавита, включающий сами ука занные символы. Если сразу вслед за [ идет !, шаблону удовлетворяет любой символ, не перечис- ленный в скобках. Экранирование Следующие символы трактуются shell'ом по-особому; если эти символы не экранированы, они завершают предшествую щее им слово: |; & ( ) | ^ < > пробел табуляция перевод_строки Символы *, ?, [, ] также играют для shell'а особую роль, однако разделителями слов на являются. Каждый из перечисленных выше символов может быть экра- нирован, то есть представлять самого себя, если перед ним стоит \ или он расположен между кавычками ('' или ""). Во время работы shell может экранировать некоторые символы для предотвращения использования их в качестве специальных символов. Символ \ используется для экрани- рования одиночных символов и удаляется из слова перед выполнением команды. Пара символов \перевод_строки уда- ляется из слова перед подстановкой параметров и резуль- татов выполнения команд. Все символы, заключенные между одинарными кавычками (''), представляют самих себя (кроме одинарной кавыч- ки). Символ \ между парой одинарных кавычек не имеет специального значения. Одинарная кавычка может экрани- роваться парой двойных кавычек (пример: "'"). Между двойными кавычками ("") выполняются подстановки параметров и команд и результаты подстановок экраниру- ются от интерпретации пробелов и генерации имен файлов. Если $* стоит между двойными кавычками, то позиционные параметры подставляются, экранируются, и разделяются экранированными пробелами, что эквивалентно "$1 $2 ...". Если же внутри двойных кавычек стоит $@, то по- зиционные параметры подставляются, экранируются, и раз деляются неэкранированными пробелами, что эквивалентно "$1" "$2" ... . Символы \, `, " и $ могут экранировать- ся предшествующим символом \. Пара символов \пере- вод_строки удаляется из слова перед подстановкой пара- метров и результатов выполнения команд. Если символ \ стоит перед символом, отличным от \, `, ", $ и от пере- вода строки, то он сам экранируется shell'ом. Приглашение В интерактивном режиме перед вводом команды shell выда- ет основное приглашение, $PS1. Если нажата клавиша пе- ревод_строки, но для завершения команды требуется даль нейший ввод, выводится вспомогательное приглашение, $PS2. Ввод/вывод Перед тем, как команда будет выполнена, ее ввод и вывод могут быть переназначены, для чего используется специ альная нотация, интерпретируемая shell'ом. Описанные ниже конструкции могут быть использованы в любом мест простой команды, могут предшествовать команде или за- вершать ее и не передаются в качестве аргументов коман- ды. Подстановки параметров и команд производятся до ис пользования слов или цифр: <слово Использовать файл слово для стандартного ввода (дескриптор файла 0). >слово Использовать файл слово для стандартного вывода (дескриптор файла 1). Если файла нет, он создает- ся; если есть, он опустошается. >>слово Использовать файл слово для стандартного вывода. Если файл существует, то выводимая информация до- бавляется в конец (то есть сначала производится поиск конца файла); в противном случае файл созда- ется. <<[-]слово Читается информация со стандартного ввода, пока н встретится строка, совпадающая со словом, или ко- нец файла. Если после << стоит -, то сначала из слова, а затем, по мере чтения, из исходных строк удаляются начальные символы табуляции, после чего проверяется совпадение строки со словом. Если ка- кой-либо из символов слова экранирован, никакой другой обработки исходной информации не произво- дится; в противном случае делается еще следующее: 1. Выполняется подстановка параметров и команд. 2. Пара символов \перевод_строки игнорируется. 3. Для экранирования символов \, $, ` нужно ис- пользовать \. Результат описанных выше действий становится стан дартным вводом команды. <&цифра Производить стандартный ввод из файла, ассоцииро- ванного с дескриптором цифра. >&цифра Производить стандартный вывод в файл, ассоцииро- ванный с дескриптором цифра. <&- Стандартный ввод команды закрыт. >&- Стандартный вывод команды закрыт. Если любой из этих конструкций предшествует цифра, она определяет дескриптор (вместо подразумеваемых дескрип торов 0 или 1), который будет ассоциирован с файлом, указанным в конструкции. Например, строка |... 2>&1 ассоциирует дескриптор 2 (стандартный протокол) с фай лом, связанным в данный момент с дескриптором 1. Важен порядок переназначения: shell производит переназ- начение слева направо. Так, строка |... 1>f 2>&1 сначала ассоциирует дескриптор 1 с файлом f, а затем дескриптор 2 с тем же файлом. Если изменить порядок пе- реназначения, стандартный протокол будет назначен на терминал (если туда был назначен стандартный вывод), а затем стандартный вывод будет переназначен в файл f. Если команда состоит из нескольких простых команд, пе- реназначение для всей команды будет выполнено перед пе- реназначениями для простых команд. Таким образом, shell выполняет переназначения сначала для всего списка, за- тем для каждого входящего в него конвейера, затем для каждой команды конвейера, затем для каждого списка из каждой команды. Если команда заканчивается знаком &, то стандартный ввод команды переназначается на пустой файл /dev/null. В противном случае окружение для выполнения команды со держит дескрипторы файлов запустившего ее shell'а, мо- дифицированные спецификациями ввода/вывода. Окружение Окружение [см. environ(5)] - это набор пар (имя, значе- ние), который передается выполняемой программе так же, как и обычный список аргументов. Shell взаимодействует с окружением несколькими способами. При запуске shell просматривает окружение и создает переменную (ключевой параметр) для каждого указанного имени, придавая ей со- ответствующее значение. Если изменить значение какой- либо переменной или создать новую, это не окажет ника- кого влияния на окружение, если не будет использована команда export для увязывания переменной shell'а с ок ружением (см. также set -a). Переменную можно удалить из окружения командой unset. Таким образом, окружение каждой команды формируется из всех унаследованных shell'ом пар (имя, значение), минус пары, удаленные ко- мандой unset, плюс все модифицированные и измененные пары, указанные в команде export. Окружение простой команды может быть модифицировано, если указать перед командой одно или несколько присваи- ваний переменным. Так, строки |TERM=vt100 команда и |(export TERM; TERM=vt100; команда) эквивалентны, по крайней мере с точки зрения окружения команды. Если установлен флаг -k, то все переменные, получившие значение в командой строке, помещаются в окружение ко- манды, даже если они записаны после команды. В следую щем примере сначала будет выведено a=b c, а затем c: |echo a=b c |set -k |echo a=b c Сигналы Сигналы прерывания и выхода игнорируются, если команда была запущена асинхронно; в противном случае сигналы обрабатываются так же, как в родительском процессе, за исключением сигнала 11 (см. ниже команду trap). Выполнение Перед выполнением каждой команды производятся все опи- санные выше действия (подстановки, переназначение вво- да/вывода и др.). Если имя команды совпадает с именем одной из специальных команд, перечисленных ниже, она выполняется в рамках текущего процесса. Так же выполня- ются и определенные пользователем функции (обратите внимание, как выполнение функций отличается от выполне- ния процедур shell'а). Позиционные параметры $1, $2, ... получают значения аргументов функции. Если имя ко- манды не совпадает ни с именем специальной команды, ни с именем функции, то порождается новый процесс и осу ществляется попытка выполнить указанную команду, ис- пользуя системный вызов exec(2). Переменная shell'а PATH определяет список каталогов, в которых ищется команда. По умолчанию список поиска име- ет вид |:/bin:/usr/bin то есть поиск выполняется сначала в текущем каталоге, поскольку список поиска начинается с двоеточия, затем в каталоге /bin и, наконец, в /usr/bin. Если имя команды содержит символ /, значение PATH не используется. Если файл имеет право на выполнение, но не является файлом типа a.out(4), то он рассматривается как файл, содержа щий команды на языке shell (то есть как shell-процеду- ра). Для их чтения порождается новый shell. Команды, заключенные в скобки, также выполняются отдельным shell'ом. Положение найденной команды запоминается shell'ом (что- бы избежать в дальнейшем излишних вызовов exec). Если команда была найдена в каталоге, заданном относительно текущего, то ее местоположение должно быть переопреде лено при изменении текущего каталога. Shell забывает все запомненные им прежде местоположения команд при из- менении переменной PATH или при выполнении команды hash -r (см. ниже). Специальные команды Если не оговорено противное, команды выводят результаты в файл с дескриптором 1. : Пустая команда. Возвращает нулевой код завершения. |. файл Shell читает и выполняет команды из файла, затем возобновляется чтение со стандартного ввода; при поиске файла используется значение переменной PATH. |break [n] Выйти из внутреннего for или while цикла; если указано n, то выйти из n внутренних циклов. |continue [n] Перейти к следующей итерации внутреннего for или while цикла; если указано n, то перейти к следую щей итерации n-ого цикла. |cd [каталог] Сделать текущим заданный каталог. Если каталог не указан, используется значение переменной HOME. Пе- ременная CDPATH определяет список поиска каталога. По умолчанию этот список пуст (то есть поиск про- изводится только в текущем каталоге). Если каталог начинается с символа /, список поиска не использу- ется. |echo [аргумент ...] Выдать аргументы на стандартный вывод, разделяя их пробелами [см. также echo(1)]. |eval [аргумент ...] Выполнить команду, заданную аргументами eval. |exec [аргумент ...] Сменить программу процесса: в рамках текущего про- цесса команда, заданная аргументами exec, заменяет shell. В качестве аргументов могут быть указаны спецификации ввода/вывода и, если нет никаких дру- гих аргументов, будет лишь переназначен ввод/вывод текущего shell'а. |exit [код_завершения] Завершить выполнение shell'а с указанным кодом. При отсутствии аргумента код завершения определя ется последней выполненной командой. Чтение симво- ла конца файла также приводит к завершению shell'а. |export [переменная ...] Заданные переменные отмечаются для автоматического экспорта в окружение выполняемых команд. Если ар- гументы не указаны, выводится список всех экспор- тируемых переменных. Имена функций не могут экс- портироваться. Имена переменных, экспортированных из родительского shell'а, выдаются только в том случае, если они были экспортированы и из текущего shell'а. getopts Используется в shell-процедурах для поддержания синтаксических стандартов [см. intro(1)]; разбира- ет позиционные параметры и проверяет допустимость задания опций [см. getopts(1)]. |hash [-r] [имя_команды ...] Для каждого из указанных имен_команд определяется и запоминается маршрут поиска - место в списке по- иска, где удалось найти команду. Опция -r удаляет все запомненные данные. Если не указан ни один ар гумент, то выводится информация о запомненных ко- мандах: hits - количество обращений shell'а к дан- ной команде; cost - объем работы для обнаружения команды в соответствии со списком поиска; command - полное имя команды. Звездочкой в колонке hits помечаются команды, маршрут поиска которых будет перевычисляться после смены текущего каталога [см. cd(1)]; расходы на перевычисление учитываются в колонке cost. |newgrp [аргумент ...] Эквивалентно exec newgrp аргумент ... [см. newgrp(1)]. pwd Выводит имя текущего каталога. [см. pwd(1)]. |read [переменная ...] Со стандартного ввода читается одна строка и де- лится на слова с учетом разделителей, перечислен- ных в значении переменной IFS (обычно это пробел или табуляция); первое слово присваивается первой переменной, второе - второй и т.д., причем все ос тавшиеся слова присваиваются последней переменной. Исходная строка имеет продолжение, если в конце ее стоит последовательность \перевод_строки. Символы, отличные от перевода строки, также могут быть эк ранированы с помощью \, который удаляется перед присваиванием слов. Возвращается нулевой код за- вершения, если только не встретился конец файла. |readonly [переменная ...] Указанные переменные отмечаются как доступные только на чтение. Присваивания таким переменным трактуются как ошибки. Если аргументы не указаны, то выводится информация обо всех переменных, дос- тупных только на чтение. |return [код_завершения] Выйти из функции с указанным кодом_завершения. Ес- ли аргумент опущен, то код завершения наследуется от последней выполненной команды. |set [-a] [-e] [-f] [-h] [-k] [-n] [-t] [-u] [-v] [-x] [--] [аргумент .. -a Экспортировать переменные, которые изменяются или создаются, в окружение. -e Выйти из shell'а, если какая-либо команда воз- вращает ненулевой код завершения. -f Запретить генерацию имен файлов. -h Определить и запомнить местоположение всех ко манд, входящих в тело функции, во время ее оп- ределения, а не во время выполнения. -k Поместить в окружение команды все переменные, получившие значение в командной строке, а не только те, что предшествуют имени команды. -n Читать команды, но не выполнять их. -t Выйти из shell'а после ввода и выполнения одной команды. -u Рассматривать подстановку параметров, не полу- чивших значений, как ошибку. -v Выводить исходные для shell'а строки сразу пос- ле их ввода. -x Выводить команды и их аргументы непосредственно перед выполнением. -- Не изменяет флаги. Полезно использовать для присваивания позиционному параметру $1 значения -: |set -- - При указании + вместо - перечисленные выше режимы выключаются. Описанные флаги могут также использо- ваться при запуске shell'а. Набор текущих флагов есть значение переменной $-. Следующие за флагами аргументы будут присвоены позиционным параметрам $1, $2 и т.д. Если не заданы ни флаги, ни аргумен- ты, выводятся значения всех переменных. |shift [n] Позиционные параметры, начиная с (n+1)-го, переи меновываются в $1 и т.д. По умолчанию n=1. test Вычислить условное выражение [см. test(1)]. times Вывести суммарные времена пользователя и системы, затраченные на выполнение процессов, запущенных данным shell'ом. |trap [имя_команды] [n] ... Команда с указанным именем будет прочитана и вы- полнена, когда shell получит сигнал(ы) n. Заметим, что имя_команды обрабатывается при установке пре- рывания и при получении сигнала. Команды выполня- ются в порядке номеров сигналов. Нельзя установить обработку прерывания по сигналу, игнорируемому данным shell'ом. Попытка установить обработку пре рывания по сигналу 11 (выход за допустимые границы памяти) приводит к ошибке. Если имя_команды опуще- но, то для прерываний с указанными номерами n восстанавливается первоначальная реакция. Если имя_команды есть пустая строка, то этот сигнал бу- дет игнорироваться shell'ом и вызываемыми им прог- раммами. Если n равно 0, то указанная команда вы- полняется при выходе из shell'а. Trap без аргумен тов выводит список команд, связанных с каждым сиг- налом. |type [имя ...] Для каждого имени указывается, как оно будет ин- терпретироваться при использовании в качестве име- ни команды. |ulimit [размер_в_блоках] Установить максимальный размер_в_блоках (по 1 Кб) тех файлов, в которые пишут данный shell и его по- томки (читать можно файлы любого размера) [см. ulimit(1)]. Если размер не указан, выдается теку щий лимит. Каждый пользователь может уменьш собственный лимит, но только суперпользователь мо- жет его увеличить. |umask [nnn] Пользовательская маска создания файлов становится равной nnn (восьмеричное) [см. umask(1)]. Если nnn опущено, выдается текущее значение маски. |unset [имя ...] Для каждого указанного имени удалить соответствую щую переменную или функцию. Переменные PATH, PS1, PS2, MAILCHECK и IFS не могут быть удалены. |wait [идентификатор_процесса] Ждать завершения указанного фонового процесса и вывести код его завершения. При отсутствии аргу мента ждать завершения всех активных фоновых про- цессов. В этом случае код завершения будет нуле- вым [см. wait(1)]. Запуск shell'а Если shell запускается посредством системного вызова exec(2) и первым символом нулевого аргумента является -, сначала читаются и выполняются команды из /etc/ profile и $HOME/.profile, если эти файлы существуют. Затем, как и в случае запуска shell'а посредством /bin/sh, команды выполняются описываемым далее образом. Перечисленные ниже флаги интерпретируются shell'ом только при запуске. Обратим внимание, что если не ука- заны флаги -c и -s, то первый аргумент рассматривается как имя файла, содержащего команды, а остальные аргу- менты передаются этому командному файлу в качестве по- зиционных параметров. -c цепочка_символов Если задан флаг -c, команды берутся из цепочки_- символов. -s Если задан флаг -s или если аргументов больше нет, команды читаются со стандартного ввода. Все остав шиеся аргументы рассматриваются как позиционные параметры. Вывод shell'а (кроме специальных ко манд) направляется в файл с дескриптором 2 (стан- дартный протокол). -i Если задан флаг -i или если ввод и вывод shell' ассоциированы с терминалом, shell выполняется в интерактивном режиме. В этом случае сигнал завер- шения (0) игнорируется (то есть команда kill 0 не приведет к завершению работы интерактивного shell'а), а сигнал прерывания (2) перехватывается и игнорируется (поэтому выполнение системной функ- ции wait(2) может быть прервано). В любом случае сигнал выхода (3) игнорируется. -r Если задан флаг -r, то shell запускается как огра ниченный [см. rsh(1)]. Описание остальных флагов и аргументов см. выше в опи- сании команды set. ФАЙЛЫ /etc/profile $HOME/.profile /tmp/sh* /dev/null СМ. ТАКЖЕ acctcom(1), cd(1), echo(1), env(1), getopts(1), int- ro(1), login(1), newgrp(1), pwd(1), rsh(1), test(1), umask(1), wait(1). dup(2), exec(2), fork(2), pipe(2), signal(2), uli mit(2), umask(2), wait(2), a.out(4), profile(4), envi- ron(5) в Справочнике программиста. acctcms(1M) в Справочнике администратора. КОДЫ ЗАВЕРШЕНИЯ При обнаружении shell'ом ошибок, например синтаксичес- ких, возвращается ненулевой код завершения; в таком случае выполнение shell-процедуры прекращается. В ос тальных случаях shell возвращает код завершения послед- ней выполненной команды (см. также выше команду exit). ОГРАНИЧЕНИЯ В словах, используемых в качестве имен файлов при пе- реназначении ввода/вывода, не производится генерация имен файлов (см. выше Генерация имен файлов). Например, команда |cat f1 > a* создаст файл с именем a*. Так как команды конвейера выполняются как самостоятель- ные процессы, то переменные, установленные в конвейере, не оказывают влияния на родительский shell. Если Вы получили сообщение об ошибке: "cannot fork, too many processes", попытайтесь выполнить команду wait(1) для чистки фоновых процессов. Если это не поможет, то, значит, либо системная таблица процессов и в самом деле переполнена, либо у Вас слишком много приоритетных про цессов. (Имеется ограничение на число процессов, ассо- циированных с каждым пользователем, и на общее число процессов.) СЮРПРИЗЫ При выполнении команд запоминается их местонахождение. Поэтому при создании команды с тем же именем, но нахо дящейся в другом каталоге, все равно будет выполнятьс старая команда (если вызов происходит по простому име- ни). Для исправления ситуации воспользуйтесь командой hash -r. После переименования текущего или вышележащего каталога команда pwd может давать неверную информацию. Для исп- равления ситуации воспользуйтесь командой cd с полным именем каталога. Не описанный в основном тексте символ ^ для совмести- мости со старыми версиями является синонимом |, то есть служит для организации конвейеров.