- НАЗВАНИЕ
- СИНТАКСИС
- ОПИСАНИЕ
- обзор
- мольба
- Обработка списка аргументов
- квотирование
- бэкслэш
- Одинарные кавычки
- Двойные кавычки
- Зарезервированные слова
- Псевдонимы
- команды
- Простые команды
- Поиск и выполнение
- Поиск пути
- Сложные команды
- Трубопроводы
- Фоновые команды -
- Списки - вообще говоря
- Операторы списка коротких замыканий
- Flow-Control Constructs - если, в то время как, для случая
- Группировка команд вместе
- Переменные и параметры
- Позиционные параметры
- Специальные параметры
- Расширение тильды (подстановка домашнего каталога пользователя)
- Расширение параметра
- Арифметическое Расширение
- Расщепление пустого пространства (Расщепление поля)
- Расширение пути (Генерация имени файла)
- Оболочки
- Встроенные команды
- Редактирование командной строки
НАЗВАНИЕ
sh – интерпретатор команд (оболочка)
СИНТАКСИС
sh [- /+ aCefnuvxIimqsVEbc ] [- o длинное имя ] -words [ target … ]
ОПИСАНИЕ
Sh – стандартный интерпретатор команд для системы. Текущая версия sh находится в процессе изменения в соответствии со спецификациями POSIX 1003.2 и 1003.2a для оболочки. Эта версия имеет много особенностей, которые делают ее похожей в некоторых отношениях на оболочку Korn, но это не клон оболочки Korn (см. Ksh (1)). В эту оболочку включены только функции, обозначенные POSIX , а также несколько расширений Беркли. Мы ожидаем соответствия POSIX к моменту выпуска 4.4 BSD. Эта страница руководства не предназначена для обучения или полной спецификации оболочки.
обзор
Оболочка – это команда, которая читает строки из файла или терминала, интерпретирует их и, как правило, выполняет другие команды. Это программа, которая запускается, когда пользователь входит в систему (хотя пользователь может выбрать другую оболочку с помощью команды chsh (1)). В оболочке реализован язык, который имеет конструкции управления потоком, средство макросов, которое предоставляет множество функций в дополнение к хранилищу данных, а также встроенные возможности редактирования истории и строк. Он включает в себя множество функций, помогающих интерактивному использованию, и имеет то преимущество, что язык интерпретации является общим как для интерактивного, так и для неинтерактивного использования (сценарии оболочки). То есть команды могут быть набраны непосредственно в работающей оболочке или могут быть помещены в файл, и файл может быть выполнен непосредственно оболочкой.
мольба
Если аргументы отсутствуют, и если стандартный вход оболочки подключен к терминалу (или если установлен флаг – i ), а параметр – c отсутствует В настоящее время оболочка считается интерактивной оболочкой. Интерактивная оболочка обычно запрашивает перед каждой командой и по-разному обрабатывает ошибки программирования и команд (как описано ниже). При первом запуске оболочка проверяет аргумент 0, и если он начинается с тире `- ‘, оболочка также считается оболочкой входа в систему. Обычно это выполняется системой автоматически при первом входе пользователя в систему. Оболочка входа сначала считывает команды из файлов/etc/profile и .profile, если они существуют. Если переменная среды ENV установлена при входе в оболочку или установлена в .profile оболочки входа в систему, оболочка затем читает команды из файла, названного в ENV . Поэтому пользователь должен помещать команды, которые должны выполняться только во время входа в систему, в файл .profile, а также команды, которые выполняются для каждой оболочки внутри файла ENV . Чтобы установить переменную ENV для какого-либо файла, поместите следующую строку в свой .profile своего домашнего каталога
ENV = $ HOME/.shinit; экспорт ENV
заменяя “ .shinit ” любым именем файла, которое вы пожелаете. Поскольку файл ENV читается для каждого вызова оболочки, включая сценарии оболочки и неинтерактивные оболочки, следующая парадигма полезна для ограничения команд в файле ENV на интерактивные вызовы. Поместите команды в “ case ” и “ esac ” ниже (эти команды описаны ниже):
case $ – in * i *)
# команды только для интерактивного использования
…
ESAC
Если были указаны аргументы командной строки, помимо параметров, то оболочка обрабатывает первый аргумент как имя файла, из которого нужно прочитать команды (сценарий оболочки), а остальные аргументы задаются как позиционные параметры оболочки ($ 1 , $ 2 и т. Д.). В противном случае оболочка читает команды со своего стандартного ввода.
Обработка списка аргументов
Все параметры с одной буквой имеют соответствующее имя, которое можно использовать в качестве аргумента для параметра – o . Имя набора o указывается рядом с параметром из одной буквы в приведенном ниже описании. Указание дефиса “ – ” включает опцию, в то время как использование плюса “ + ” отключает опцию. Следующие параметры могут быть установлены из командной строки или с помощью встроенной функции set (1) (описанной ниже).
-a allexport
Экспортируйте все переменные, назначенные для. (НЕОБХОДИМО для 4,4 альфа)
-c
Читайте команды из командной строки. Никакие команды не будут считываться со стандартного ввода.
-C NoClobber
Не перезаписывайте существующие файлы с помощью “> ” (НЕОБХОДИМЫЙ для 4.4alpha)
-e errexit
Если он не интерактивный, немедленно завершите работу, если какая-либо непроверенная команда не удаласьСтатус выхода команды считается явным образом протестированным, если команда используется для управления if elif while или до или если команда левый операнд оператора “ && ” или “ || ”.
-f noglob
Отключить расширение пути
-n поехес
Если не интерактивные, прочитайте команды, но не выполняйте их. Это полезно для проверки синтаксиса сценариев оболочки.
-u nounset
Напишите сообщение о стандартной ошибке при попытке развернуть переменную, которая не установлена, и, если оболочка не является интерактивной, немедленно завершите работу. (НЕОБХОДИМО для 4,4 альфа)
-v многословным
Оболочка записывает свой ввод в стандартную ошибку при чтении. Полезно для отладки.
-x xtrace
Запишите каждую команду в стандартную ошибку (которой предшествует `+ ‘перед выполнением. Полезно для отладки.
-q quietprofile
Если были установлены параметры – v или – x , не применяйте их при чтении файлов инициализации, это файл/etc/profile .profile и файл, указанный в < Переменная окружения strong> ENV .
-I IGNOREEOF
Игнорировать EOF от ввода в интерактивном режиме.
-i интерактивными
Заставьте оболочку вести себя интерактивно.
-m монитор
Включите управление заданиями (устанавливается автоматически при работе в интерактивном режиме).
-s STDIN
Чтение команд из стандартного ввода (устанавливается автоматически, если нет файловых аргументов). Этот параметр не действует, если он установлен после того, как оболочка уже запущена (т.е. с set (1)).
-V VI
Включите встроенный редактор командной строки vi (1) (отключает – E , если он был установлен).
-E Emacs
Включить встроенный редактор командной строки emacs (1) (отключает – V , если он был установлен).
-b уведомит
Включить асинхронное уведомление о завершении фонового задания. (НЕОБХОДИМО для 4,4 альфа)
Лексическая структура
Оболочка считывает ввод в виде строк из файла и разбивает его на слова в пробелах (пробелы и табуляции), а также в определенных последовательностях символов, которые являются специальными для оболочки и называются “ операторами ”. Существует два типа операторов: управляющие операторы и операторы перенаправления (их значение обсуждается позже). Ниже приведен список операторов:
“Операторы управления:”
& && (); ;; | ||
“Оператор перенаправления:”
> | <> & << -
квотирование
Кавычки используются для удаления специального значения определенных символов или слов в оболочке, таких как операторы, пробелы или ключевые слова. Существует три типа цитирования: одинарные кавычки, двойные кавычки и обратный слеш.
бэкслэш
Обратная косая черта сохраняет буквальное значение следующего символа, за исключением Aq новой строки. Обратная косая черта, предшествующая символу новой строки Aq, рассматривается как продолжение строки.
Одинарные кавычки
Заключение символов в одинарные кавычки сохраняет буквальное значение всех символов (кроме одинарных кавычек, что делает невозможным помещать одинарные кавычки в строку в одинарных кавычках).
Двойные кавычки
Заключение символов в двойные кавычки сохраняет буквальное значение всех символов, за исключением Dollign ($), backquote (`) и обратную косую черту (\). Обратная косая черта внутри двойных кавычек исторически странна и служит для того, чтобы заключать в кавычки только следующие символы:
$ `\
В противном случае это остается буквальным.
Зарезервированные слова
Зарезервированные слова - это слова, которые имеют особое значение для оболочки и распознаются в начале строки и после управляющего оператора. Ниже приведены зарезервированные слова:
! Та элиф Та фи Та в то время как Та дело
еще Та для Та, то Та {Та}
делай Та делай та до та если та эсак
Их значение обсуждается позже.
Псевдонимы
Псевдоним - это имя и соответствующее значение, установленное с помощью встроенной команды alias (1). Всякий раз, когда зарезервированное слово может появиться (см. Выше) и после проверки зарезервированных слов, оболочка проверяет слово, чтобы увидеть, соответствует ли оно псевдониму. Если это так, он заменяет его во входном потоке своим значением. Например, если существует псевдоним `lf 'со значением` ls -F' ', то ввод:
lf foobar
станет
ls -F foobar
Псевдонимы предоставляют наивным пользователям удобный способ создания сокращений для команд без необходимости изучать, как создавать функции с аргументами.Они также могут быть использованы для создания лексически неясного кода. Это использование не рекомендуется.
команды
Оболочка интерпретирует слова, которые она читает, в соответствии с языком, спецификация которого выходит за рамки этой справочной страницы (см. BNF в документе POSIX 1003.2). По сути, строка читается, и если первое слово строки (или после управляющего оператора) не является зарезервированным словом, то оболочка распознала простую команду. В противном случае может быть распознана сложная команда или какая-то другая специальная конструкция.
Простые команды
Если простая команда была распознана, оболочка выполняет следующие действия:
-
Ведущие слова вида `` имя = значение '' удаляются и присваиваются среде простой команды. Операторы перенаправления и их аргументы (как описано ниже) удаляются и сохраняются для обработки.
-
Остальные слова раскрываются, как описано в разделе «Расширения», и первое оставшееся слово считается именем команды, а команда находится. Остальные слова считаются аргументами команды. Если имя команды не было получено, то назначения переменных `` name = value '', распознаваемые в пункте 1, влияют на текущую оболочку.
-
Перенаправления выполняются, как описано в следующем разделе.
Перенаправления
Перенаправления используются для изменения того, где команда читает свой ввод или отправляет свой вывод. Как правило, перенаправления открывают, закрывают или дублируют существующую ссылку на файл. Общий формат, используемый для перенаправления:
[n] redir-op file
где redir-op является одним из операторов перенаправления, упомянутых ранее. Ниже приведен список возможных перенаправлений. Bq n - необязательный номер, как в `3 '(не` Bq 3', который относится к дескриптору файла).
[n]> файл
Перенаправить стандартный вывод (или n) в файл.
[n]> | файл
То же самое, но переопределите параметр - C .
[n] >> файл
Добавить стандартный вывод (или n) в файл.
[n] <файл
Перенаправить стандартный ввод (или n) из файла.
[n1] <& n2
Дублирование стандартного ввода (или n1) из файлового дескриптора n2.
[n] <& -
Закройте стандартный ввод (или n).
[n1]> & n2
Дублируйте стандартный вывод (или n1) из n2.
[n]> & -
Закройте стандартный вывод (или n).
[n] файл
Открыть файл для чтения и записи на стандартный ввод (или n).
Следующее перенаправление часто называют `` here-document ''
[n] << разделитель
здесь-док-текст ...
Разделитель
Весь текст в последовательных строках вплоть до разделителя сохраняется и становится доступным команде при стандартном вводе или файловом дескрипторе n, если он указан. Если разделитель, указанный в начальной строке, заключен в кавычки, то текст here-doc обрабатывается буквально, в противном случае текст подвергается расширению параметров, подстановке команд и арифметическому расширению (как описано в разделе «Расширения»). 'Если оператором является `` << -' 'вместо `` <<' ', тогда ведущие вкладки в тексте here-doc удаляются.
Поиск и выполнение
Существует три типа команд: функции оболочки, встроенные команды и обычные программы - и команда ищется (по имени) в этом порядке. Каждый из них выполнен по-своему.
Когда выполняется функция оболочки, все позиционные параметры оболочки (кроме $ 0, который остается неизменным) устанавливаются в качестве аргументов функции оболочки. Переменные, которые явно помещаются в окружение команды (размещая присваивания им перед именем функции), становятся локальными для функции и устанавливаются в заданные значения. Затем выполняется команда, указанная в определении функции. Позиционные параметры восстанавливаются до их первоначальных значений после завершения команды. Все это происходит в текущей оболочке.
Встроенные функции оболочки выполняются внутри оболочки без создания нового процесса.
В противном случае, если имя команды не соответствует функции или встроенной функции, команда ищется как обычная программа в файловой системе (как описано в следующем разделе). Когда выполняется обычная программа, оболочка запускает программу, передавая ей аргументы и среду. Если программа не является обычным исполняемым файлом (т. Е. Если она не начинается с "магического числа", чье представление ASCII равно "#!", То execve (2) возвращает Er ENOEXEC, то) Оболочка будет интерпретировать программу в подоболочке.В этом случае дочерняя оболочка будет повторно инициализировать себя, так что эффект будет таким, как если бы была вызвана новая оболочка для обработки специального сценария оболочки, за исключением того, что расположение хеш-команд, расположенных в родительской оболочке, будет запомнено ребенок.
Обратите внимание, что предыдущие версии этого документа и сам исходный код вводят в заблуждение и время от времени называют сценарий оболочки без магического числа «процедурой оболочки».
Поиск пути
При нахождении команды оболочка сначала проверяет, есть ли у нее функция оболочки с таким именем. Затем он ищет встроенную команду с таким именем. Если встроенная команда не найдена, происходит одно из двух:
-
Имена команд, содержащие косую черту, просто выполняются без каких-либо поисков.
-
Оболочка выполняет поиск каждой записи в PATH по очереди. Значение переменной PATH должно представлять собой серию записей, разделенных двоеточиями. Каждая запись состоит из имени каталога. Текущий каталог может быть указан неявно пустым именем каталога или явно через один период.
Состояние выхода из команды
Каждая команда имеет статус выхода, который может влиять на поведение других команд оболочки. Парадигма состоит в том, что команда завершается с нулем для нормального или успешного выполнения и ненулевым для сбоя, ошибки или ложного указания. Страница man для каждой команды должна указывать различные коды выхода и их значение. Кроме того, встроенные команды возвращают коды выхода, как и выполняемая функция оболочки.
Сложные команды
Сложные команды - это комбинации простых команд с управляющими операторами или зарезервированными словами, которые вместе создают большую сложную команду. В более общем смысле команда является одним из следующих:
- простая команда
- трубопровод
- список или составной список
- составная команда
- определение функции
Если не указано иное, состояние выхода команды - это состояние последней простой команды, выполненной командой.
Трубопроводы
Конвейер представляет собой последовательность из одной или нескольких команд, разделенных оператором управления |. Стандартный вывод всех команд, кроме последней, связан со стандартным вводом следующей команды. Стандартный вывод последней команды наследуется от оболочки, как обычно.
Формат для конвейера:
[!] command1 [| command2 ...]
Стандартный вывод команды 1 связан со стандартным вводом команды 2. Считается, что стандартный ввод, стандартный вывод или обе команды назначаются конвейером перед любым перенаправлением, указанным операторами перенаправления, которые являются частью команды.
Если конвейер не находится в фоновом режиме (обсуждается позже), оболочка ожидает завершения всех команд.
Если зарезервированное слово! не предшествует конвейеру, состояние выхода - это состояние выхода последней команды, указанной в конвейере. В противном случае, статус выхода - это логическое НЕ статуса выхода последней команды. То есть, если последняя команда возвращает ноль, статус выхода равен 1; если последняя команда возвращает больше нуля, статус выхода равен нулю.
Поскольку конвейерное присвоение стандартного ввода или стандартного вывода или того и другого происходит перед перенаправлением, его можно изменить перенаправлением. Например:
$ command1 2> & 1 | command2
отправляет как стандартный вывод, так и стандартную ошибку command1 на стандартный ввод command2.
А; или терминатор заставляет предыдущий И-ИЛИ-список (описанный далее) выполняться последовательно; & вызывает асинхронное выполнение предыдущего И-ИЛИ-списка.
Обратите внимание, что в отличие от некоторых других оболочек, каждый процесс в конвейере является дочерним элементом вызывающей оболочки (если только это не встроенная оболочка, в этом случае она выполняется в текущей оболочке - но любой эффект, который он оказывает на среду, стирается).
Фоновые команды -
Если команда завершена оператором управления амперсандом (&), оболочка выполняет команду асинхронно, то есть оболочка не ожидает завершения команды перед выполнением следующей команды.
Формат для запуска команды в фоновом режиме:
command1 & [command2 & ...]
Если оболочка не является интерактивной, стандартный ввод асинхронной команды устанавливается в/dev/null
Списки - вообще говоря
Список - это последовательность из нуля или более команд, разделенных символами новой строки, точкой с запятой или амперсандом и, возможно, оканчивающихся одним из этих трех символов. Команды в списке выполняются в порядке их написания. Если за командой следует амперсанд, оболочка запускает команду и немедленно переходит к следующей команде; в противном случае команда ожидает завершения команды, прежде чем перейти к следующей.
Операторы списка коротких замыканий
`` && '' и `` || '' - операторы списка AND-OR.`&& 'выполняет первую команду, а затем выполняет вторую команду, если состояние выхода первой команды равно нулю. `` || '' аналогичен, но выполняет вторую команду, если состояние выхода первой команды не равно нулю. `` && '' и `` || '' имеют одинаковый приоритет.
Flow-Control Constructs - если, в то время как, для случая
Синтаксис команды if
если список
затем список
[список элифов
затем список] ...
[еще список]
fi
Синтаксис команды while:
while list
сделать список
сделано
Два списка выполняются многократно, в то время как состояние выхода первого списка равно нулю. Команда before аналогична, но содержит слово while вместо вместо while, что заставляет ее повторяться до тех пор, пока состояние выхода первого списка не станет равным нулю.
Синтаксис команды for:
для переменной в слове ...
сделать список
сделано
Слова расширяются, и затем список выполняется многократно с переменной, установленной для каждого слова по очереди. do и done могут быть заменены на `` {'' и ``} ''
Синтаксис команды break и continue:
break [num]
continue [num]
Перерыв завершает num внутри петли или во время цикла. Продолжение продолжается со следующей итерации внутреннего цикла. Они реализованы как встроенные команды.
Синтаксис команды case:
регистр в
pattern) list ;;
...
esac
Шаблон может фактически быть одним или несколькими шаблонами (см. Шаблоны оболочки, описанные ниже), разделенными символами `` '.
Группировка команд вместе
Команды могут быть сгруппированы, написав либо
(список)
или же
{list;
Первый из них выполняет команды в подоболочке. Встроенные команды, сгруппированные в (список), не влияют на текущую оболочку. Вторая форма не разворачивает другую оболочку, поэтому она немного более эффективна. Группирование команд таким образом позволяет вам перенаправить их вывод, как если бы они были одной программой:
{printf привет; printf world \ n ";}> приветствие
функции
Синтаксис определения функции
name () команда
Определение функции - это исполняемый оператор; при выполнении он устанавливает функцию с именем name и возвращает нулевой статус завершения. Команда обычно представляет собой список, заключенный между `` {'' и ``} ''
Переменные могут быть объявлены как локальные для функции с помощью локальной команды. Это должно появиться как первый оператор функции, а синтаксис
local [variable | -] ...
Local реализован в виде встроенной команды.
Когда переменная становится локальной, она наследует начальное значение и экспортирует и помечает только для чтения переменную с тем же именем в окружающей области, если она есть. В противном случае переменная изначально не установлена. В оболочке используется динамическая область видимости, так что если вы сделаете переменную x локальной для функции f, которая затем вызывает функцию g, ссылки на переменную x, сделанные внутри g, будут ссылаться на переменную x, объявленную внутри f, а не на глобальную переменную с именем x ,
Единственный специальный параметр, который можно сделать локальным, - это `` - ''. Делая `` - '' локальным, любые параметры оболочки, которые изменяются с помощью команды set внутри функции, восстанавливаются до их первоначальных значений, когда функция возвращается.
Синтаксис команды возврата
return [exitstatus
Завершает текущую выполняемую функцию. Возврат реализован как встроенная команда.
Переменные и параметры
Оболочка поддерживает набор параметров. Параметр, обозначаемый именем, называется переменной. При запуске оболочка превращает все переменные среды в переменные оболочки. Новые переменные могут быть установлены с помощью формы
имя = значение
Переменные, установленные пользователем, должны иметь имя, состоящее исключительно из букв, цифр и подчеркиваний, причем первое из них не должно быть числовым. Параметр также может быть обозначен числом или специальным символом, как описано ниже.
Позиционные параметры
Позиционный параметр - это параметр, обозначаемый числом (n> 0). Оболочка устанавливает их изначально в значения аргументов командной строки, которые следуют за именем сценария оболочки. Встроенная функция set (1) также может быть использована для их установки или сброса.
Специальные параметры
Специальный параметр - это параметр, обозначаемый одним из следующих специальных символов. Значение параметра указано рядом с его символом.
*
Расширяется до позиционных параметров, начиная с единицы. Когда раскрытие происходит в строке, заключенной в двойные кавычки, оно расширяется до одного поля со значением каждого параметра, разделенного первым символом переменной IFS или if IFS Не установлено.
@
Расширяется до позиционных параметров, начиная с единицы. Когда раскрытие происходит в двойных кавычках, каждый позиционный параметр раскрывается как отдельный аргумент. Если позиционных параметров нет, расширение @ генерирует нулевые аргументы, даже если @ заключено в двойные кавычки. Например, это в основном означает, что если $ 1 равно abc, а $ 2 def ghi, то Qq $ @ расширяется до двух аргументов:
а жзи
#
Расширяется до количества позиционных параметров.
Расширяется до состояния выхода самого последнего конвейера.
- (Дефис.)
Расширяется до флагов текущей опции (имена букв из одной буквы объединяются в строку), как указано при вызове, с помощью встроенной команды set или неявно с помощью оболочки.
$
Расширяется до идентификатора процесса вызванной оболочки. Подоболочка сохраняет то же значение $, что и ее родитель.
Расширяется до идентификатора процесса самой последней фоновой команды, выполняемой из текущей оболочки. Для конвейера ID процесса - это последняя команда в конвейере.
0 (ноль.)
Расширяется до имени оболочки или сценария оболочки.
Расширения слов
В этом разделе описываются различные расширения, которые выполняются над словами. Не все расширения выполняются для каждого слова, как будет объяснено позже.
Расширения тильды, расширения параметров, подстановки команд, арифметические расширения и удаления кавычек, которые происходят в одном слове, расширяются до одного поля. Только разделение полей или расширение пути может создать несколько полей из одного слова. Единственным исключением из этого правила является расширение специального параметра @ в двойных кавычках, как было описано выше.
Порядок расширения слова:
-
Расширение тильды, расширение параметров, подстановка команд, арифметическое расширение (все это происходит одновременно).
-
Разделение полей выполняется для полей, созданных на шаге (1), если переменная IFS не равна нулю.
-
Расширение пути (если не установлено - действует f ).
-
Удаление цитаты.
Символ $ используется для введения раскрытия параметров, подстановки команд или арифметической оценки.
Расширение тильды (подстановка домашнего каталога пользователя)
Слово, начинающееся с символа кавычки без кавычек (~), подвергается расширению тильды. Все символы до косой черты (/) или конца слова рассматриваются как имя пользователя и заменяются домашним каталогом пользователя. Если имя пользователя отсутствует (как в ~/foobar), тильда заменяется значением переменной HOME (домашний каталог текущего пользователя).
Расширение параметра
Формат для расширения параметров выглядит следующим образом:
<До> $ {выражение}
где выражение состоит из всех символов до тех пор, пока соответствующий “} ” любой “} ” не будет экранирован обратной косой чертой или в строке в кавычках, а символы во встроенных арифметических расширениях, подстановках команд и расширениях переменных не проверяются при определении соответствие “} ”
Простейшая форма для расширения параметров:
$ {параметр}
Значение параметра, если оно есть, подставляется.
Имя или символ параметра могут быть заключены в фигурные скобки, которые являются необязательными, за исключением позиционных параметров с более чем одной цифрой или когда за параметром следует символ, который можно интерпретировать как часть имени. Если расширение параметра происходит внутри двойных кавычек:
-
Расширение пути не выполняется по результатам расширения.
-
Разделение полей не производится по результатам расширения, за исключением @.
Кроме того, расширение параметра может быть изменено с использованием одного из следующих форматов.
$ {параметр: -слово}
Используйте значения по умолчанию. Если параметр не установлен или ноль, расширение слова заменяется; в противном случае значение параметра подставляется.
$ {параметр: = слово}
Назначить значения по умолчанию. Если параметр не установлен или равен нулю, расширение слова присваивается параметру. Во всех случаях окончательное значение параметра подставляется. Таким образом могут быть назначены только переменные, а не позиционные параметры или специальные параметры.
$ {параметр: [слово]}
Укажите ошибку, если ноль или не установлен. Если параметр не установлен или имеет значение NULL, расширение слова (или сообщение, указывающее, что оно не установлено, если слово пропущено) записывается со стандартной ошибкой, и оболочка завершается с ненулевым состоянием выхода. В противном случае значение параметра подставляется. Интерактивная оболочка не должна выходить.
$ {параметр: + слово}
Используйте альтернативное значение.Если параметр не установлен или равен нулю, подставляется ноль; в противном случае расширение слова заменяется.
В расширениях параметров, показанных ранее, использование двоеточия в формате приводит к проверке параметра, который не установлен или имеет значение null; пропуск двоеточия приводит к проверке параметра, который только не установлен.
$ {# параметр}
Длина строки. Длина в символах значения параметра.
Следующие четыре разновидности расширения параметров обеспечивают обработку подстроки. В каждом случае для сопоставления шаблонов используется нотация соответствия шаблону (см. Шаблоны оболочки), а не запись регулярного выражения. Если параметр * или @, результат раскрытия не указан. Заключение полной строки расширения параметра в двойные кавычки не приводит к заключению в кавычки следующих четырех разновидностей символов шаблона, тогда как заключенные в фигурные скобки символы имеют такой эффект.
$ {параметр% слово}
Удалить самый маленький шаблон суффикса. Слово расширено, чтобы произвести образец. Расширение параметра затем приводит к параметру с наименьшей частью суффикса, совпадающей с удаленным шаблоном.
$ {параметр %% слово}
Удалить самый большой шаблон суффикса. Слово расширено, чтобы произвести образец. Затем расширение параметра приводит к параметру, при этом наибольшая часть суффикса соответствует удаленному шаблону.
$ {параметр # слово}
Удалите самый маленький образец префикса. Слово расширено, чтобы произвести образец. Расширение параметра затем приводит к параметру, причем наименьшая часть префикса соответствует удаленному шаблону.
$ {параметр ## слово}
Удалить самый большой образец префикса. Слово расширено, чтобы произвести образец. Затем расширение параметра приводит к параметру, при этом наибольшая часть префикса соответствует удаленному шаблону.
Подстановка команд
Подстановка команд позволяет заменить вывод команды вместо самого имени команды. Подстановка команды происходит, когда команда заключена следующим образом:
$ (команда)
или Po “ обратная кавычка ” версия Pc:
`command`
Оболочка расширяет подстановку команд, выполняя команду в среде подоболочек и заменяя подстановку команд стандартным выводом команды, удаляя последовательности из одного или нескольких s в конце подстановки. (Встроенные s до конца вывода не удаляются; однако во время разделения поля они могут быть переведены в s, в зависимости от значения IFS и действующей цитаты.)
Арифметическое Расширение
Арифметическое расширение предоставляет механизм для оценки арифметического выражения и подстановки его значения. Формат для арифметического расширения следующий:
<До> $ ((выражение))
Выражение обрабатывается так, как если бы оно было в двойных кавычках, за исключением того, что двойные кавычки внутри выражения специально не обрабатываются. Оболочка раскрывает все токены в выражении для расширения параметров, подстановки команд и удаления кавычек.
Затем оболочка обрабатывает это как арифметическое выражение и подставляет значение выражения.
Расщепление пустого пространства (Расщепление поля)
После раскрытия параметров, подстановки команд и арифметического раскрытия оболочка сканирует результаты разложений и подстановок, которые не встречаются в двойных кавычках, для разделения полей и получения нескольких полей.
Оболочка обрабатывает каждый символ IFS как разделитель и использует разделители для разделения результатов расширения параметров и подстановки команд на поля.
Расширение пути (Генерация имени файла)
Если не установлен флаг – f , генерация имени файла выполняется после завершения разбиения слова. Каждое слово рассматривается как последовательность шаблонов, разделенных косой чертой. Процесс расширения заменяет слово именами всех существующих файлов, имена которых могут быть сформированы путем замены каждого шаблона строкой, соответствующей указанному шаблону. На это есть два ограничения: во-первых, шаблон не может соответствовать строке, содержащей косую черту, и, во-вторых, шаблон не может соответствовать строке, начинающейся с точки, если первый символ шаблона не является точкой. В следующем разделе описываются шаблоны, используемые как для расширения имени пути, так и для команды case (1).
Оболочки
Шаблон состоит из обычных символов, которые соответствуют друг другу, и метасимволов. Метасимволами являются “! ” “ * ” “? ” И “ [”. Эти символы теряют свое особое значение, если они заключены в кавычки. Когда выполняется подстановка команды или переменной, а знак доллара или обратные кавычки не заключаются в двойные кавычки, для этих символов сканируется значение переменной или вывод команды, и они превращаются в метасимволы.
Звездочка (“ * ”) соответствует любой строке символов. Знак вопроса соответствует любому отдельному символу. Левая скобка (“ [”) представляет класс символов. Конец символьного класса обозначается (“] ”), если “] ” отсутствует, тогда “ [” соответствует “ [”, а не вводит символьный класс. Класс символов соответствует любому символу в квадратных скобках. Диапазон символов может быть указан с помощью знака минус. Класс символов можно дополнить, сделав восклицательный знак первым символом класса символов.
Чтобы включить “] ‘в класс символов, сделайте его первым перечисленным символом (после “’ ‘, если есть). Чтобы включить знак минуса, сделайте его первым или последним в списке
Встроенные команды
В этом разделе перечислены встроенные команды, которые являются встроенными, поскольку они должны выполнять некоторые операции, которые не могут быть выполнены отдельным процессом. В дополнение к этому есть несколько других команд, которые могут быть встроены для эффективности (например, echo 1).
:
Нулевая команда, которая возвращает 0 (истинное) значение выхода.
. файл
Команды в указанном файле читаются и выполняются оболочкой.
псевдоним [ name [ = строка … ]]
Если указано имя = строка , оболочка определяет псевдоним имя со значением строка Если указано только имя , значение псевдонима name будет напечатано. Без аргументов встроенная функция псевдоним печатает имена и значения всех определенных псевдонимов (см. unalias) .
bg [ job] …
Продолжите указанные задания (или текущее задание, если задание не задано) в фоновом режиме.
команда команда arg …
Выполнить указанную встроенную команду. (Это полезно, когда у вас есть функция оболочки с тем же именем, что и встроенная команда.)
кд [<ет> Каталог ]
Переключиться в указанный каталог (по умолчанию $ HOME) , если запись для CDPATH появляется в среде команды cd или переменной оболочки CDPATH установлен, и имя каталога не начинается с косой черты, тогда в каталогах, перечисленных в CDPATH , будет выполнен поиск указанного каталога. Формат CDPATH такой же, как и у PATH . В интерактивной оболочке команда cd выведет имя каталога, в котором она находится. на самом деле переключается, если это отличается от имени, которое дал пользователь. Они могут отличаться либо потому, что использовался механизм CDPATH , либо потому, что символическая ссылка была пересечена.
Eval строка …
Объединить все аргументы с пробелами. Затем выполните повторный анализ и выполните команду.
exec [ команда arg … ]
Если команда не опущена, процесс оболочки заменяется указанной программой (которая должна быть реальной программой, а не встроенной оболочкой или функцией). Любые перенаправления в команде exec помечаются как постоянные, поэтому они не отменяются при завершении команды exec .
Выход [ статус_завершения ]
Завершить процесс оболочки. Если задано exitstatus , оно используется в качестве состояния выхода оболочки; в противном случае используется состояние выхода предыдущей команды.
Экспорт имя …
export -p
Указанные имена экспортируются так, что они появятся в среде последующих команд. Единственный способ отменить экспорт переменной – сбросить ее. Оболочка позволяет установить значение переменной одновременно с ее экспортом, записав
имя экспорта = значение
Без аргументов команда экспорта выводит список имен всех экспортируемых переменных. Если указана опция – p , выходные данные будут отформатированы для неинтерактивного использования.
fc [- e редактор ] [ первый [ последний ]]
fc -l [- номер ] [ первый [ последний ]]
fc -s [ old = new ] [ first ]
Встроенные fc списки или редактирование и повторное выполнение команд, ранее введенных в интерактивную оболочку.
-e редактор
Используйте редактор с именем редактора для редактирования команд. Строка редактора – это имя команды, подлежащее поиску через переменную PATH . Значение в переменной FCEDIT используется по умолчанию, когда – e не указано. Если FCEDIT равно нулю или не установлено, используется значение переменной РЕДАКТОР . Если РЕДАКТОР равен нулю или не задан, ed (1) используется в качестве редактора.
-l (ell)
Перечислите команды, а не вызывайте их. Команды записываются в последовательности, указанной первым и последним операндами, в зависимости от – r , где каждой команде предшествует номер команды.
-n
Подавлять номера команд при перечислении с -l.
-r
Измените порядок перечисленных команд (с – l или отредактировал (без – l или – s)
-s
Повторите команду без вызова редактора.
первый
последняя
Выберите команды для просмотра или редактирования. Количество предыдущих команд, к которым можно получить доступ, определяется значением переменной HISTSIZE . Значение first или last или оба являются одним из следующих:
[+] число
Положительное число, представляющее номер команды; номера команд можно отображать с помощью опции – l .
-количество
Отрицательное десятичное число, представляющее команду, которая была выполнена числом команд ранее. Например, -1 – непосредственно предыдущая команда.
строка
Строка, обозначающая последнюю введенную команду, которая начинается с этой строки. Если старый = новый операнд также не указан с – s , строковая форма первого операнда не может содержать встроенный знак равенства.
Следующие переменные среды влияют на выполнение fc:
FCEDIT
Имя редактора для использования.
HISTSIZE
Количество предыдущих команд, которые доступны.
фг [ Работа ]
Переместить указанное или текущее задание на передний план.
getopts optstring var
Команда POSIX getopts , не следует путать с getopt, полученным из Bell Labs .
Первый аргумент должен представлять собой последовательность букв, за каждой из которых, возможно, стоит двоеточие, чтобы указать, что для параметра требуется аргумент. Указанная переменная установлена на анализируемую опцию.
Команда getopts исключает старую утилиту getopt (1) из-за обработки аргументов, содержащих пробелы.
Встроенная getopts может использоваться для получения опций и их аргументов из списка параметров. При вызове getopts помещает значение следующего параметра из строки параметра в списке в переменную оболочки, указанную var , и его индекс в переменной оболочки OPTIND Когда вызывается оболочка, OPTIND инициализируется равным 1. Для каждой опции, требующей аргумента, встроенная функция getopts поместит ее в переменную оболочки OPTARG Если в optstring параметр не разрешен, то OPTARG будет отключен.
optstring – это строка распознанных букв параметров. Если за буквой следует двоеточие, ожидается, что параметр будет иметь аргумент, который может или не может быть отделен от него пробелом. Если символ опции не найден там, где ожидается, getopts установит для переменной var значение “? ” getopts , а затем сбросит OPTARG и записать вывод в стандартную ошибку. Если в качестве первого символа optstring указать двоеточие, все ошибки будут игнорироваться.
Ненулевое значение возвращается при достижении последней опции. Если оставшихся аргументов нет, getopts установит для var специальную опцию, иначе “ – ” установит для var значение “? ”
Следующий фрагмент кода показывает, как можно обрабатывать аргументы для команды, которая может принимать параметры [a] и [b], и опции [c], для которой требуется аргумент.
в то время как getopts abc: f
делает
регистр $ f в
a | b) flag = $ f ;;
c) carg = $ OPTARG ;;
\?) echo $ USAGE; выход 1 ;;
esac
сделано
shift `expr $ OPTIND - 1`
Этот код будет принимать любое из следующего в качестве эквивалента:
cmd -acarg файл-файл
cmd -a -c arg файл-файл
cmd -carg -a файл-файл
cmd -a -carg - файл-файл
hash -rv команда …
Оболочка поддерживает хеш-таблицу, которая запоминает расположение команд. Без аргументов команда hash распечатывает содержимое этой таблицы. Записи, которые не просматривались со времени последней команды cd , отмечены звездочкой; эти записи могут быть недействительными.
С аргументами команда hash удаляет указанные команды из хеш-таблицы (если они не являются функциями) и затем находит их.С параметром – v хеш печатает расположение команд по мере их нахождения. Опция – r приводит к тому, что хеш-команда удаляет все записи в хеш-таблице, кроме функций.
JobID [ Работа ]
Распечатайте идентификаторы процессов в задании. Если аргумент job опущен, используется текущее задание.
работы
Эта команда выводит список всех фоновых процессов, которые являются дочерними элементами текущего процесса оболочки.
PWD
Распечатать текущий каталог. Встроенная команда может отличаться от программы с тем же именем, потому что встроенная команда запоминает текущий каталог, а не пересчитывает его каждый раз. Это делает это быстрее. Однако если текущий каталог будет переименован, встроенная версия pwd продолжит печатать старое имя каталога.
read [- p приглашение ] [- r ] переменная …
Приглашение выводится, если указана опция – p , а стандартный ввод – это терминал. Затем строка читается из стандартного ввода. Конечный символ новой строки удаляется из строки, и строка разбивается, как описано в разделе о разделении слов выше, и части назначаются переменным по порядку. Необходимо указать хотя бы одну переменную. Если частей больше, чем переменных, оставшиеся части (вместе с символами в IFS , которые их разделяли) присваиваются последней переменной. Если переменных больше, чем кусков, оставшимся переменным присваивается пустая строка. Встроенная функция read будет указывать на успех, если EOF не будет обнаружен на входе, и в этом случае возвращается ошибка.
По умолчанию, если не указан параметр – r , обратная косая черта “ \ ” действует как escape-символ, в результате чего следующий символ обрабатывается буквально. Если за обратной косой чертой следует новая строка, обратная косая черта и новая строка будут удалены.
только для чтения имя …
только для чтения -p
Указанные имена помечаются как доступные только для чтения, поэтому они не могут быть впоследствии изменены или отменены. Оболочка позволяет устанавливать значение переменной одновременно с пометкой «только для чтения»
только для чтения имя = значение
Без аргументов команда readonly перечисляет имена всех переменных только для чтения. Если указана опция – p , выходные данные будут отформатированы для неинтерактивного использования.
set [{- параметры | + варианты | – Арг … ]
Команда set выполняет три разные функции.
Без аргументов он перечисляет значения всех переменных оболочки.
Если заданы опции, он устанавливает флаги указанных опций или очищает их, как описано в разделе «Обработка списка аргументов Sx».
Третье использование команды set – установить значения позиционных параметров оболочки в указанные аргументы. Чтобы изменить позиционные параметры без изменения каких-либо параметров, используйте “ – ” в качестве первого аргумента для установки. Если аргументы отсутствуют, команда set удалит все позиционные параметры (эквивалентно выполнению “ shift $ #. ”).
значение переменной
Присваивает значение переменной. (В общем случае лучше писать переменную = значение, чем использовать setvar setvar , предназначенный для использования в функциях, которые присваивают значения переменным, имена которых передаются в качестве параметров.)
сдвиг [<ет> п ]
Сдвиньте позиционные параметры n раз. shift устанавливает значение $ 1 равным значению $ 2 , значение $ 2 равным значению $ 3 и т. Д., Уменьшая значение $ # на единицу. Если n больше, чем количество позиционных параметров, shift выдаст сообщение об ошибке и завершится со статусом возврата 2.
раз
Выведите накопленное пользовательское и системное время для оболочки и для процессов, запущенных из оболочки. Статус возврата 0.
ловушка Действие сигнал …
Заставить оболочку анализировать и выполнять действие при получении любого из указанных сигналов. Сигналы указываются по номеру сигнала. Если signal равно 0 , действие выполняется при выходе из оболочки. action может иметь значение null или “ – ”; первый вызывает игнорирование указанного сигнала, а последний – выполнение действия по умолчанию. Когда оболочка разветвляется на подоболочку, она сбрасывает захваченные (но не игнорируемые) сигналы в действие по умолчанию. Команда trap не влияет на сигналы, которые игнорировались при входе в оболочку.
введите [ имя …]
Интерпретируйте каждое имя как команду и напечатайте разрешение поиска команды. Возможные разрешения: ключевое слово оболочки, псевдоним, встроенная оболочка, команда, отслеживаемый псевдоним и не найден. Для псевдонимов расширение псевдонима печатается; для команд и отслеживаемых псевдонимов выводится полный путь к команде.
ulimit [- H-S ] [- -tfdscmlpn [ значение ]]
Узнайте или установите жесткие или мягкие ограничения для процессов или установите новые ограничения. Выбор между жестким пределом (который нельзя нарушать никакому процессу, и который нельзя повысить после его снижения) и мягким пределом (который сигнализирует о процессах, но не обязательно уничтожает их, и который может быть повышен) делается с помощью эти флаги:
-H
установить или узнать о жестких пределах
-S
установить или узнать о мягких пределах. Если не указано ни H , ни S , отображается мягкий предел или устанавливаются оба предела. Если указаны оба, побеждает последний.
Предел, который необходимо опросить или установить, затем выбирается путем указания любого из следующих флагов:
-a
показать все текущие ограничения
-t
показать или установить ограничение по времени процессора (в секундах)
-f
показать или установить ограничение для самого большого файла, который может быть создан (в 512-байтовых блоках)
-d
показать или установить ограничение на размер сегмента данных процесса (в килобайтах)
-s
показать или установить ограничение на размер стека процесса (в килобайтах)
-c
показать или установить ограничение на максимально возможный размер дампа ядра (в 512-байтных блоках)
-m
показать или установить ограничение на общую физическую память, которая может использоваться процессом (в килобайтах)
-l
показать или установить ограничение на количество памяти, которое процесс может заблокировать с помощью mlock (2) (в килобайтах)
-p
показать или установить ограничение на количество процессов, которые этот пользователь может иметь одновременно
-n
показать или установить ограничение на количество файлов, которые процесс может открыть одновременно
Если ничего из них не указано, это ограничение на размер файла, который отображается или устанавливается. Если указано значение, ограничение устанавливается на это число; в противном случае отображается текущий предел.
Пределы произвольного процесса могут быть отображены или установлены с помощью утилиты sysctl (8).
Umask [ Маска ]
Установите значение umask (см. Umask (2)) в указанное восьмеричное значение. Если аргумент опущен, выводится значение umask.
unalias [- a ] [ имя ]
Если указано имя , оболочка удаляет этот псевдоним. Если указано – a , все псевдонимы будут удалены.
сброс имя …
Указанные переменные и функции не установлены и не экспортированы. Если данное имя соответствует как переменной, так и функции, переменная и функция не установлены.
подождите [ Работа ]
Дождитесь завершения указанного задания и верните статус завершения последнего процесса в задании. Если аргумент опущен, дождитесь завершения всех заданий и возврата состояния завершения, равного нулю.
Редактирование командной строки
Когда sh используется в интерактивном режиме с терминала, текущую команду и историю команд (см. fc в Sx Builtins) можно редактировать с помощью редактирования командной строки vi-mode. В этом режиме используются команды, описанные ниже, похожие на подмножество команд, описанных на справочной странице vi. Команда `set ‘-o vi включает редактирование в режиме vi и переводит sh в режим вставки vi. При включенном режиме vi, sh может переключаться между режимом вставки и командным режимом. Редактор не описан здесь полностью, но будет в следующем документе. Это похоже на vi: ввод Aq ESC приведёт вас в командный режим VI. Нажатие Aq return в командном режиме передаст строку в оболочку.
Используйте команду man (% man ), чтобы увидеть, как команда используется на вашем конкретном компьютере.