.\"- .\" Copyright (c) 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" This code is derived from software contributed to Berkeley by .\" Kenneth Almquist. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" from: @(#)sh.1 8.6 (Berkeley) 5/4/95 .\" %FreeBSD: src/bin/sh/sh.1,v 1.125.2.1 2007/12/05 14:29:07 ru Exp % .\" $FreeBSDru: frdp/doc/ru_RU.KOI8-R/man/man1/sh.1,v 1.3 2008/02/08 13:05:39 ru Exp $ .\" $FreeBSD$ .\" .Dd 7 октября 2006 .Dt SH 1 .Os .Sh НАЗВАНИЕ .Nm sh .Nd командный интерпретатор (оболочка) .Sh СИНТАКСИС .Nm .Op Fl /+abCEefIimnPpsTuVvx .Op Fl /+o Ar длинное_имя .Op Fl c Ar строка .Op Ar аргумент ... .Sh ОПИСАНИЕ Утилита .Nm является стандартным командным интерпретатором в системе. Текущая версия .Nm подвергается изменениям, чтобы соответствовать спецификации .St -p1003.2 для командных оболочек. Эта версия включает в себя много возможностей, делающих её схожей в некоторых отношениях с оболочкой Korn. Однако это не клон командной оболочки Korn, каковым является .Nm pdksh . В эту версию включены только возможности, определённые стандартом .Tn POSIX , плюс несколько расширений Berkeley. Эта страница справочника не предназначена быть ни учебником, ни полной спецификацией командной оболочки. .Ss Обзор Оболочка \[em] это команда, которая читает строки из файла или с терминала, интерпретирует их и, в общем случае, выполняет другие команды. Это программа, которая запускается, когда пользователь входит в систему, хотя пользователь может выбрать другую оболочку с помощью команды .Xr chsh 1 . В оболочке реализован язык, имеющий конструкции для управления потоками, макросы, которые помимо функции накопления данных предоставляют множество других возможностей, имеется встроенная поддержка работы с историей команд и возможность редактирования командной строки. Она включает много возможностей, делающих удобной интерактивную работу, и в то же время обладает тем преимуществом, что её интерпретируемый язык \[em] общий для интерактивного и неинтерактивного использования (командных сценариев). Таким образом, команды можно вводить как непосредственно из запущенной командной оболочки, так и поместить их в файл, который может быть выполнен непосредственно оболочкой. .Ss Вызов .\" .\" XXX This next sentence is incredibly confusing. .\" Если не были указаны аргументы, и стандартный ввод подсоединён к терминалу (или если установлена опция .Fl i ) , оболочка считается интерактивной. Интерактивная оболочка выводит строку-приглашение перед каждой командой и обрабатывает программные и командные ошибки по-другому (см.\& ниже). Сразу после запуска оболочка проверяет 0-й аргумент, и если он начинается с тире .Pq Ql - , оболочка также считается оболочкой входа в систему (login shell). Обычно это делается автоматически, когда пользователь входит в систему. Оболочка входа вначале читает команды из файла .Pa /etc/profile , а затем из файла .Pa .profile в домашнем каталоге пользователя, если они существуют. Если переменная окружения .Ev ENV установлена на момент запуска оболочки, либо установлена в файле .Pa .profile (если это оболочка входа), то оболочка затем читает команды из файла, указанного в .Ev ENV . Следовательно, пользователь должен помещать команды, которые должны выполняться только в момент входа в систему, в файл .Pa .profile , а команды, которые должны выполняться при каждом запуске оболочки, в файл .Ev ENV . Пользователь может установить значение переменной .Ev ENV в имя какого-нибудь файла, поместив следующую строку в файл .Pa .profile в своём домашнем каталоге, заменив .Pa .shinit на желаемое имя файла: .Pp .Dl "ENV=$HOME/.shinit; export ENV" .Pp Первый указанный в командной строке аргумент, не являющейся опцией, будет воспринят как имя файла, из которого должны читаться команды (сценарий оболочки), а оставшиеся аргументы устанавливаются как позиционные параметры оболочки .Li ( $1 , $2 , и т.д.). В противном случае оболочка читает команды со своего стандартного ввода. .Pp В отличие от более ранних версий .Nm , сценарий из .Ev ENV считывается только интерактивной оболочкой. Это закрывает широко известную и иногда легко эксплуатируемую брешь в системе безопасности, связанную с плохо продуманными сценариями .Ev ENV . .Ss Обработка списка аргументов Все однобуквенные опции .Nm имеют соответствующие длинные имена, за исключением .Fl c и .Fl /+o . Эти длинные имена указаны следом за однобуквенными опциями в описании ниже. Длинное имя опции может быть указано как аргумент к опции .Fl /+o в .Nm . Когда оболочка уже запущена, длинное имя опции может быть указано как аргумент к опции .Fl /+o встроенной команды .Ic set , описанной позже в разделе .Sx Встроенные команды . Тире .Pq Ql - , указанное перед опцией, включает её, знак плюс .Pq Ql + \[em] выключает. Строка .Dq Li -- или просто .Ql - прерывает обработку опций, и все оставшиеся слова считаются аргументами. Опции .Fl /+o и .Fl c не имеют соответствующих длинных имён. Они требуют указания аргументов, и их описание следует за описанием однобуквенных опций. .Bl -tag -width indent .It Fl a Li allexport Переменные будут помечены для экспорта в момент, когда им присваиваются значения. .It Fl b Li notify Включить асинхронное уведомление о завершении фоновых заданий. (НЕ РЕАЛИЗОВАНО) .It Fl C Li noclobber Не перезаписывать существующие файлы при использовании .Ql > . .It Fl E Li emacs Включить встроенный редактор командной строки .Xr emacs 1 (выключает опцию .Fl V , если она была установлена). .It Fl e Li errexit Немедленно выйти, если одна из непроверенных команд в неинтерактивном режиме завершилась со сбоем. Статус завершения команды считается явно проверенным, если команда является частью управляющей структуры .Ic if , elif , while или .Ic until , если команда является левосторонним операндом операторов .Dq Li && или .Dq Li || , или если команда является конвейером и ей предшествует оператор .Ic !\& . Если выполняется функция оболочки и её статус завершения проверяется явно, то все команды в функции также считаются проверенными. .It Fl f Li noglob Отключить раскрытие путей файлов. .It Fl I Li ignoreeof В интерактивном режиме, игнорировать символы .Dv EOF на входе. .It Fl i Li interactive Принудительно установить интерактивный режим работы оболочки. .It Fl m Li monitor Включить управление заданиями (включается автоматически в интерактивном режиме). .It Fl n Li noexec В неинтерактивном режиме, читать команды, но не выполнять их. Это удобно для проверки синтаксиса командных сценариев. .It Fl P Li physical Изменить установку по умолчанию для команд .Ic cd и .Ic pwd с .Fl L (логическое расположение каталогов) на .Fl P (физическое расположение каталогов). .It Fl p Li privileged Включить привилегированный режим. Этот режим включается при старте, если эффективный идентификатор пользователя или группы не равен реальному идентификатору пользователя или группы. Выключение этого режима устанавливает эффективные идентификаторы пользователя и группы в реальные. Когда этот режим включен в интерактивной оболочке, после файла .Pa /etc/profile вместо .Pa ~/.profile читается файл .Pa /etc/suid_profile , и содержимое переменной .Ev ENV игнорируется. .It Fl s Li stdin Читать команды из стандартного ввода (устанавливается автоматически, если нет файловых аргументов). Эта опция не действует, если включается после того, как оболочка уже запущена (т.е.\& когда включается командой .Ic set ) . .It Fl T Li trapsasync Ожидая завершения дочернего процесса, выполнять ловушки немедленно. Если эта опция не установлена, ловушки выполняются после завершения дочернего процесса, как определено в .St -p1003.2 . Эта нестандартная опция полезна, чтобы окружать сторожевой оболочкой дочерние процессы, блокирующие сигналы. Окружающая оболочка может либо убить процесс потомка, либо просто вернуть управление терминалу и оставить процесс потомка работающим, например так: .Bd -literal -offset indent sh -T -c "trap 'exit 1' 2 ; некая-блокирующаяся-программа" .Ed .It Fl u Li nounset Записать сообщение в стандартный файл ошибок при попытке раскрыть неустановленную переменную и, если оболочка неинтерактивная, выйти немедленно. .It Fl V Li vi Включить встроенный редактор командной строки .Xr vi 1 (выключает опцию .Fl E , если она была установлена). .It Fl v Li verbose Оболочка пишет данные из своего стандартного ввода в стандартный файл ошибок, по мере их поступления. Удобно для отладки. .It Fl x Li xtrace Выводить каждую команду (предваряя её значением переменной .Va PS4 ) в стандартный файл ошибок, перед тем как её выполнить. Удобно для отладки. .El .Pp Если задана опция .Fl c , то вместо стандартного ввода оболочка читает команды из операнда .Ar строка этой опции. Следует помнить, что эта опция принимает только одну строку в качестве аргумента, поэтому строки, состоящие из нескольких слов, должны быть экранированы. .Pp Опция .Fl /+o в качестве единственного своего аргумента берёт длинное имя опции, которую необходимо включить или отключить. Например, следующие два вызова .Nm оба активируют встроенный редактор командной строки .Xr emacs 1 : .Bd -literal -offset indent set -E set -o emacs .Ed .Pp Опция .Fl o без аргументов показывает текущие установки опций в удобочитаемом формате. Опция .Cm +o без аргумента выводит текущие установки опций в формате, подходящем для их повторного ввода в оболочку. .Ss Лексическая структура Оболочка читает строки из файла ввода и разбивает их на слова. Разделителями слов служат пробельные символы (пробелы и табуляции) и определённые последовательности символов, называемые .Dq операторами , которые имеют специальное значение для оболочки. Есть два типа операторов: управляющие операторы и операторы перенаправления (их назначение обсуждается позже). Вот список допустимых операторов: .Bl -tag -width indent .It Управляющие операторы: .Bl -column "XXX" "XXX" "XXX" "XXX" "XXX" -offset center -compact .It Li & Ta Li && Ta Li ( Ta Li ) Ta Li \en .It Li ;; Ta Li ; Ta Li | Ta Li || .El .It Операторы перенаправления: .Bl -column "XXX" "XXX" "XXX" "XXX" "XXX" -offset center -compact .It Li < Ta Li > Ta Li << Ta Li >> Ta Li <> .It Li <& Ta Li >& Ta Li <<- Ta Li >| .El .El .Pp Символ .Ql # в начале слова обозначает начало комментария. Слово, начинающееся с .Ql # , и остаток строки игнорируются. .Ss Экранирование Экранирование используется, чтобы аннулировать специальное для оболочки значение определённых символов или слов, таких как операторы, пробельные символы, ключевые слова или псевдонимы. .Pp Есть три типа экранирования: парные одинарные кавычки, парные двойные кавычки и обратная косая черта. .Bl -tag -width indent .It Одинарные кавычки Заключение символов в одинарные кавычки сохраняет буквальное значение всех этих символов (за исключением одинарных кавычек, что делает невозможным помещение одинарных кавычек внутрь строки, экранированной одинарными кавычками). .It Двойные кавычки Заключение символов в двойные кавычки сохраняет буквальное значение всех этих символов за исключением знака доллара .Pq Ql $ , обратной кавычки .Pq Ql ` и обратной косой черты .Pq Ql \e . Исторически так сложилось, что обратная косая черта внутри двойных кавычек ведёт себя странно. Её значение остаётся буквальным, за исключением случаев, когда она предваряет следующие символы, для экранирования которых она и предназначена: .Bl -column "XXX" "XXX" "XXX" "XXX" "XXX" -offset center -compact .It Li $ Ta Li ` Ta Li \&" Ta Li \e\ Ta Li \en .El .It Обратная косая черта Обратная косая черта сохраняет буквальное значение следующего за ней символа, за исключением символа новой строки .Pq Ql \en . Обратная косая черта перед символом новой строки расценивается как продолжение строки. .El .Ss Зарезервированные слова Зарезервированные слова \[em] это слова, имеющие специальное значение для оболочки. Они распознаются в начале строки и после управляющего оператора. Вот список зарезервированных слов: .Bl -column "doneXX" "elifXX" "elseXX" "untilXX" "whileX" -offset center .It Li \&! Ta { Ta } Ta Ic case Ta Ic do .It Ic done Ta Ic elif Ta Ic else Ta Ic esac Ta Ic fi .It Ic for Ta Ic if Ta Ic then Ta Ic until Ta Ic while .El .Ss Псевдонимы Псевдоним \[em] это имя и соответствующее значение, установленное встроенной командой .Ic alias . В тех местах, где может находиться зарезервированное слово (см.\& выше), и после проверки на зарезервированные слова, оболочка проверяет, соответствует ли слово какому-либо псевдониму. Если да, оболочка заменяет его во входном потоке на его значение. Например, если имеется псевдоним с названием .Dq Li lf и значением .Dq Li "ls -F" , тогда входной поток .Pp .Dl "lf foobar" .Pp преобразуется в .Pp .Dl "ls -F foobar" .Pp Псевдонимы предоставляют удобное средство для безыскусных пользователей создавать стенографические сокращения для команд, не изучая, как создавать функции с аргументами. Они также могут быть использованы для создания лексически невразумительного кода. Такое их использование не рекомендуется. .Pp Действие псевдонима может быть отменено в командной строке, если использовать экранирование внутри или смежно с именем псевдонима. Чаще всего это делают, помещая перед псевдонимом обратную косую черту, чтобы могла выполниться функция, встроенная команда или обычная программа с таким же именем. См.\& раздел .Sx Экранирование . .Ss Команды Оболочка интерпретирует слова, которые читает, в соответствии с языком, спецификация которого лежит вне рамок этой страницы справочника (обратитесь к BNF в документе .St -p1003.2 ) . Основное то, что читается строка, и если первое слово в строке (или после оператора управления) не является зарезервированным, то оболочка распознала простую команду. В противном случае команда распознаётся как сложная или как некоторая другая специальная конструкция. .Ss Простые команды Когда распознаётся простая команда, оболочка предпринимает следующие действия: .Bl -enum .It Слова в форме .Dq Li имя=значение удаляются из начала строки и назначаются в качестве окружения этой простой команды. Операторы перенаправления и их аргументы (как описано ниже) удаляются и сохраняются для дальнейшей обработки. .It Оставшиеся слова раскрываются, как описано в разделе .Sx Раскрытие слов . Первое оставшееся слово интерпретируется как имя команды, и осуществляется поиск этой команды. Оставшиеся слова становятся аргументами этой команды. Если не нашлось имени команды, переменные .Dq Li имя=значение из 1) назначаются текущей оболочке. .It Выполняются перенаправления, как описано в следующем разделе. .El .Ss Перенаправления Перенаправления используются для изменения направления, откуда команда читает свой ввод и куда шлёт свой вывод. В общем, перенаправления открывают, закрывают или дублируют существующую ссылку на файл. Общий формат перенаправления такой: .Pp .D1 Oo Ar n Oc Ar оператор-перенаправления файл .Pp где .Ar оператор-перенаправления \[em] это один из операторов перенаправления, упомянутых ранее. Далее следуют некоторые примеры использования этих операторов. Обратите внимание, что сокращения stdin и stdout широко используются в значении стандартного ввода и стандартного вывода, соответственно. .Bl -tag -width "1234567890XX" -offset indent .It Oo Ar n Oc Ns Li > Ar файл перенаправить stdout (или файловый дескриптор .Ar n ) в .Ar файл .It Oo Ar n Oc Ns Li >| Ar файл то же что выше, но отменяет опцию .Fl C .It Oo Ar n Oc Ns Li >> Ar файл добавить stdout (или файловый дескриптор .Ar n ) в конец файла .It Oo Ar n Oc Ns Li < Ar файл перенаправить stdin (или файловый дескриптор .Ar n ) из файла .It Oo Ar n Oc Ns Li <> Ar файл перенаправить stdin (или файловый дескриптор .Ar n ) в и из файла .It Oo Ar n1 Oc Ns Li <& Ns Ar n2 дублировать stdin (или файловый дескриптор .Ar n1 ) из файлового дескриптора .Ar n2 .It Oo Ar n Oc Ns Li <&- закрыть stdin (или файловый дескриптор .Ar n ) .It Oo Ar n1 Oc Ns Li >& Ns Ar n2 дублировать stdout (или файловый дескриптор .Ar n1 ) в файловый дескриптор .Ar n2 .It Oo Ar n Oc Ns Li >&- закрыть stdout (или файловый дескриптор .Ar n ) .El .Pp Следующее перенаправление часто называют .Dq документ-здесь . .Bd -ragged -offset indent .Oo Ar n Oc Ns Li << Ar разделитель .D1 Ar текст-документа .D1 ... .Ar разделитель .Ed .Pp Весь текст в последующих строках до разделителя сохраняется и подаётся команде на стандартный ввод или на файловый дескриптор .Ar n , если он указан. Если .Ar разделитель , указанный в первой строке, экранирован, то .Ar текст-документа рассматривается буквально, в противном случае текст подвергается раскрытию параметров, подстановке команд и арифметическому раскрытию (как описано в разделе .Sx Раскрытие слов ) . Если использовать оператор .Dq Li <<- вместо .Dq Li << , ведущие символы табуляции в строках .Ar текст-документа будут отрезаны. .Ss Поиск и выполнение Есть три типа команд: функции оболочки, встроенные команды и обычные программы. Команда ищется по имени, в этом порядке. Эти три типа команд выполняются по-разному. .Pp Когда выполняется функция оболочки, все позиционные параметры оболочки (исключая .Li $0 , который остаётся неизменным) становятся аргументами функции оболочки. Переменные, которые в явном виде поместили в окружение команды (помещая их определения перед именем функции) делаются локальными для функции и устанавливаются в указанные значения. После этого выполняется команда, указанная в определении функции. Когда команда завершается, восстанавливаются оригинальные значения позиционных параметров. Всё это происходит внутри текущей оболочки. .Pp Встроенные команды оболочки выполняются внутри самой оболочки, без порождения нового процесса. .Pp В остальных случаях, если имя команды не соответствует ни функции, ни встроенной команде, команда ищется как обычная программа в файловой системе (как описано в следующем разделе). Когда выполняется обычная команда, оболочка запускает эту программу, передавая ей аргументы и окружение. Если программа не является обычным исполняемым файлом (т.е.\& если она не начинается с .Dq "магического числа" , чьё .Tn ASCII представление выглядит как .Dq Li #! , в результате чего .Xr execve 2 возвращает статус завершения .Er ENOEXEC ) , оболочка интерпретирует программу в дочерней оболочке. В этом случае дочерняя оболочка проинициализирует себя, как если бы была запущена новая оболочка для обработки этого командного сценария, за исключением того, что новая оболочка будет помнить положение хэш-таблицы команд родительской оболочки (см.\& ниже описание встроенной команды .Ic hash ) . .Pp Обратите внимание, что предыдущие версии этого документа и самого исходного кода иногда вводили в заблуждение тем, что называли командный сценарий без магического числа .Dq "процедурой оболочки" . .Ss Поиск пути Выполняя поиск команды, оболочка сначала смотрит, нет ли функции оболочки с таким именем. Затем она ищет встроенную команду с таким именем. Если встроенная команда не найдена, происходит одна из двух вещей: .Bl -enum .It Команды, имена которых содержат символ косой черты, выполняются без какого-либо поиска. .It Оболочка ищет команду в каждом элементе переменной окружения .Ev PATH , по очереди. Значением переменной .Ev PATH должен быть список элементов, разделённых двоеточиями. Каждый элемент задаёт имя каталога. Текущий каталог может быть задан неявно, пустым именем каталога, или явно \[em] одной точкой. .El .Ss Статус завершения команды Каждая команда имеет статус завершения, который может повлиять на поведение других команд оболочки. Принцип таков, что команда возвращает нулевое значение в случае нормального или успешного завершения, и ненулевое \[em] в случае сбоя, ошибки, или чтобы вернуть значение .Dq ложь . Страница справочника для каждой команды должна предоставлять список кодов завершения, и что они означают. Кроме того, как встроенные команды, так и функции оболочки также возвращают код завершения. .Pp Если команда прерывается сигналом, её статус завершения равен 128 плюс номер сигнала. Номера сигналов определены в заголовочном файле .In sys/signal.h . .Ss Сложные команды Сложные команды \[em] это комбинации простых команд с управляющими операторами или зарезервированными словами, вместе составляющих одну большую сложную команду. В общем, команда бывает одного из следующих типов: .Bl -item -offset indent .It простая команда .It конвейер .It список или составной-список .It составная команда .It определение функции .El .Pp Если не сказано иначе, статус завершения команды равен статусу завершения последней выполненной ею простой команды. .Ss Конвейеры Конвейер \[em] это последовательность одной или нескольких команд, разделённых оператором управления .Ql \&| . Стандартный вывод всех, кроме последней, команд подсоединяется к стандартному вводу следующей команды. Стандартный вывод последней команды наследуется из оболочки, как обычно. .Pp Формат конвейера такой: .Pp .D1 Oo Li \&! Oc Ar команда1 Op Li \&| Ar команда2 ... .Pp Стандартный вывод первой команды подсоединяется к стандартному вводу второй команды. Стандартный ввод, стандартный вывод, или они оба назначаются конвейером прежде, чем любым из перенаправлений, указанных операторами перенаправления, являющимися частью этой команды. .Pp Если конвейер выполняется не в фоновом режиме (это обсуждается дальше), оболочка ждёт завершения всех команд. .Pp Если зарезервированное слово .Ic !\& не предшествует конвейеру, статус завершения равен статусу завершения последней команды, указанной в конвейере. В противном случае статус завершения равен логическому отрицанию статуса завершения последней команды. То есть, если последняя команда возвращает ноль, статус завершения будет единицей; если последняя команда возвратит значение больше нуля, статус завершения будет ноль. .Pp Поскольку назначение конвейером стандартного ввода или стандартного вывода (или обоих) происходит до перенаправления, оно может быть изменено перенаправлением. Например: .Pp .Dl "команда1 2>&1 | команда2" .Pp шлёт и стандартный вывод, и стандартный файл ошибок команды .Ar команда1 на стандартный вход команды .Ar команда2 . .Pp Символ .Ql \&; или символ новой строки обозначает, что предшествующий И-ИЛИ список (описанный ниже в разделе .Sx Закорачивающие операторы списка ) будет выполняться последовательно; .Ql & означает асинхронное выполнение И-ИЛИ списка. .Pp Заметьте, что в отличие от некоторых других оболочек, .Nm выполняет каждый процесс в конвейере как дочерний процесс процесса .Nm . Встроенные команды \[em] исключение из этого правила. Они выполняются в текущей оболочке, хотя они не влияют на её окружение, когда используются в конвейерах. .Ss Фоновые команды (&) Если команда завершается управляющим оператором амперсанд .Pq Ql & , оболочка выполняет эту команду асинхронно; оболочка не ждёт пока завершится эта команда, перед тем как выполнить следующую команду. .Pp Формат запуска команды в фоновом режиме такой: .Pp .D1 Ar команда1 Li & Op Ar команда2 Li & Ar ... .Pp Если оболочка неинтерактивная, стандартный ввод асинхронной команды устанавливается в .Pa /dev/null . .Ss Списки (в общем смысле) Список \[em] это последовательность из нуля или более команд, разделённых символами новой строки, точками с запятой или амперсандами, и необязательно завершающаяся одним из этих трёх символов. Команды в списке выполняются в той последовательности, в которой они написаны. Если за командой следует амперсанд, оболочка запускает эту команду и немедленно переходит к следующей команде; в противном случае она ждёт, когда команда завершится, перед тем как приступить к следующей. .Ss Закорачивающие операторы списка .Dq Li && и .Dq Li || \[em] это И-ИЛИ операторы списка. .Dq Li && выполняет первую команду и затем, в случае если статус завершения первой команды равен нулю, выполняет вторую. .Dq Li || работает подобным же образом, но запускает вторую команду в случае ненулевого статуса завершения первой команды. .Dq Li && и .Dq Li || имеют одинаковый приоритет. .Ss Конструкции управления потоком (if, while, for, case) Синтаксис команды .Ic if такой: .Bd -unfilled -offset indent -compact .Ic if Ar список .Ic then Ar список .Oo Ic elif Ar список .Ic then Ar список Oc Ar ... .Op Ic else Ar список .Ic fi .Ed .Pp Синтаксис команды .Ic while такой: .Bd -unfilled -offset indent -compact .Ic while Ar список .Ic do Ar список .Ic done .Ed .Pp Два списка выполняются в цикле пока статус завершения первого списка равен нулю. Команда .Ic until выглядит подобным образом, только на месте .Ic while содержит слово .Ic until , и повторяется до тех пор, пока статус завершения первого списка не станет нулевым. .Pp Синтаксис команды .Ic for такой: .Bd -unfilled -offset indent -compact .Ic for Ar переменная Op Ic in Ar слово ... .Ic do Ar список .Ic done .Ed .Pp Если слово .Ic in и последующие слова опущены, вместо них используется .Ic in Li $@ . Слова раскрываются, а затем список выполняется по циклу, с переменной, принимающей в качестве значения каждое слово по очереди. Команды .Ic do и .Ic done могут быть заменены на .Ql { и .Ql } . .Pp Синтаксис команд .Ic break и .Ic continue такой: .D1 Ic break Op Ar число .D1 Ic continue Op Ar число .Pp Команда .Ic break прерывает .Ar число самых внутренних циклов .Ic for или .Ic while . Команда .Ic continue продолжает работу со следующей итерации самого внутреннего цикла. Обе эти команды реализованы как встроенные. .Pp Синтаксис команды .Ic case такой: .Bd -unfilled -offset indent -compact .Ic case Ar слово Ic in .Ar шаблон Ns Li ) Ar список Li ;; .Ar ... .Ic esac .Ed .Pp Шаблон на самом деле может быть одним или несколькими шаблонами (см.\& .Sx Шаблоны оболочки , описанные дальше), разделёнными символами .Ql \&| . Кодом завершения команды .Ic case является код завершения последней команды, выполненной в списке, или ноль, если не было подходящих шаблонов. .Ss Группировка команд Команды могут быть сгруппированы одним из двух способов: .Pp .D1 Li \&( Ns Ar список Ns Li \%) .Pp или .Pp .D1 Li { Ar список Ns Li \&; } .Pp Первая форма выполняет команды в дочерней оболочке. Встроенные команды, выполненные таким образом, не влияют на текущую оболочку. Вторая форма не запускает дочернюю оболочку, так что она чуть более эффективна. Группировка команд таким образом позволяет пользователю направлять их вывод так, как будто они \[em] одна команда: .Bd -literal -offset indent { echo -n "здравствуй"; echo " мир"; } > приветствие .Ed .Ss Функции Синтаксис определения функции: .Pp .D1 Ar имя Li \&( \&) Ar команда .Pp Определение функции \[em] это выполняемое выражение; выполняясь, оно устанавливает функцию с названием .Ar имя и возвращает статус завершения ноль. Команда \[em] это обычно список, заключённый в .Ql { и .Ql } . .Pp Переменные могут быть объявлены локальными к функции, используя команду .Ic local . Это должно быть первым выражением функции, синтаксис этой команды такой: .Pp .D1 Ic local Oo Ar переменная ... Oc Op Fl .Pp Команда .Ic local реализована как встроенная команда. .Pp Когда переменная объявляется локальной, она наследует начальное значение и флаги .Dq экспортировать и .Dq "только для чтения" от переменной с таким же именем в окружающей области видимости, если таковая имеется. В противном случае переменная изначально не установлена. Оболочка использует динамические области видимости, так, что если переменная .Va x объявлена локальной для функции .Em f , которая затем вызывает функцию .Em g , ссылки на переменную .Va x , сделанные в .Em g , будут относиться к переменной .Va x , объявленной внутри .Em f , а не к глобальной переменной .Va x . .Pp Единственный специальный параметр, который может быть сделан локальным \[em] это .Ql - . Если сделать .Ql - локальным, то все опции оболочки, изменённые с помощью команды .Ic set внутри функции, будут восстановлены в оригинальные значения после возврата из функции. .Pp Синтаксис команды .Ic return такой: .Pp .D1 Ic return Op Ar статус_завершения .Pp Она завершает работу текущего контекста выполнения, возвращаясь из предыдущей вложенной функции, выполняемого сценария или экземпляра оболочки, в указанном порядке. Команда .Ic return реализована как встроенная команда. .Ss Переменные и параметры Оболочка поддерживает набор параметров. Параметр, обозначаемый именем, называется переменной. При старте оболочка превращает все переменные окружения в переменные оболочки. Новые переменные могут быть установлены с помощью формы .Pp .D1 Ar имя Ns = Ns Ar значение .Pp Переменные, устанавливаемые пользователем, должны иметь имя, состоящее исключительно из буквенно-цифровых символов и знаков подчёркивания. Первая буква имени переменной не должна быть цифрой. Параметр также может обозначаться числом или специальным символом, как объяснено ниже. .Ss Позиционные параметры Позиционный параметр \[em] это параметр, обозначенный числом больше нуля. Оболочка изначально устанавливает их в значения аргументов командной строки, которые следуют за именем сценария оболочки. Для установки и сброса этих параметров можно также воспользоваться встроенной командой .Ic set . .Ss Специальные параметры Специальный параметр \[em] это параметр, обозначенный специальным односимвольным именем. Специальные параметры, понимаемые оболочкой .Nm во .Fx , показаны в следующем списке точно в том виде, в котором они должны появляться во вводе пользователя или в исходном тексте сценария оболочки. .Bl -hang .It Li $* Раскрывается в позиционные параметры, начиная с первого. Если раскрытие происходит внутри строки, заключённой в двойные кавычки, то оно раскрывается в одно поле со значением всех параметров, разделённых первым символом из переменной .Va IFS , или пробелом, если .Va IFS не установлена. .It Li $@ Раскрывается в позиционные параметры, начиная с первого. Если раскрытие происходит внутри строки, заключённой в двойные кавычки, каждый позиционный параметр раскрывается как отдельный аргумент. Если позиционных параметров нет, раскрытие .Li @ производит ноль аргументов, даже если .Li @ заключено в двойные кавычки. Что это означает, так это что если, например, .Li $1 равен .Dq Li абв и .Li $2 равен .Dq Li "где жзи" , то .Dq Li $@ раскрывается в два аргумента: .Bd -literal -offset indent "абв" "где жзи" .Ed .It Li $# Раскрывается в число позиционных параметров. .It Li $? Раскрывается в статус завершения последнего конвейера. .It Li $- (дефис) Раскрывается во флаги текущих опций (однобуквенные имена опций, объединённые в строку), как указано при вызове, с помощью встроенной команды .Ic set или неявно самой оболочкой. .It Li $$ Раскрывается в идентификатор процесса запущенной оболочки. Дочерняя оболочка сохраняет значение .Va $ родительской оболочки. .It Li $! Раскрывается в идентификатор процесса последней команды, запущенной в фоновом режиме из текущей оболочки. Для конвейера это будет идентификатор процесса последней команды в конвейере. .It Li $0 (ноль) Раскрывается в имя оболочки или сценария оболочки. .El .Ss Раскрытие слов Этот раздел описывает различные раскрытия, выполняемые над словами. Не все раскрытия выполняются над каждым словом, как объясняется дальше. .Pp Раскрытие тильды, раскрытие параметров, подстановка команды, арифметическое раскрытие и удаление кавычек, происходящие внутри одного слова, раскрываются в одно поле. Только разбиение на поля и раскрытие пути файла могут сделать несколько полей из одного слова. Единственное исключение из этого правила \[em] раскрытие специального параметра .Va @ внутри двойных кавычек, как описано выше. .Pp Порядок раскрытия слов такой: .Bl -enum .It Раскрытие тильды, раскрытие параметров, подстановка команды, арифметическое раскрытие (всё это происходит одновременно). .It Разбиение на поля производится над полями, произведёнными шагом (1), если переменная .Va IFS не пустая. .It Раскрытие путей файлов (если не включена опция .Fl f ) . .It Удаление кавычек. .El .Pp Для вставки раскрытия параметров, подстановки команды и арифметических вычислений используется символ .Ql $ . .Ss Раскрытие тильды (подстановка домашнего каталога пользователя) Слово, начинающееся с неэкранированного символа тильды .Pq Ql ~ подвергается раскрытию тильды. Все символы до косой черты .Pq Ql / или конца слова расцениваются как имя пользователя и замещаются на домашний каталог пользователя. Если имя пользователя опущено (как в .Pa ~/foobar ) , тильда замещается на значение переменной .Ev HOME (имя домашнего каталога текущего пользователя). .Ss Раскрытие параметров Формат раскрытия параметров такой: .Pp .D1 Li ${ Ns Ar выражение Ns Li } .Pp где .Ar выражение состоит из всех символов до закрывающей .Ql } . Любой символ .Ql } , экранированный обратной косой чертой или находящийся внутри заключённой в кавычки строки, а также символы во встроенных арифметических раскрытиях, подстановках команд и раскрытиях переменных, не проверяются на наличие закрывающей .Ql } . .Pp Простейшая форма раскрытия параметров такая: .Pp .D1 Li ${ Ns Ar параметр Ns Li } .Pp Подставляется значение параметра, если оно есть. .Pp Имя параметра или символическое имя могут быть заключены в фигурные скобки, которые не являются обязательными, за исключением случаев с позиционными параметрами, имя которых состоит из более чем одной цифры, или когда за параметром следует символ, который может быть расценен как часть имени параметра. Если раскрытие параметра происходит внутри двойных кавычек: .Bl -enum .It Раскрытие имени пути не производится над результатом этого раскрытия. .It Разбиение на поля не производится над результатом этого раскрытия, за исключением специального параметра .Va @ . .El .Pp В дополнение, раскрытие параметров может быть модифицировано с помощью следующих форматов. .Bl -tag -width indent .It Li ${ Ns Ar параметр Ns Li :- Ns Ar слово Ns Li } Использовать значение по умолчанию. Если .Ar параметр не установлен или пустой, подставляется раскрытие слова, иначе подставляется значение параметра. .It Li ${ Ns Ar параметр Ns Li := Ns Ar слово Ns Li } Присвоить значение по умолчанию. Если .Ar параметр не установлен или пустой, параметру присваивается раскрытие слова. В любом случае, подставляется конечное значение параметра. Только переменные могут принимать значения таким образом, позиционные и специальные параметры не могут. .It Li ${ Ns Ar параметр Ns Li :? Ns Oo Ar слово Oc Ns Li } Сообщить об ошибке если .Ar параметр пустой или не установлен. Если .Ar параметр не установлен или пустой, раскрытие слова (или сообщение об отсутствии значения, если .Ar слово опущено) пишется в стандартный файл ошибок, и оболочка завершается с ненулевым статусом завершения. В противном случае, подставляется значение параметра. Интерактивная оболочка не нуждается в завершении. .It Li ${ Ns Ar параметр Ns Li :+ Ns Ar слово Ns Li } Использовать альтернативное значение. Если .Ar параметр не установлен или пустой, подставляется пустое значение; в противном случае, подставляется раскрытие слова. .El .Pp В раскрытиях параметров, показанных выше, двоеточие означает, что параметр проверяется на предмет неустановленности или пустого значения; отсутствие двоеточия означает, что параметр проверяется только на предмет неустановленности. .Bl -tag -width indent .It Li ${# Ns Ar параметр Ns Li } Длина строки. Длина строки значения параметра в символах. .El .Pp Следующие четыре разновидности раскрытия параметров предоставляют возможность манипуляции подстроками. В любом случае, при вычислении шаблонов используется формат сопоставления шаблонов (см.\& .Sx Шаблоны оболочки ) , а не регулярные выражения. Если параметр \[em] один из специальных символов .Va * или .Va @ , результат раскрытия не определён. Заключение целой строки с раскрытием параметра в двойные кавычки не приводит к экранированию этих четырёх разновидностей шаблонных символов, тогда как экранирование символов внутри фигурных скобок будет иметь этот эффект. .Bl -tag -width indent .It Li ${ Ns Ar параметр Ns Li % Ns Ar слово Ns Li } Удалить наименьший суффикс по шаблону. Слово раскрывается, чтобы получить шаблон. После этого, в результате раскрытия параметра происходит подстановка значения параметра с удалённой наименьшей частью суффикса, соответствующей шаблону. .It Li ${ Ns Ar параметр Ns Li %% Ns Ar слово Ns Li } Удалить наибольший суффикс по шаблону. Слово раскрывается, чтобы получить шаблон. После этого, в результате раскрытия параметра происходит подстановка значения параметра с удалённой наибольшей частью суффикса, соответствующей шаблону. .It Li ${ Ns Ar параметр Ns Li # Ns Ar слово Ns Li } Удалить наименьший префикс по шаблону. Слово раскрывается, чтобы получить шаблон. После этого, в результате раскрытия параметра происходит подстановка значения параметра с удалённой наименьшей частью префикса, соответствующей шаблону. .It Li ${ Ns Ar параметр Ns Li ## Ns Ar слово Ns Li } Удалить наибольший префикс по шаблону. Слово раскрывается, чтобы получить шаблон. После этого, в результате раскрытия параметра происходит подстановка значения параметра с удалённой наибольшей частью префикса, соответствующей шаблону. .El .Ss Подстановка команды Подстановка команды позволяет подставить вывод команды вместо самой команды. Подстановка команды происходит, если команда заключена следующим образом: .Pp .D1 Li $( Ns Ar команда Ns Li )\& .Pp или вариант с заключением в обратные кавычки: .Pp .D1 Li ` Ns Ar команда Ns Li ` .Pp Оболочка выполняет команду в дочерней оболочке и раскрывает подстановку команды, заменяя её на стандартный вывод команды, убирая последовательности из одного или более символов новой строки из конца подстановки. Символы новой строки, встречающиеся перед концом вывода команды, не удаляются; однако, во время разбиения на поля они могут быть переведены в пробелы, в зависимости от значения .Va IFS и экранирования, которое действует в настоящий момент. .Ss Арифметическое раскрытие Арифметическое раскрытие предоставляет механизм для вычисления арифметического выражения и подстановки его значения. Формат арифметического раскрытия такой: .Pp .D1 Li $(( Ns Ar выражение Ns Li )) .Pp Выражение рассматривается как если бы оно было в двойных кавычках, за исключением того, что двойные кавычки внутри выражения не интерпретируются специальным образом. Оболочка раскрывает все составляющие выражения по схемам раскрытия параметров, подстановок команд и удаления кавычек. .Pp Следующим шагом оболочка интерпретирует полученное как арифметическое выражение и подставляет значение выражения. .Ss Разделение пробельными символами (разбиение на поля) После раскрытия параметров, подстановки команд и арифметического раскрытия, оболочка сканирует результаты этих преобразований, которые не были заключены в двойные кавычки, на предмет разбиения на поля, в результате чего может появиться несколько полей. .Pp Оболочка расценивает каждый символ переменной .Va IFS как разделитель, и использует разделители для разбиения на поля результатов раскрытия параметров и подстановок команд. .Ss Раскрытие пути (генерация имён файлов) Если опция .Fl f не установлена, то после разделения на слова происходит генерация имён файлов. Каждое слово рассматривается как последовательность шаблонов, разделённых косыми чертами. Процесс раскрытия замещает слово именами всех существующих файлов, чьи имена могут быть сформированы заменой каждого шаблона на строку, соответствующую указанному шаблону. Здесь есть два ограничения: во-первых, шаблон не может соответствовать строке, содержащей косую черту, и во-вторых, шаблон не может соответствовать строке, начинающейся с точки, если первый символ шаблона не точка. Следующий раздел описывает шаблоны, используемые при раскрытии пути и командой .Ic case . .Ss Шаблоны оболочки Шаблон состоит из обычных символов, которые соответствуют себе же, и мета-символов. Мета-символы \[em] это .Ql \&! , .Ql * , .Ql \&? , и .Ql \&[ . Эти символы утрачивают своё специальное значение, если они экранированы. Когда производится подстановка команды или переменной, и знак доллара или обратные кавычки не заключены в двойные кавычки, эти символы ищутся в значении переменной или выводе команды и считаются мета-символами. .Pp Звёздочка .Pq Ql * соответствует любой строке символов. Знак вопроса .Pq Ql \&? соответствует одному любому символу. Левая квадратная скобка .Pq Ql \&[ задаёт класс символов. Конец класса символов указывается символом .Ql \&] ; если .Ql \&] опущен, символ .Ql \&[ , вместо того, чтобы задать класс символов, соответствует символу .Ql \&[ . Класс символов соответствует любому из символов внутри квадратных скобок. Диапазон символов может быть задан с помощью знака минус. Класс символов может быть дополнен, если первым символом класса символов указать знак восклицания .Pq Ql !\& . .Pp Чтобы включить .Ql \&] в класс символов, его нужно указать первым символом в списке (после символа .Ql \&! , если он есть). Чтобы включить .Ql - , его нужно указать первым или последним символом в списке. .Ss Встроенные команды Данный раздел перечисляет команды, которые реализованы как встроенные, поскольку им необходимо выполнять некоторые операции, которые не могут быть выполнены отдельным процессом. В дополнение к таким командам, из соображений эффективности также доступны встроенные версии важных утилит. .Bl -tag -width indent .It Ic \&: Пустая команда, возвращающая статус завершения 0 (истина). .It Ic \&. Ar файл Оболочка читает команды из указанного файла и выполняет их. Чтобы вернуться к месту вызова команды .Ic \&. , следует использовать команду .Ic return . Если .Ar файл содержит символы .Ql / , он используется как есть. В противном случае, оболочка ищет файл в .Ev PATH . Если файл не найден в .Ev PATH , он ищется в текущем рабочем каталоге. .It Ic \&[ Встроенный эквивалент .Xr test 1 . .It Ic alias Oo Ar имя Ns Oo = Ns Ar строка Oc ... Oc Если указано .Ar имя Ns = Ns Ar строка , оболочка создаёт псевдоним .Ar имя со значением .Ar строка . Если указано только .Ar имя , выводится значение псевдонима .Ar имя . Без аргументов, встроенная команда .Ic alias выводит имена и значения всех существующих псевдонимов (см.\& .Ic unalias ) . Значения псевдонимов печатаются с соответствующим экранированием, пригодным для повторного ввода их в оболочку. Также смотрите раздел .Sx Псевдонимы . .It Ic bg Op Ar задание ... Продолжить выполнение заданий (или текущего задания, если задания не указаны) в фоновом режиме. .It Ic builtin Ar команда Op Ar аргумент ... Выполнить встроенную команду .Ar команда . Это удобно, когда пользователь хочет выполнить встроенную команду, в то время как существует функция оболочки с таким же именем. .It Ic bind Oo Fl aeklrsv Oc Oo Ar клавиша Oo Ar команда Oc Oc Перечислить или изменить привязки клавиш для редактора строки. Эта команда документирована в .Xr editrc 5 . .It Ic cd Oo Fl L | P Oc Op Ar каталог Перейти в указанный .Ar каталог или в каталог, указанный в переменной окружения .Ev HOME , если .Ar каталог не указан. Если .Ar каталог не начинается с .Pa / , \&. или .Pa .. , он ищется в каталогах, перечисленных в переменной .Ev CDPATH . Если .Ev CDPATH не установлена, он ищется в текущем каталоге. Формат .Ev CDPATH такой же как у .Ev PATH . В интерактивной оболочке команда .Ic cd выведет имя каталога, в который был совершён переход, если это имя отличается от того, которое указал пользователь. Они могут отличаться в результате использования механизма .Ev CDPATH или из-за перехода по символической ссылке. .Pp Если указана опция .Fl P , .Pa .. обрабатывается физически, и символические ссылки разыменовываются перед обработкой компонентов .Pa .. . Если указана опция .Fl L , .Pa .. обрабатывается логически. Это стандартное поведение. .It Ic chdir Синоним для встроенной команды .Ic cd . .It Ic command Oo Fl p Oc Op Ar утилита Op Ar аргумент ... .It Ic command Oo Fl v | V Oc Op Ar утилита Первая форма вызова исполняет указанную утилиту как простую команду (см.\& раздел .Sx Простые команды ) . .Pp Если указана опция .Fl p , поиск команды осуществляется с помощью значения .Ev PATH по умолчанию, что гарантирует нахождение всех стандартных утилит. .Pp Если указана опция .Fl v , .Ar утилита не выполняется, а вместо этого выводится описание её интерпретации оболочкой. Для обычных команд это полный путь к команде. Для встроенных команд оболочки, функций оболочки и ключевых слов выводится только имя. Псевдонимы выводятся в форме .Dq Ic alias Ar имя Ns = Ns Ar значение . .Pp Опция .Fl V идентична .Fl v за исключением вывода. Она выводит .Dq Ar утилита Ic is Ar описание , где .Ar описание \[em] одно из: полный полный путь к утилите, a shell builtin, a shell function, a shell keyword или an alias for .Ar значение . .It Ic echo Oo Fl e | n Oc Op Ar строка ... Вывести на стандартный вывод список аргументов, разделённых пробелами, и добавить символ новой строки. .Bl -tag -width indent .It Fl n Не добавлять в конец вывода символ новой строки. .It Fl e Обрабатывать управляющие последовательности с обратной косой чертой в стиле C. Команда .Ic echo понимает следующие управляющие последовательности: .Bl -tag -width indent .It \ea Сигнал тревоги (позвонить в звонок терминала) .It \eb Забой .It \ec Не добавлять в конец символ новой строки (это имеет побочный эффект обрезания строки, если это не последний символ) .It \ee Символ ESC .Tn ( ASCII код 0x1b) .It \ef Символ .Dq "подача страницы" .It \en Новая строка .It \er Возврат каретки .It \et Горизонтальная табуляция .It \ev Вертикальная табуляция .It \e\e Символ обратной косой черты .It \e0nnn (Ноль) Символ с восьмеричным значением .Ar nnn .El .Pp Если .Ar строка не заключена в кавычки, обратная косая черта должна быть экранирована ещё одной обратной косой чертой, чтобы защитить её от оболочки. Например, .Bd -literal -offset indent $ echo -e "a\evb" a b $ echo -e a\e\evb a b $ echo -e "a\e\eb" a\eb $ echo -e a\e\e\e\eb a\eb .Ed .El .Pp Может быть указана только одна из опций .Fl e и .Fl n . .It Ic eval Ar строка ... Соединить все аргументы в строку, разделяя их пробелами. После этого разобрать заново и выполнить команду. .It Ic exec Op Ar команда Op аргумент ... Если .Ar команда не опущена, процесс оболочки замещается на указанную программу (которая должна быть настоящей программой, не встроенной командой и не функцией оболочки). Любые перенаправления в команде .Ic exec делаются постоянными, так что они остаются и после завершения команды .Ic exec . .It Ic exit Op Ar статус_завершения Прервать выполнение процесса оболочки. Если указан .Ar статус_завершения , он используется как статус завершения оболочки; в противном случае используется статус завершения предшествующей команды. .It Ic export Ar имя ... .It Ic export Op Fl p Указанные имена экспортируются так, что они будут видны в окружении далее выполняемых команд. Единственная возможность отменить экспортирование переменной \[em] это сбросить её с помощью команды .Ic unset . Оболочка позволяет установить значение переменной одновременно с её экспортированием, используя запись вида .Pp .D1 Ic export Ar имя Ns = Ns Ar значение .Pp Без аргументов команда .Ic export перечисляет имена всех экспортируемых переменных. Если указана опция .Fl p , экспортируемые переменные выводятся в виде .Dq Ic export Ar имя Ns = Ns Ar значение так, что вывод пригоден для повторного ввода этих переменных в оболочку. .It Ic false Пустая команда, возвращающая ненулевой статус завершения (ложь). .It Ic fc Oo Fl e Ar редактор Oc Op Ar первая Op Ar последняя .It Ic fc Fl l Oo Fl nr Oc Op Ar первая Op Ar последняя .It Ic fc Fl s Oo Ar старая Ns = Ns Ar новая Oc Op Ar первая Встроенная команда .Ic fc перечисляет, или редактирует и выполняет заново команды, ранее введённые в интерактивную оболочку. .Bl -tag -width indent .It Fl e Ar редактор Использовать указанный .Ar редактор для редактирования команд. Аргумент .Ar редактор задаёт имя команды, с возможным поиском через переменную .Ev PATH . Если опция .Fl e не указана, используется значение переменной .Ev FCEDIT . Если .Ev FCEDIT пустая или не установлена, используется значение переменной .Ev EDITOR . Если .Ev EDITOR пустая или не установлена, в качестве редактора используется .Xr ed 1 . .It Fl l Перечислить команды, вместо того чтобы их редактировать. Команды выводятся в порядке, указанном операндами .Ar первая и .Ar последняя , также зависящем от .Fl r , где каждой команде предшествует её номер. .It Fl n Не выводить номера команд при перечислении с помощью .Fl l . .It Fl r Выводить перечисляемые (с помощью .Fl l ) или редактируемые (без .Fl l и без .Fl s ) команды в обратном порядке. .It Fl s Выполнить команду ещё раз, не вызывая редактор. .It Ar первая .It Ar последняя Выбрать команды для перечисления или редактирования. Количество доступных предыдущих команд определяется значением переменной .Ev HISTSIZE . Значение параметров .Ar первая , последняя или обоих может быть одним из следующих: .Bl -tag -width indent .It Oo Cm + Oc Ns Ar число Положительное число, представляющее номер команды; номера команд могут быть показаны с помощью опции .Fl l . .It Fl Ar число Отрицательное десятичное число, представляющее команду, которая была выполнена .Ar число команд назад. Например, \-1 это последняя выполненная команда. .It Ar строка Строка, обозначающая последнюю введённую команду, которая начинается с этой строки. Если при этом с опцией .Fl s не указан операнд .Ar старая Ns = Ns Ar новая , строковая форма первого операнда не может содержать знак равенства. .El .El .Pp Следующие переменные окружения влияют на выполнение .Ic fc : .Bl -tag -width ".Ev HISTSIZE" .It Ev FCEDIT Имя редактора для редактирования истории. .It Ev HISTSIZE Количество доступных предыдущих команд. .El .It Ic fg Op Ar задание Переместить указанное .Ar задание или текущее задание на передний план. .It Ic getopts Ar строка_опций переменная .Tn POSIX Ns -совместимая команда .Ic getopts . Её следует использовать вместо более старой команды .Xr getopt 1 . Первый аргумент должен быть последовательностью букв, за каждой из которых может следовать двоеточие, обозначающее, что опция имеет аргумент. Указанная переменная устанавливается в разобранную опцию. Индекс следующего аргумента помещается в переменную оболочки .Va OPTIND . Если опция имеет аргумент, он помещается в переменную оболочки .Va OPTARG . Если встречается некорректная опция, .Ar переменная устанавливается в .Ql \&? . Когда опции заканчиваются, .Ic getopts возвращает значение ложь (1). .It Ic hash Oo Fl rv Oc Op Ar команда ... Оболочка поддерживает хэш-таблицу, в которой запоминаются местоположения команд. Без аргументов команда .Ic hash выводит содержимое этой таблицы. Записи, которые не искались с момента последней команды .Ic cd , помечаются звёздочкой; эти записи уже возможно некорректны. .Pp Если указаны аргументы, команда .Ic hash удаляет каждую указанную команду (если это не функция) из хэш-таблицы, а затем ищет её. С опцией .Fl v .Ic hash выводит местоположение команд по мере того, как находит их. С опцией .Fl r команда .Ic hash удаляет все записи из хэш-таблицы за исключением функций. .It Ic jobid Op Ar задание Выводит идентификаторы процессов в указанном задании. Если аргумент .Ar задание опущен, используется текущее задание. .It Ic jobs Oo Fl lps Oc Op Ar задание ... Выводит информацию об указанных заданиях или всех заданиях, если не указан аргумент .Ar задание . Выводимая информация включает в себя идентификатор задания, статус и имя команды. .Pp Если указана опция .Fl l , также выводится идентификатор процесса каждого задания. Если указана опция .Fl p , выводятся только идентификаторы процессов лидеров групп процессов, по одному на строку. Если указана опция .Fl s , выводятся только идентификаторы процессов, по одному на строку. .It Ic local Oo Ar переменная ... Oc Op Fl Смотрите раздел .Sx Функции . .It Ic pwd Op Fl L | P Выводит путь текущего каталога. Встроенная команда может отличаться от программы с таким же именем, потому что встроенная команда помнит текущий каталог, а не вычисляет его каждый раз. Это делает её быстрее. Однако, если текущий каталог переименовывается, встроенная версия .Xr pwd 1 продолжит выводить старое имя каталога. .Pp Если указана опция .Fl P , разыменовываются символические ссылки. Если указана опция .Fl L , выводится представление оболочки о текущем каталоге (символические ссылки не разыменовываются). Это стандартное поведение. .It Ic read Oo Fl p Ar приглашение Oc Oo .Fl t Ar таймаут Oc Oo Fl er Oc Ar переменная ... Если указана опция .Fl p и стандартный ввод является терминалом, выдаётся .Ar приглашение . Затем со стандартного ввода читается строка. Замыкающий символ новой строки удаляется, и строка разбивается, как описано в разделе .Sx Разделение пробельными символами (разбиение на поля) выше, и полученные части присваиваются переменным по порядку. Если частей больше чем переменных, оставшиеся части (вместе с символами из .Va IFS , которые их разделяют), присваиваются последней переменной. Если переменных больше чем частей, оставшимся переменным присваивается пустая строка. .Pp Обратные косые черты интерпретируются специальным образом, если не указана опция .Fl r . Если за обратной косой чертой следует символ новой строки, обратная косая черта и символ новой строки удаляются. Если за обратной косой чертой следует какой-либо другой символ, обратная косая черта удаляется, а следующий за ней символ интерпретируется так, как если бы он не содержался в .Va IFS , даже если на самом деле он там есть. .Pp Если указана опция .Fl t , и .Ar таймаут истёк прежде, чем был осуществлён ввод, команда .Ic read возвращает статус завершения 1 и не делает никаких присваиваний. Значение аргумента .Ar таймаут может необязательно сопровождаться одним из символов .Ql s , .Ql m или .Ql h , что явно обозначает секунды, минуты или часы. Если такой символ не указан, подразумевается .Ql s . .Pp Опция .Fl e существует только для обратной совместимости со старыми сценариями. .It Ic readonly Oo Fl p Oc Op Ar имя ... Каждое указанное .Ar имя помечается как .Dq "только для чтения" так, что оно не может быть в последствии изменено или сделано неустановленным. Оболочка позволяет установить значение переменной одновременно с пометкой его как .Dq "только для чтения" , с помощью такой формы: .Pp .D1 Ic readonly Ar имя Ns = Ns Ar значение .Pp Без аргументов команда .Ic readonly перечисляет имена всех переменных .Dq "только для чтения" . Если указана опция .Fl p , переменные .Dq "только для чтения" выводятся в виде строк .Dq Ic readonly Ar имя Ns = Ns Ar значение , пригодном для повторного ввода в оболочку. .It Ic return Op Ar статус_завершения Смотрите раздел .Sx Функции . .It Ic set Oo Fl /+abCEefIimnpTuVvx Oc Oo Fl /+o Ar длинное_имя Oc Oo .Fl c Ar строка Oc Op Fl - Ar аргумент ... Команда .Ic set выполняет три разных функции: .Bl -item .It Без аргументов она перечисляет значения всех переменных оболочки. .It Если указаны опции, либо в короткой форме, либо в длинной форме .Dq Fl /+o Ar длинное_имя , она устанавливает или сбрасывает указанные опции, как описано в разделе .Sx Обработка списка аргументов . .It Если указана опция .Dq Fl - , .Ic set заменяет позиционные параметры оболочки последующими аргументами. Если за опцией .Dq Fl - не следуют аргументы, все позиционные параметры сбрасываются, что эквивалентно выполнению команды .Dq Li "shift $#" . Флаг .Dq Fl - может быть опущен, если аргументы предназначаются для замещения позиционных параметров. Это не рекомендуется, так как первый аргумент может начинаться с тире .Pq Ql - или плюса .Pq Ql + , которые команда .Ic set интерпретирует как запрос на установку или сброс опций. .El .It Ic setvar Ar переменная значение Назначает указанное .Ar значение указанной переменной. Команда .Ic setvar предназначена для использования в функциях, присваивающих значения переменным, чьи имена передаются как параметры. В общем случае лучше писать .Dq Ar переменная Ns = Ns Ar значение нежели использовать .Ic setvar . .It Ic shift Op Ar n Сдвигает позиционные параметры .Ar n раз, или один раз, если .Ar n не указано. Сдвиг устанавливает значение .Li $1 в значение .Li $2 , значение .Li $2 в значение .Li $3 , и так далее, уменьшая значение .Li $# на единицу. Если позиционных параметров нет, сдвиг не делает ничего. .It Ic test Встроенный эквивалент .Xr test 1 . .It Ic times Выводит количество времени, потраченное на выполнение оболочки и её потомков. Первая строка вывода показывает пользовательское и системное время для самой оболочки, вторая \[em] для потомков. .It Ic trap Oo Ar действие Oc Ar сигнал ... .It Ic trap Fl l Велит оболочке разобрать и выполнить .Ar действие при получении любого из указанных сигналов. Сигналы указываются либо по имени, либо по номеру. Кроме того, чтобы задать .Ar действие , выполняемое при завершении оболочки, можно воспользоваться псевдо-сигналом .Cm EXIT . Аргумент .Ar действие может быть пустой строкой или тире .Pq Ql - ; первое означает игнорировать указанный сигнал, второе \[em] выполнять действие по умолчанию. Пропуск аргумента .Ar действие также означает выполнение действия по умолчанию, хотя из соображений совместимости такая форма не рекомендуется. Когда оболочка запускает дочернюю оболочку, она сбрасывает перехваченные (но не игнорируемые) сигналы в стандартные действия. Команда .Ic trap не влияет на сигналы, игнорируемые на момент входа в оболочку. .Pp С опцией .Fl l команда .Ic trap выведет список допустимых имён сигналов. .It Ic true Пустая команда, возвращающая статус завершения 0 (истина). .It Ic type Op Ar имя ... Интерпретирует каждое .Ar имя как команду и выводит результат поиска команды. Возможные результаты такие: shell keyword, alias, shell built-in command, command, tracked alias и not found. Для псевдонимов выводится их значение; для команд и отслеживаемых псевдонимов выводится полный путь к команде. .It Ic ulimit Oo Fl HSabcdflmnstuv Oc Op Ar ограничение Устанавливает или показывает ограничения на ресурсы (см.\& .Xr getrlimit 2 ) . Если указано .Ar ограничение , указанный ресурс будет установлен; в противном случае выведется текущее значение ресурса. .Pp Если указана опция .Fl H , устанавливаются или показываются жёсткие ограничения. В то время как всем разрешено уменьшать жёсткие ограничения, только суперпользователь может их увеличить. Если указана опция .Fl S , используются мягкие ограничения. При выводе ограничений может быть задана только одна из опций .Fl S или .Fl H . По умолчанию показываются мягкие ограничения, а устанавливаются и мягкие, и жёсткие ограничения. .Pp С опцией .Fl a команда .Ic ulimit выводит все ресурсы. Параметр .Ar ограничение в этом режиме неприемлем. .Pp Остальные опции указывают, значение какого ресурса должно быть показано или изменено. Они взаимоисключающие. .Bl -tag -width indent .It Fl b Ar sbsize Максимальный размер использования буфера сокетов в байтах. .It Fl c Ar coredumpsize Максимальный размер файлов дампа памяти в блоках по 512 байт. .It Fl d Ar datasize Максимальный размер сегмента данных процесса в килобайтах. .It Fl f Ar filesize Максимальный размер файла в блоках по 512 байт. .It Fl l Ar lockedmem Максимальный размер памяти, которая может быть заблокирована процессом, в килобайтах. .It Fl m Ar memoryuse Максимальный размер резидентной памяти процесса в килобайтах. .It Fl n Ar nofiles Максимальное количество дескрипторов, которые может открыть процесс. .It Fl s Ar stacksize Максимальный размер сегмента стека в килобайтах. .It Fl t Ar time Максимальное количество процессорного времени, которое может использовать каждый процесс, в секундах. .It Fl u Ar userproc Максимальное количество одновременно выполняющихся процессов для этого идентификатора пользователя. .It Fl v Ar virtualmem Максимальный виртуальный размер процесса в килобайтах. .El .It Ic umask Oo Fl S Oc Op Ar маска Устанавливает маску создания файлов (см.\& .Xr umask 2 ) в восьмеричное или символическое (см.\& .Xr chmod 1 ) значение, указанное в аргументе .Ar маска . Если аргумент пропущен, выводится текущее значение маски. Если указана опция .Fl S , вывод имеет символический вид, иначе \[em] восьмеричный. .It Ic unalias Oo Fl a Oc Op Ar имя ... Удаляет указанные псевдонимы. Если указана опция .Fl a , удаляются все псевдонимы. .It Ic unset Oo Fl fv Oc Ar имя ... Указанные переменные или функции становятся неустановленными и неэкспортируемыми. Если указана опция .Fl v , или не указано опций вообще, аргументы .Ar имя интерпретируются как имена переменных. Если указана опция .Fl f , аргументы .Ar имя интерпретируются как имена функций. .It Ic wait Op Ar задание Ждать завершения указанного задания и вернуть статус завершения последнего процесса в задании. Если аргумент опущен, ждать завершения всех заданий и вернуть статус завершения ноль. .El .Ss Редактирование командной строки При интерактивном использовании .Nm из терминала, текущая команда и история команд (см.\& .Ic fc в разделе .Sx Встроенные команды ) могут редактироваться в .Nm vi Ns -режиме редактирования командной строки. Этот режим использует команды подобно подмножеству команд, описанных в странице справочника .Xr vi 1 . Команда .Dq Li "set -o vi" (или .Dq Li "set -V" ) включает .Nm vi Ns -режим редактирования и переключает .Nm в режим ввода .Nm vi . При включённом режиме .Nm vi , .Nm может переключаться между режимом ввода и командным режимом клавишей .Aq ESC . Нажатие .Aq ввода в командном режиме передаёт строку на обработку оболочке. .Pp Подобным образом команда .Dq Li "set -o emacs" (или .Dq Li "set -E" ) может быть использована для включения подмножества возможностей редактирования командной строки в стиле .Nm emacs . .Sh ОКРУЖЕНИЕ Следующие переменные окружения влияют на выполнение .Nm : .Bl -tag -width ".Ev HISTSIZE" .It Ev CDPATH Пути для поиска, используемые встроенной командой .Ic cd . .It Ev EDITOR Запасной редактор, используемый встроенной командой .Ic fc . Если переменная не установлена, то редактором по умолчанию является .Xr ed 1 . .It Ev FCEDIT Редактор по умолчанию, используемый встроенной командой .Ic fc . .It Ev HISTSIZE Количество доступных предыдущих команд. .It Ev HOME Начальный каталог .Nm . .It Ev IFS Разделители полей ввода. Переменная обычно установлена в .Aq пробел , .Aq табуляцию и .Aq символ новой строки . Подробнее смотрите раздел .Sx Разделение пробельными символами . .It Ev MAIL Имя файла с почтой, которое проверяется на предмет поступления новой почты. .Ev MAILPATH имеет больший приоритет. .It Ev MAILPATH Разделённый двоеточиями .Pq Ql \&: список имён файлов, в которых оболочка проверяет входящую почту. Эта переменная окружения имеет больший приоритет, чем .Ev MAIL . Одновременно может проверяться не более 10 почтовых ящиков. .It Ev PATH Путь поиска исполняемых файлов по умолчанию. Подробнее смотрите раздел .Sx Поиск пути . .It Ev PS1 Первичная строка приглашения, значение по умолчанию которой .Dq Li "$ " , если вы не суперпользователь, и .Dq Li "# " , если суперпользователь. .It Ev PS2 Вторичная строка приглашения, значение по умолчанию которой .Dq Li "> " . .It Ev PS4 Префикс для вывода трассировки (если активирован .Fl x ) . По умолчанию .Dq Li "+ " . .It Ev TERM Терминал по умолчанию для оболочки. Эта установка наследуется дочерними процессами оболочки, и используется в режиме редактирования истории. .El .Sh СТАТУС ЗАВЕРШЕНИЯ Когда оболочка обнаруживает ошибки, такие как синтаксические, она завершается с ненулевым статусом завершения. Если оболочка неинтерактивная, выполнение файла оболочки прерывается. В противном случае, оболочка вернёт статус завершения последней выполненной команды, или, если была использована встроенная команда .Ic exit с числовым аргументом, оболочка вернёт этот аргумент. .Sh СМОТРИ ТАКЖЕ .Xr builtin 1 , .Xr chsh 1 , .Xr echo 1 , .Xr ed 1 , .Xr emacs 1 , .Xr expr 1 , .Xr getopt 1 , .Xr pwd 1 , .Xr test 1 , .Xr vi 1 , .Xr execve 2 , .Xr getrlimit 2 , .Xr umask 2 , .Xr editrc 5 .Sh ИСТОРИЯ Команда .Nm , оболочка Thompson, появилась в .At v1 . Она была вытеснена в .At v7 оболочкой Bourne, которая унаследовала имя .Nm . .Pp Эта версия .Nm была переписана в 1989 году под лицензией .Bx по образу и подобию оболочки Bourne из .At V.4 . .Sh АВТОРЫ Эту версию .Nm изначально написал .An Kenneth Almquist . .Sh ПРОБЛЕМЫ Утилита .Nm не распознаёт мультибайтовые символы.