SH(1) SH(1)
НАЗВАНИЕ
sh - стандартный интерпретатор командного языка shell
СИНТАКСИС
sh [-a] [-c цепочка_символов][-e][-f][-h][-i][-k][-n][-r][-s][-t][-u][-v]
[-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 с полным
именем каталога.
Не описанный в основном тексте символ ^ для совмести-
мости со старыми версиями является синонимом |, то есть
служит для организации конвейеров.
|