Руководства по командной строке

Man » Онлайн-руководство sh - подробная онлайн-документация для страницы руководства sh

🌍
dash — интерпретатор команд (оболочка)

СИНТАКСИС

dash     [-aCefnuvxIimqVEbp]    [+aCefnuvxIimqVEbp]    [-o    option_name]    [+o    option_name]
[command_file [argument ...]]
dash -c [-aCefnuvxIimqVEbp] [+aCefnuvxIimqVEbp] [-o option_name] [+o option_name]  command_string
[command_name [argument ...]]
dash -s [-aCefnuvxIimqVEbp] [+aCefnuvxIimqVEbp] [-o option_name] [+o option_name] [argument ...]

ОПИСАНИЕ

dash  — это стандартный интерпретатор команд для системы. Текущая версия dash находится в процессе
изменения, чтобы соответствовать спецификациям POSIX 1003.2 и 1003.2a для оболочки. Эта версия имеет
многие функции, которые во многих отношениях напоминают оболочку Korn, но это не клон оболочки Korn
(см. ksh(1)). В эту оболочку включаются только функции, определенные POSIX, а также несколько
расширений Berkeley. Эта страница руководства не предназначена для того, чтобы быть учебником или
полной спецификацией оболочки.

Обзор

Оболочка — это команда, которая считывает строки из файла или терминала, интерпретирует их и, как правило, выполняет другие команды. Это программа, которая запускается, когда пользователь входит в систему (хотя пользователь может выбрать другую оболочку с помощью команды chsh(1)). Оболочка реализует язык, который имеет конструкции управления потоком, механизм макросов, который предоставляет различные функции в дополнение к хранению данных, а также встроенные возможности истории и редактирования строк. В ней реализовано множество функций для упрощения интерактивного использования, и у нее есть преимущество в том, что интерпретируемый язык является общим для интерактивного и неинтерактивного использования (скриптов оболочки). То есть команды могут быть введены непосредственно в работающую оболочку или могут быть помещены в файл, и этот файл может быть выполнен непосредственно оболочкой.

Вызов

Если аргументы не указаны и если стандартный ввод оболочки подключен к терминалу (или если установлен флаг -i), и опция -c не указана, оболочка считается интерактивной оболочкой. Интерактивная оболочка обычно запрашивает ввод перед каждой командой и обрабатывает ошибки программирования и команды по- другому (как описано ниже). При запуске оболочка проверяет первый аргумент и, если он начинается с дефиса «-», оболочка также считается оболочкой входа в систему. Обычно это делается автоматически системой при первом входе пользователя в систему. Оболочка входа в систему сначала считывает команды из файлов /etc/profile и .profile, если они существуют. Если переменная окружения ENV установлена при входе в интерактивную оболочку или установлена в файле .profile оболочки входа в систему, оболочка затем считывает команды из файла, имя которого указано в ENV. Следовательно, пользователь должен помещать команды, которые должны выполняться только при входе в систему, в файл .profile, а команды, которые выполняются для каждой интерактивной оболочки, — в файл ENV. Чтобы установить переменную ENV на какой-либо файл, поместите следующую строку в файл .profile в вашей домашней директории.


ENV=$HOME/.shinit; export ENV

Замените «.shinit» любым желаемым именем файла.

Если в командной строке указаны аргументы, отличные от опций, то оболочка интерпретирует первый аргумент как имя файла, из которого следует читать команды (скрипт оболочки), а остальные аргументы становятся позиционными параметрами оболочки ($1, $2 и т. д.). В противном случае оболочка читает команды из стандартного ввода.

Обработка списка аргументов

Все однобуквенные опции, для которых существует соответствующее имя, можно использовать в качестве аргумента для опции -o. Команда set -o имя приводится рядом с однобуквенной опцией в описании ниже. Указание знака «-» включает опцию, а использование знака «+» отключает ее. Следующие опции можно установить из командной строки или с помощью встроенной команды set (описано ниже).

-a allexport Экспортировать все присвоенные переменные.

-c Читать команды из операнда `command_string` вместо стандартного ввода. Специальный параметр 0 будет установлен из операнда `command_name`, а позиционные параметры ($1, $2 и т. д.) будут установлены из оставшихся операндов.

-C noclobber Не перезаписывать существующие файлы с помощью «>».

-e errexit Если оболочка не интерактивна, немедленно завершать работу, если какая-либо необработанная команда завершится с ошибкой. Статус выхода команды считается явно проверенным, если команда используется для управления операторами `if`, `elif`, `while` или `until`, или если команда является левым операндом оператора «&&» или «||».

-f noglob Отключить расширение шаблонов имен файлов.

-n noexec Если оболочка не интерактивна, читать команды, но не выполнять их. Это полезно для проверки синтаксиса скриптов оболочки.

-u nounset Выводить сообщение в стандартный поток ошибок при попытке расширить переменную, которая не установлена, и, если оболочка не интерактивна, немедленно завершать работу.

-v verbose Оболочка выводит свой ввод в стандартный поток ошибок по мере его чтения. Полезно для отладки.

-x xtrace Выводить каждую команду в стандартный поток ошибок (с добавлением «+ » в начале) перед ее выполнением. Полезно для отладки.

-I ignoreeof Игнорировать EOF от ввода при интерактивной работе.

-i interactive Заставить оболочку вести себя как интерактивная.

-l Заставить dash вести себя как при вызове в качестве оболочки входа в систему.

-m monitor Включить управление заданиями (включается автоматически при интерактивной работе).

-s stdin Читать команды из стандартного ввода (включается автоматически, если нет аргументов файлов). Эта опция не имеет эффекта, если она установлена после того, как оболочка уже начала работать (т. е. с помощью команды `set`).

-V vi Задействует встроенный редактор командной строки vi(1) (отключает -E, если он был установлен).

-E emacs Задействует встроенный редактор командной строки [emacs](filename://emacs.md)(1) (отключает -V, если он был установлен).

-b notify Включает асинхронное уведомление об окончании фоновых заданий. (НЕ РЕАЛИЗОВАНО для 4.4alpha)

-p priviliged Не пытается сбросить эффективный UID, если он не совпадает с UID. По умолчанию это не установлено, чтобы избежать неправильного использования в программах, работающих с правами root, через system(3) или popen(3).

Лексическая структура

Оболочка считывает ввод построчно из файла и разбивает его на слова, разделенные пробелами (пробелами и табуляцией), а также на определенные последовательности символов, которые являются специальными для оболочки и называются «операторами». Существует два типа операторов: операторы управления и операторы перенаправления (их значение обсуждается ниже). Ниже приведен список операторов:

Операторы управления: & && ( ) ; ;; | || <новая строка>

Операторы перенаправления: < > >| << >> <& >& <<- <>

Кавычки

Кавычки используются для подавления специального значения определенных символов или слов для оболочки, таких как операторы, пробелы или ключевые слова. Существует три типа кавычек: одинарные кавычки, двойные кавычки и обратный слеш.

Обратный слеш

Обратный слеш сохраняет буквальное значение следующего за ним символа, за исключением ⟨новой строки⟩. Обратный слеш, предшествующий ⟨новой строке⟩, рассматривается как продолжение строки.

Одинарные кавычки

При заключении символов в одинарные кавычки сохраняется буквальное значение всех символов (за исключением одинарных кавычек, поэтому невозможно поместить одинарные кавычки в строку, заключенную в одинарные кавычки).

Двойные кавычки

При заключении символов в двойные кавычки сохраняется буквальное значение всех символов, кроме знака доллара ($), обратной кавычки (`) и обратного слеша (\\). Обратный слеш внутри двойных кавычек исторически необычен и используется для экранирования только следующих символов:
$ ` " \ <новая строка>. В противном случае он остается буквальным.

Зарезервированные слова

Зарезервированные слова — это слова, которые имеют специальное значение для оболочки и распознаются в начале строки и после оператора управления. Ниже приведен список зарезервированных слов:

! elif fi while case
else for then { }
do done until if esac

Их значение обсуждается ниже.

Псевдонимы

Псевдоним — это имя и соответствующее значение, установленное с помощью встроенной команды alias(1). Всякий раз, когда может появиться зарезервированное слово (см. выше), и после проверки на наличие зарезервированных слов, оболочка проверяет, соответствует ли слово псевдониму. Если да, то оно заменяется во входном потоке его значением. Например, если существует псевдоним с именем «lf» и значением «ls -F», то ввод:

lf foobar ⟨возврат⟩

превратится в

ls -F foobar ⟨возврат⟩

Псевдонимы предоставляют удобный способ для начинающих пользователей создавать сокращения для команд, не изучая, как создавать функции с аргументами. Их также можно использовать для создания лексически запутанного кода. Это не рекомендуется.


Команды

Оболочка интерпретирует вводимые слова в соответствии с языком, спецификация которого выходит за рамки данного руководства (см. БНФ в документе POSIX 1003.2). По сути, строка считывается, и если первое слово в строке (или после управляющего оператора) не является зарезервированным словом, то оболочка распознает простую команду. В противном случае может быть распознана сложная команда или какая-либо другая специальная конструкция.

Простые команды

Если простая команда была распознана, оболочка выполняет следующие действия:

  Начальные слова в форме «имя=значение» удаляются и присваиваются среде простой команды. Операторы перенаправления и их аргументы (как описано ниже) удаляются и сохраняются для последующей обработки.

  Оставшиеся слова расширяются, как описано в разделе «Расширения», и первое из оставшихся слов считается именем команды, и команда ищется. Оставшиеся слова считаются аргументами команды. Если имя команды не было найдено, то присваивания переменных в форме «имя=значение», распознанные в пункте 1, влияют на текущую оболочку.

  Перенаправления выполняются, как описано в следующем разделе.

Перенаправления

Перенаправления используются для изменения источника ввода или назначения вывода команды. В общем, перенаправления открывают, закрывают или дублируют существующую ссылку на файл. Общий формат, используемый для перенаправления, выглядит следующим образом:

[n] оператор-перенаправления файл

где оператор-перенаправления — один из ранее упомянутых операторов перенаправления. Ниже приведен список возможных перенаправлений. [n] — необязательное число от 0 до 9, например «3» (а не «[3]»), которое относится к дескриптору файла.

[n]> файл Перенаправить стандартный вывод (или n) в файл.

[n]>| файл То же самое, но отменить действие опции -C.

[n]>> файл Добавить стандартный вывод (или n) в файл.

[n]< файл Перенаправить стандартный ввод (или n) из файла.

[n1]<&n2 Скопировать дескриптор файла n2 в стандартный вывод (или дескриптор n1). Дескриптор n2.

[n]<&- Закрыть стандартный ввод (или n).

[n1]>&n2 Скопировать дескриптор файла n2 в стандартный ввод (или дескриптор n1). Дескриптор n2.

[n]>&- Закрыть стандартный вывод (или n).

[n]<> файл Открыть файл для чтения и записи в стандартный ввод (или n).

Следующее перенаправление часто называют «здесь-документом».

[n]<< разделитель
здесь-текст ...
разделитель

Весь текст в последующих строках до разделителя сохраняется и становится доступным для команды в стандартном вводе или дескрипторе файла n, если он указан. Если разделитель, указанный в начальной строке, заключен в кавычки, то текст в «здесь-тексте» обрабатывается буквально, в противном случае текст подвергается расширению параметров, подстановке команд и арифметическому расширению (как описано в разделе «Расширения»). Если оператор «<<-» вместо «<<», то начальные табуляции в «здесь-тексте» удаляются.


Поиск и выполнение

Существуют три типа команд: функции оболочки, встроенные команды и обычные программы, и команда ищется (по имени) в этом порядке. Каждая из них выполняется по-разному.

При выполнении функции оболочки все позиционные параметры оболочки (кроме $0, который остается неизменным) устанавливаются в аргументы функции оболочки. Переменные, которые явно помещаются в окружение команды (путем размещения присваиваний им перед именем функции), становятся локальными для функции и устанавливаются на указанные значения. Затем выполняется команда, указанная в определении функции. После завершения команды позиционные параметры восстанавливаются до исходных значений. Все это происходит в текущей оболочке.

Встроенные команды оболочки выполняются внутри самой оболочки, без создания нового процесса.

В противном случае, если имя команды не соответствует ни функции, ни встроенной команде, команда ищется как обычная программа в файловой системе (как описано в следующем разделе). При выполнении обычной программы оболочка запускает программу, передавая ей аргументы и окружение. Если программа не является обычной исполняемой программой (т. е., если она не начинается с "магического числа", ASCII-представление которого — "#!", так что execve(2) возвращает ENOEXEC), оболочка интерпретирует программу в под-оболочке. В этом случае под-оболочка переинициализирует себя, так что эффект будет таким, как если бы новая оболочка была вызвана для обработки скрипта, за исключением того, что местоположение хешированных команд, расположенных в родительской оболочке, будет запоминаться под-оболочкой.

Обратите внимание, что в предыдущих версиях этого документа и в самом исходном коде неоднозначно и спорадически упоминается скрипт оболочки без магического числа как "процедура оболочки".

Поиск в PATH

При поиске команды оболочка сначала проверяет, существует ли функция оболочки с таким именем. Затем она ищет встроенную команду с таким именем. Если встроенная команда не найдена, происходит одно из двух:

  Имена команд, содержащие косую черту, просто выполняются без каких-либо поисков.

  Оболочка последовательно ищет в каждой записи переменной `PATH` команду. Значение переменной `PATH` должно представлять собой серию записей, разделенных двоеточиями. Каждая запись состоит из имени каталога. Текущий каталог может быть указан неявно пустым именем каталога или явно одиночной точкой.

Код выхода команды

Каждая команда имеет код выхода, который может влиять на поведение других команд оболочки. Принято считать, что команда завершается с кодом 0 для обозначения нормального выполнения или успеха и с ненулевым кодом для обозначения сбоя, ошибки или ложного результата. В справочной странице для каждой команды должны быть указаны различные коды выхода и их значения. Кроме того, встроенные команды возвращают коды выхода, как и выполняемая функция оболочки.


Если команда состоит исключительно из присваиваний переменных, то статус выхода команды является статусом выхода последней команды, выполняемой в подкоманде, если таковая имеется, иначе — 0.

Сложные команды

Сложные команды — это комбинации простых команд с операторами управления или зарезервированными словами, вместе образующие более крупную сложную команду. В более общем смысле, команда — это одно из следующего:

Простая команда

Конвейер

Список или составной список

Составная команда

Определение функции

Если не указано иное, статус выхода команды — это статус выхода последней простой команды, выполненной командой.

Конвейеры

Конвейер — это последовательность из одной или нескольких команд, разделенных оператором управления |. Стандартный вывод всех команд, кроме последней, соединяется со стандартным вводом следующей команды. Стандартный вывод последней команды наследуется от оболочки, как обычно.

Формат конвейера:

[!] команда1 [| команда2 ...]

Стандартный вывод команды1 соединяется со стандартным вводом команды2. Стандартный ввод, стандартный вывод или и то, и другое команды считаются назначенными конвейером перед любыми перенаправлениями, указанными операторами перенаправления, которые являются частью команды.

Если конвейер не выполняется в фоновом режиме (об этом позже), оболочка ждет завершения всех команд.

Если при начале выполнения конвейера была включена опция pipefail, статус выхода конвейера — это статус выхода последней команды, указанной в конвейере, которая завершилась с ненулевым статусом, или ноль, если все команды в конвейере завершились с нулевым статусом. Если опция pipefail не была включена, статус выхода конвейера — это статус выхода последней команды, указанной в конвейере; статусы выхода любых других команд не используются. Если перед конвейером стоит зарезервированное слово !, его статус выхода — это логическое НЕ статуса выхода, описанного выше.

Поскольку присваивание стандартного ввода или стандартного вывода (или и того, и другого) конвейером происходит перед перенаправлением, его можно изменить с помощью перенаправления. Например:

$ команда1 2>&1 | команда2

отправляет как стандартный вывод, так и стандартный поток ошибок команды1 в стандартный ввод команды2.

Терминатор `;` или `<новая строка>` приводит к последовательному выполнению предыдущего списка AND-OR (описанного далее); `&` приводит к асинхронному выполнению предыдущего списка AND-OR.

Обратите внимание, что, в отличие от некоторых других оболочек, каждый процесс в конвейере является дочерним процессом вызывающей оболочки (если это не встроенная команда оболочки, в этом случае она выполняется в текущей оболочке — но любое ее влияние на среду удаляется).

Фоновые команды — &

Если команда завершается оператором управления амперсандом (&), оболочка выполняет команду асинхронно — то есть оболочка не ждет завершения команды, прежде чем выполнять следующую команду.

Формат запуска команды в фоновом режиме:


command1 & [command2 & ...]

Если оболочка не интерактивна, стандартный ввод асинхронной команды устанавливается в /dev/null.

Списки – В общем

Список – это последовательность из нуля или более команд, разделенных символами новой строки, точками с запятой или амперсанды, и опционально завершающаяся одним из этих трех символов. Команды в списке выполняются в порядке, в котором они записаны. Если за командой следует амперсанд, оболочка запускает команду и немедленно переходит к следующей команде; в противном случае она ждет завершения команды, прежде чем переходить к следующей.

Операторы списков с коротким замыканием

«&&» и «||» — это операторы списков «И-ИЛИ». «&&» выполняет первую команду, а затем выполняет вторую команду только в том случае, если код выхода первой команды равен нулю. «||» аналогичен, но выполняет вторую команду только в том случае, если код выхода первой команды отличен от нуля. «&&» и «||» имеют одинаковый приоритет.

Конструкции управления потоком – if, while, for, case

Синтаксис команды if следующий:

if list
then list
[ elif list
then list ] ...
[ else list ]
fi

Синтаксис команды while следующий:

while list
do list
done

Обе команды выполняются повторно до тех пор, пока код выхода первой команды равен нулю. Команда until аналогична, но вместо while используется слово until, что приводит к повторению до тех пор, пока код выхода первой команды не станет равен нулю.

Синтаксис команды for следующий:

for variable [ in [ word ... ] ]
do list
done

Слова, следующие за in, расширяются, а затем список выполняется повторно, при этом переменной присваивается каждое слово по очереди. Опущение in word ... эквивалентно in "$@".

Синтаксис команд break и continue следующий:

break [ num ]
continue [ num ]

Команда break завершает num самых внутренних циклов for или while. Команда continue продолжает выполнение со следующей итерации самого внутреннего цикла. Они реализованы как встроенные команды.

Синтаксис команды case следующий:

case word in
[(]pattern) list ;;
...
esac

Шаблон может состоять из одного или нескольких шаблонов (см. «Шаблоны оболочки», описанные ниже), разделенных символами «|». Символ «(» перед шаблоном является необязательным.

Группировка команд

Команды можно сгруппировать, записав либо

(list)

или

{ list; }

Первый из них выполняет команды в под-оболочке. Встроенные команды, сгруппированные в (list), не повлияют на текущую оболочку. Вторая форма не создает новую оболочку, поэтому немного эффективнее. Группировка команд таким образом позволяет перенаправлять их вывод, как если бы это была одна программа:

{ printf " hello " ; printf " world\n" ; } > greeting

Обратите внимание, что «}» должен следовать за оператором управления (здесь «;»), чтобы он распознавался как зарезервированное слово, а не как аргумент другой команды.

Функции

Синтаксис определения функции следующий:

name () command

Определение функции — это исполняемое выражение; при выполнении оно устанавливает функцию с именем name и возвращает код выхода, равный нулю. Команда обычно представляет собой список, заключенный в «{» и «}».

Переменные могут быть объявлены как локальные для функции с помощью команды local. Она должна быть первой инструкцией в функции, и синтаксис выглядит следующим образом:

local [переменная | -] ...

^ ocal реализована как встроенная команда.

Когда переменная объявляется локальной, она наследует начальное значение и флаги экспорта и только для чтения из переменной с тем же именем в окружающей области видимости, если таковая существует. В противном случае переменная изначально не установлена. Скрипт использует динамическую область видимости, поэтому, если вы делаете переменную x локальной для функции f, которая затем вызывает функцию g, ссылки на переменную x внутри g будут ссылаться на переменную x, объявленную внутри f, а не на глобальную переменную с именем x.

Единственным специальным параметром, который может быть объявлен локальным, является «-». Объявление «-» локальным означает, что любые параметры сценария, которые изменяются с помощью команды set внутри функции, будут восстановлены до их первоначальных значений при возврате из функции.

Синтаксис команды return выглядит следующим образом:

return [код_завершения]

Она завершает выполнение текущей функции. Return реализована как встроенная команда.

Переменные и параметры

Скрипт поддерживает набор параметров. Параметр, обозначаемый именем, называется переменной. При запуске скрипт преобразует все переменные среды в переменные скрипта. Новые переменные можно установить с помощью следующей формы:

имя=значение

Переменные, установленные пользователем, должны иметь имя, состоящее исключительно из буквенно-цифровых символов и символов подчеркивания, при этом первый символ не должен быть числом. Параметр также может быть обозначен числом или специальным символом, как описано ниже.

Позиционные параметры

Позиционный параметр — это параметр, обозначаемый числом (n > 0). Скрипт изначально устанавливает их значениями аргументов командной строки, следующих за именем скрипта. Встроенная команда set также может использоваться для установки или сброса их значений.

Специальные параметры

Специальный параметр — это параметр, обозначаемый одним из следующих специальных символов. Значение параметра указано рядом с его символом.

*            Разворачивается в позиционные параметры, начиная с первого. Когда разворачивание происходит внутри строки, заключенной в двойные кавычки, он разворачивается в одно поле, значением которого является значение каждого параметра, разделенного первым символом переменной `IFS` или пробелом, если `IFS` не установлена.

@            Разворачивается в позиционные параметры, начиная с первого. Когда разворачивание происходит внутри двойных кавычек, каждый позиционный параметр разворачивается как отдельный аргумент. Если нет позиционных параметров, разворачивание `@` генерирует ноль аргументов, даже если `@` заключена в двойные кавычки. Что это в основном означает, например, если `$1` равно «abc», а `$2` равно «def ghi», то `"$@"` разворачивается в два аргумента:

"abc" "def ghi"

#            Разворачивается в количество позиционных параметров.

?            Преобразуется в код завершения последней выполненной команды в конвейере.

- (Дефис.) Преобразуется в текущие флаги опций (однобуквенные имена опций, объединенные в строку), указанные при вызове, командой `set` или неявно оболочкой.

$            Преобразуется в идентификатор процесса вызванной оболочки. Под-оболочка сохраняет то же значение $ что и у родительской оболочки.

!            Преобразуется в идентификатор процесса последней команды, запущенной в фоновом режиме из текущей оболочки. Для конвейера используется идентификатор процесса последней команды в конвейере.

0 (Ноль.) Преобразуется в имя оболочки или скрипта оболочки.

Расширение слов

Этот раздел описывает различные расширения, применяемые к словам. Не все расширения применяются к каждому слову, как описано ниже.

Расширения тильды, расширения параметров, подстановка команд, арифметические расширения и удаление кавычек, происходящие в пределах одного слова, расширяются до одного поля. Только разделение полей или расширение имени файла могут создавать несколько полей из одного слова. Единственное исключение из этого правила — расширение специального параметра @ внутри двойных кавычек, как описано выше.

Порядок расширения слов:

  Расширение тильды, расширение параметров, подстановка команд, арифметическое расширение (все это происходит одновременно).

  Разделение полей выполняется для полей, созданных на шаге (1), если переменная IFS не пуста.

  Расширение имени файла (если не используется `set -f`).

  Удаление кавычек.

Символ $ используется для обозначения расширения параметров, подстановки команд или арифметической оценки.

Расширение тильды (подстановка домашнего каталога пользователя)

Слово, начинающееся с не заключенного в кавычки символа тильды (~), подвергается расширению тильды. Все символы до символа косой черты (/) или до конца слова интерпретируются как имя пользователя и заменяются на домашний каталог пользователя. Если имя пользователя отсутствует (например, ~/foobar), тильда заменяется на значение переменной HOME (домашний каталог текущего пользователя).

Расширение параметров

Формат расширения параметров имеет следующий вид:

${выражение}

где выражение состоит из всех символов до соответствующей закрывающей фигурной скобки }. Любая }, экранированная обратной косой чертой или находящаяся внутри заключенной в кавычки строки, и символы во встроенных арифметических расширениях, подстановках команд и расширениях переменных, не рассматриваются при определении соответствующей }.

Самая простая форма расширения параметров:

${параметр}

Если параметр имеет значение, то это значение подставляется.

Имя или символ параметра может быть заключен в фигурные скобки, что необязательно, за исключением позиционных параметров, состоящих из более чем одного цифры, или когда за параметром следует символ, который может быть интерпретирован как часть имени. Если расширение параметров происходит внутри двойных кавычек:

  Расширение имени файла не выполняется для результатов расширения.

      Разделение полей не выполняется для результатов расширения, за исключением @.

Кроме того, расширение параметра можно изменить, используя один из следующих форматов.

${parameter:-word}    Использование значений по умолчанию. Если параметр не установлен или пуст, то подставляется расширение word; в противном случае подставляется значение параметра.

${parameter:=word}    Назначение значений по умолчанию. Если параметр не установлен или пуст, то расширение word присваивается параметру. Во всех случаях окончательное значение параметра подставляется. Только переменные, а не позиционные параметры или специальные параметры, могут быть назначены таким образом.

${parameter:?[word]}  Указание ошибки, если параметр пуст или не установлен. Если параметр не установлен или пуст, то расширение word (или сообщение, указывающее, что он не установлен, если word опущено) записывается в стандартный поток ошибок и оболочка завершает работу с ненулевым кодом выхода. В противном случае подставляется значение параметра. В интерактивной оболочке выход не обязательно должен происходить.

${parameter:+word}    Использование альтернативного значения. Если параметр не установлен или пуст, то подставляется null; в противном случае подставляется расширение word.

В показанных выше расширениях параметров использование двоеточия в формате приводит к проверке параметра, который не установлен или пуст; отсутствие двоеточия приводит к проверке параметра, который просто не установлен.

${#parameter}         Длина строки. Длина в символах значения параметра.

Следующие четыре варианта расширения параметров обеспечивают обработку подстрок. В каждом случае для оценки шаблонов используется нотация шаблонов оболочки (см. «Шаблоны оболочки»), а не нотация регулярных выражений. Если параметр равен * или @, результат расширения не определен. Заключение всей строки расширения параметра в двойные кавычки не приводит к тому, что следующие четыре варианта символов шаблонов будут заключены в кавычки, в то время как заключение символов в фигурные скобки имеет такой эффект.

${parameter%word}     Удаление наименьшего суффиксного шаблона. Слово расширяется, чтобы создать шаблон. Расширение параметра затем приводит к тому, что из параметра удаляется наименьшая часть суффикса, соответствующая шаблону.

${parameter%%word}    Удаление наибольшего суффиксного шаблона. Слово расширяется, чтобы создать шаблон. Расширение параметра затем приводит к тому, что из параметра удаляется наибольшая часть суффикса, соответствующая шаблону.

${parameter#word}     Удаление наименьшего префиксного шаблона. Слово расширяется, чтобы создать шаблон. Расширение параметра затем приводит к тому, что из параметра удаляется наименьшая часть префикса, соответствующая шаблону.

${parameter##word}    Удаление наибольшего префиксного шаблона. Слово расширяется, чтобы создать шаблон. Расширение параметра затем приводит к тому, что из параметра удаляется наибольшая часть префикса, соответствующая шаблону.

Подстановка команды

Подстановка команды позволяет подставить вывод команды вместо самого имени команды. Подстановка команды происходит, когда команда заключена следующим образом:


$(command)

или (в виде «обратных кавычек»):

`command`

Оболочка выполняет подстановку команды, выполняя команду в под-оболочке и заменяя подстановку команды стандартным выводом команды, удаляя последовательности из одного или нескольких символов новой строки в конце подстановки. (Встроенные символы новой строки перед концом вывода не удаляются; однако во время разделения на поля они могут быть преобразованы в пробелы, в зависимости от значения IFS и используемого форматирования кавычек).

Арифметическое расширение

Арифметическое расширение предоставляет механизм для вычисления арифметического выражения и подстановки его значения. Формат арифметического расширения следующий:

$((expression))

Выражение обрабатывается так, как если бы оно было заключено в двойные кавычки, за исключением того, что двойная кавычка внутри выражения не обрабатывается особым образом. Оболочка расширяет все токены в выражении для расширения параметров, подстановки команд и удаления кавычек.

Затем оболочка рассматривает это как арифметическое выражение и подставляет значение выражения.

Разделение по пробелам (разделение на поля)

После расширения параметров, подстановки команд и арифметического расширения оболочка сканирует результаты расширений и подстановок, которые не происходили в двойных кавычках, для разделения на поля, в результате чего может быть образовано несколько полей.

Оболочка рассматривает каждый символ из IFS как разделитель и использует разделители для разделения результатов расширения параметров и подстановки команд на поля.

Расширение имени пути (генерация имен файлов)

Если флаг -f не установлен, генерация имен файлов выполняется после завершения разделения слов. Каждое слово рассматривается как последовательность шаблонов, разделенных косыми чертами. Процесс расширения заменяет слово именами всех существующих файлов, имена которых могут быть сформированы путем замены каждого шаблона строкой, соответствующей указанному шаблону. Существуют два ограничения: во-первых, шаблон не может соответствовать строке, содержащей косую черту, и, во-вторых, шаблон не может соответствовать строке, начинающейся с точки, если первый символ шаблона не является точкой. Следующий раздел описывает шаблоны, используемые как для расширения имени пути, так и для команды case.

Шаблоны оболочки

Шаблон состоит из обычных символов, которые соответствуют самим себе, и метасимволов. Метасимволами являются «!», «*», «?» и «[». Если эти символы заключены в кавычки, они теряют свое специальное значение. Когда выполняется подстановка команды или переменной, и символ доллара или обратные кавычки не заключены в двойные кавычки, значение переменной или вывод команды сканируются на наличие этих символов, и они преобразуются в метасимволы.

Звездочка («*») соответствует любой строке символов. Знак вопроса соответствует любому одному символу. Левая квадратная скобка («[») представляет собой класс символов. Конец класса символов обозначается правой квадратной скобкой («]»); если правая квадратная скобка отсутствует, то «[» соответствует «[», а не представляет собой класс символов. Класс символов соответствует любому из символов между квадратными скобками. Диапазон символов можно указать с помощью знака минус. Класс символов можно дополнить, сделав восклицательный знак первым символом класса символов.


Чтобы включить символ «]» в класс символов, сделайте его первым символом в списке (после «!», если он есть). Чтобы включить знак минус, сделайте его первым или последним символом в списке.

Встроенные команды

В этом разделе перечислены встроенные команды, которые являются встроенными, потому что им необходимо выполнять какие-либо операции, которые не могут быть выполнены отдельным процессом. Кроме этих, есть несколько других команд, которые могут быть встроенными для повышения эффективности (например, printf(1), echo(1), test(1) и т. д.).

:

true   Команда, которая ничего не делает и возвращает код выхода 0 (истина).

false  Команда, которая ничего не делает и возвращает код выхода 1 (ложь).

. file

Команды, указанные в файле, считываются и выполняются оболочкой.

alias [name[=string ...]]

Если указано name=string, оболочка определяет псевдоним name со значением string. Если указан только name, значение псевдонима name выводится. Без аргументов встроенная команда alias выводит имена и значения всех определенных псевдонимов (см. unalias).

bg [job] ...

Продолжить выполнение указанных заданий (или текущего задания, если ни одного задания не указано) в фоновом режиме.

command [-p] [-v] [-V] command [arg ...]

Выполнить указанную команду, но не учитывать функции оболочки при ее поиске. (Это полезно, когда у вас есть функция оболочки с тем же именем, что и встроенная команда).

-p     Выполнить поиск команды, используя PATH, который гарантирует нахождение всех стандартных утилит.

-V     Не выполнять команду, а выполнить поиск команды и вывести результат поиска команды. Это то же самое, что и встроенная команда type.

-v     Не выполнять команду, а выполнить поиск команды и вывести абсолютный путь к утилитам, имя для встроенных команд или развертывание псевдонимов.

cd|chdir cd|chdir [-LP] [directory]

Перейти в указанный каталог (по умолчанию HOME). Если в среде команды cd или в переменной оболочки CDPATH есть запись CDPATH, и имя каталога не начинается со слеша, то каталоги, перечисленные в CDPATH, будут просмотрены для поиска указанного каталога. Формат CDPATH такой же, как и формат PATH. Если в качестве аргумента указан одиночный дефис, он будет заменен значением OLDPWD. Команда cd выведет имя каталога, в который она фактически перешла, если оно отличается от имени, указанного пользователем. Они могут отличаться либо потому, что был использован механизм CDPATH, либо потому, что аргумент является одиночным дефисом. Опция -P заставляет использовать физическую структуру каталогов, то есть все символические ссылки разрешаются в их соответствующие значения. Опция -L отключает эффект любых предшествующих опций -P.


echo [-n] аргументы...

Выводит аргументы в стандартный вывод, разделенные пробелами. Если не указана опция -n, после аргументов выводится символ новой строки.

Если во время вывода встречается какая-либо из следующих последовательностей символов, эта последовательность не выводится. Вместо этого выполняется указанное действие:

\b      Выводит символ возврата на один символ назад.

\c      Последующий вывод подавляется. Обычно используется в конце последнего аргумента для подавления завершающего символа новой строки, который echo вывел бы в противном случае.

\e      Выводит символ экранирования (ESC).

\f      Выводит символ подачи страницы.

\n      Выводит символ новой строки.

\r      Выводит символ возврата каретки.

\t      Выводит символ горизонтальной табуляции.

\v      Выводит символ вертикальной табуляции.

\0цифры

Выводит символ, значение которого задается одним, двумя или тремя восьмеричными цифрами. Если цифр нет, выводится нулевой символ.

\\      Выводит символ обратной косой черты.

Все остальные последовательности, начинающиеся с обратной косой черты, приводят к неопределенному поведению.

eval строка ...

Объединяет все аргументы в одну строку, разделенные пробелами. Затем переанализирует и выполняет команду.

exec [команда аргумент ...]

Если команда не указана, текущий процесс оболочки заменяется указанной программой (которая должна быть реальной программой, а не встроенной командой или функцией оболочки). Любые перенаправления в команде exec помечаются как постоянные, поэтому они не отменяются после завершения команды exec.

exit [код_завершения]

Завершает процесс оболочки. Если указан код_завершения, он используется в качестве кода завершения оболочки; в противном случае используется код завершения предыдущей команды.

export имя ...

export -p

Указанные имена экспортируются, чтобы они отображались в среде последующих команд. Единственный способ отменить экспорт переменной — это удалить ее. Оболочка позволяет установить значение переменной одновременно с ее экспортом, записывая:

export имя=значение

Без аргументов команда export перечисляет имена всех экспортированных переменных. Если указана опция -p, вывод будет отформатирован для неинтерактивного использования.

fc [-e редактор] [первый [последний]]

fc -l [-nr] [первый [последний]]

fc -s [старый=новый] [первый]

Встроенная команда fc перечисляет или редактирует и повторно выполняет команды, ранее введенные в интерактивной оболочке.

-e редактор

Использует редактор, указанный в редактор, для редактирования команд. Строка редактор — это имя команды, которое ищется в переменной PATH. Значение в переменной FCEDIT используется по умолчанию, если не указана опция -e. Если FCEDIT имеет значение null или не установлена, используется значение переменной EDITOR. Если EDITOR имеет значение null или не установлена, в качестве редактора используется ed(1).

-l (ell)

Выводит команды вместо вызова редактора. Команды выводятся в последовательности, указанной параметрами первый и последний, на что влияет опция -r, и каждая команда предваряется номером команды.


-n     Подавлять вывод номеров команд при использовании опции -l.

-r     Изменять порядок команд в списке (при использовании -l) или при редактировании (без использования -l или -s).

-s     Повторно выполнять команду без вызова редактора.

first

last   Указывает команды для отображения или редактирования. Количество предыдущих команд, к которым можно получить доступ, определяется значением переменной HISTSIZE. Значение first или last (или обоих) может быть следующим:

[+]number
Положительное число, представляющее номер команды; номера команд можно отображать с помощью опции -l.

-number
Отрицательное десятичное число, представляющее команду, которая была выполнена number команд назад. Например, -1 — это непосредственно предыдущая команда.

string
Строка, указывающая последнюю введенную команду, начинающуюся с этой строки.

Если оператор old=new также не указан с опцией -s, то строковая форма первого операнда не может содержать встроенный знак равенства.

Следующие переменные окружения влияют на выполнение команды fc:

FCEDIT    Имя редактора, который следует использовать.

HISTSIZE  Количество предыдущих команд, к которым можно получить доступ.

fg [job]

Перемещает указанную задачу или текущую задачу на передний план.

getopts optstring var [arg ...]

POSIX-совместимая команда getopts, которую не следует путать с командой getopt(1), разработанной Bell Labs.

Первый аргумент должен быть серией букв, каждая из которых может быть опционально дополнена двоеточием, чтобы указать, что опция требует аргумент. Переменная, указанная в параметре var, устанавливается в разобранную опцию.

Команда getopts устарела по сравнению со старой утилитой getopt(1) из-за ее обработки аргументов, содержащих пробелы.

Встроенную команду getopts можно использовать для получения опций и их аргументов из списка параметров. При вызове команда getopts помещает значение следующей опции из строки опций в списке в переменную оболочки, указанную в параметре var, и ее индекс — в переменную оболочки OPTIND. При вызове оболочки OPTIND инициализируется значением 1. Для каждой опции, требующей аргумент, встроенная команда getopts помещает его в переменную оболочки OPTARG. Если опция не указана в строке optstring, то OPTARG будет очищена.

По умолчанию проверяются переменные $1, ..., $n; если указаны аргументы, то вместо них будут анализироваться они.

optstring — это строка, содержащая распознаваемые буквы опций (см. getopt(3)). Если после буквы следует двоеточие, ожидается, что опция будет иметь аргумент, который может быть разделен от нее пробелом или не разделен. Если символ опции не найден там, где ожидается, команда getopts установит переменную var в значение «?», затем очистит OPTARG и выведет сообщение об ошибке в стандартный поток ошибок. Указав двоеточие в качестве первого символа optstring, можно игнорировать все ошибки.

После последней опции команда getopts вернет ненулевое значение и установит var в значение «?».

Следующий фрагмент кода показывает, как можно обработать аргументы для команды, которая может принимать опции [a] и [b], а также опцию [c], требующую аргумент.


while getopts abc: f
do
case $f in
a | b)  flag=$f;;
c)      carg=$OPTARG;;
\?)     echo $USAGE; exit 1;;
esac
done
shift $((OPTIND - 1))

Этот код будет воспринимать следующие варианты как эквивалентные:

cmd -acarg file file
cmd -a -c arg file file
cmd -carg -a file file
cmd -a -carg -- file file

hash [command ...]

hash -r

Оболочка поддерживает хеш-таблицу, в которой хранятся местоположения команд. Если аргументов нет, команда hash выводит содержимое этой таблицы. Записи, которые не использовались с момента последней команды cd, помечены звездочкой; возможно, эти записи недействительны.

С аргументами команда hash удаляет указанные команды из хеш-таблицы (если они не являются функциями), а затем находит их. Опция -r заставляет команду hash удалять все записи в хеш-таблице, кроме функций.

jobs [-lp] [job ...]

Отображает статус всех или только указанных заданий: По умолчанию отображаются номер задания, текущий статус (+/-), состояние задания и его команда оболочки. -l также выводит PID главного процесса и только PID и команды оболочки для других членов задания. -p Отображает только PID главного процесса, по одному в строке.

kill [-s sigspec | -signum | -sigspec] [pid | job ...]

Эквивалентна kill(1), но также можно указать идентификатор задания. Сигналы могут быть указаны как нечувствительные к регистру имена без префикса SIG или десятичные числа; по умолчанию используется TERM.

kill -l [signum | exitstatus]

Выводит список доступных имен сигналов без префикса SIG. Если указан sigspec, отображается только sigspec для этого сигнала. Если указан exitstatus (> 128), отображается только sigspec, который его вызвал.

pwd [-LP]
Встроенная команда запоминает, какая сейчас директория, вместо того, чтобы каждый раз ее пересчитывать. Это делает ее более быстрой. Однако, если текущая директория переименована, встроенная версия pwd будет продолжать выводить старое имя директории. Опция -P заставляет отображать физическое значение текущей рабочей директории, то есть все символические ссылки разрешаются до их фактических значений. Опция -L отключает эффект любой предшествующей опции -P.

read [-p prompt] [-r] variable [...]

Если указана опция -p и стандартный ввод является терминалом, выводится приглашение. Затем из стандартного ввода считывается строка. Завершающий символ новой строки удаляется из строки, и строка разбивается, как описано в разделе о разделении слов, и части присваиваются переменным по порядку. Должна быть указана хотя бы одна переменная. Если частей больше, чем переменных, оставшиеся части (вместе с символами в IFS, которые их разделяли) присваиваются последней переменной. Если переменных больше, чем частей, оставшимся переменным присваивается пустая строка. Встроенная команда read будет указывать на успех, если только не будет обнаружен конец файла во входном потоке, в этом случае возвращается ошибка.


По умолчанию, если не указана опция -r, символ обратной косой черты "\" действует как управляющий символ, в результате чего следующий за ним символ интерпретируется буквально. Если после обратной косой черты следует символ новой строки, то и обратная косая черта, и символ новой строки будут удалены.

readonly name ...

readonly -p

Указанные имена помечаются как доступные только для чтения, чтобы их нельзя было изменять или удалять впоследствии. Оболочка позволяет установить значение переменной одновременно с пометкой ее как доступной только для чтения, записав:

readonly name=value

Без аргументов команда readonly выводит список имен всех переменных, доступных только для чтения. Если указана опция -p, вывод будет отформатирован для неинтерактивного использования.

printf format [value]...

printf форматирует и выводит свои аргументы в соответствии с format, строкой формата, которая содержит три типа объектов: обычные символы, которые просто копируются в стандартный вывод, символьные управляющие последовательности, которые преобразуются и копируются в стандартный вывод, и спецификаторы формата, каждый из которых приводит к выводу следующего значения.

Каждое значение обрабатывается как строка, если соответствующий спецификатор формата является b, c или s; в противном случае оно вычисляется как константа C со следующими дополнениями: Допускается ведущий знак плюс или минус. Если первым символом является одинарная или двойная кавычка, выводится значение следующего байта.

Строка формата используется повторно столько раз, сколько необходимо, пока не будут обработаны все значения. Любые дополнительные спецификаторы формата вычисляются с нулевым значением или пустой строкой.

Символьные управляющие последовательности представлены в обратной нотации, как определено в ANSI X3.159-1989 («ANSI C89»). Символы и их значения:

\a      Выводит символ <bell>.

\b      Выводит символ <backspace>.

\e      Выводит символ <escape> (ESC).

\f      Выводит символ <form-feed>.

\n      Выводит символ <new-line>.

\r      Выводит символ <carriage return>.

\t      Выводит символ <tab>.

\v      Выводит символ <vertical tab>.

\\      Выводит символ обратной косой черты.

\num    Выводит 8-битный символ, чей ASCII-код равен 1-, 2- или 3-значному восьмеричному числу num.

Каждый спецификатор формата начинается с символа процента ('%'). Остальная часть спецификатора формата включает в следующем порядке:

Ноль или несколько следующих флагов:

#       Символ '#' указывает, что значение должно быть выведено в "альтернативной форме". Для форматов b, c, d и s эта опция не имеет эффекта.
Для формата o точность числа увеличивается, чтобы первый символ выходной строки начинался с нуля. Для формата x (X) не равный нулю результат имеет префикс "0x" (0X). Для форматов e, E, f, g и G результат всегда содержит десятичную точку, даже если за точкой нет цифр (обычно десятичная точка появляется в результатах этих форматов, только если за десятичной точкой следует цифра). Для форматов g и G конечные нули не удаляются из результата, как это было бы в противном случае.

-       Знак «-», указывающий на выравнивание по левому краю в указанном поле;

+       Символ «+», указывающий, что перед числом всегда должен быть поставлен знак при использовании форматов со знаком.

‘ ’     Пробел, указывающий, что перед положительным числом должен быть оставлен пробел для формата со знаком. Знак «+» имеет приоритет над пробелом, если оба используются.

0      Ноль «0», указывающий, что вместо пробелов следует использовать заполнение нулями. Знак «-» имеет приоритет над «0», если оба используются.

Ширина поля: Необязательная строка цифр, определяющая ширину поля; если выходная строка содержит меньше символов, чем ширина поля, она будет дополнена пробелами слева (или справа, если указан индикатор выравнивания по левому краю), чтобы соответствовать ширине поля (обратите внимание, что ведущий ноль является флагом, а встроенный ноль является частью ширины поля).

Точность:
Необязательная точка «.», за которой следует необязательная строка цифр, определяющая точность, которая указывает количество цифр, которые должны отображаться после десятичной точки для форматов «e» и «f», или максимальное количество байтов, которые должны быть напечатаны из строки (форматы «b» и «s»); если строка цифр отсутствует, точность считается равной нулю.

Формат:
Символ, указывающий тип используемого формата (один из diouxXfwEgGbcs).

Ширина поля или точность могут быть представлены символом «*» вместо строки цифр. В этом случае аргумент предоставляет ширину поля или точность.

Символы формата и их значения:

diouXx      Аргумент выводится как десятичное число со знаком (d или i), восьмеричное число без знака, десятичное число без знака или шестнадцатеричное число без знака (X или x) соответственно.

f           Аргумент выводится в формате [-]ddd.ddd, где количество цифр после десятичной точки равно точности, указанной для аргумента. Если точность отсутствует, выводится 6 цифр; если точность явно равна 0, цифры и десятичная точка не выводятся.

eE          Аргумент выводится в формате [-]d.ddde±dd, где перед десятичной точкой одна цифра, а количество цифр после нее равно точности, указанной для аргумента; когда точность отсутствует, выводится 6 цифр. Для формата «E» используется заглавная буква «E».

gG          Аргумент выводится в формате «f» или в формате «e» (или «E»), в зависимости от того, какой из них обеспечивает максимальную точность в минимальном пространстве.

b           Символы из аргумента-строки выводятся с расширенными последовательностями с обратной косой чертой. Поддерживаются следующие дополнительные последовательности с обратной косой чертой:

\c      Заставляет dash игнорировать все остальные символы в строке аргумента, содержащей ее, все оставшиеся строки аргументов и все дополнительные символы в строке формата.

\0num   Выводит 8-битный символ, ASCII-значение которого равно 1-, 2- или 3-значному восьмеричному числу num.

c           Выводит первый символ аргумента.

s           Выводит символы из строки аргумента до конца строки или до тех пор, пока не будет выведено количество байтов, указанное в спецификации точности; если спецификация точности опущена, выводятся все символы строки.

%           Выводит символ `%`; аргумент не используется.

В любом случае, отсутствие или недостаточная ширина поля не приводит к усечению поля; заполнение происходит только в том случае, если указанная ширина поля превышает фактическую ширину.

set [{ -options | +options | -- }] arg ...

Команда set выполняет три разные функции.

Без аргументов она выводит значения всех переменных оболочки.

Если указаны опции, она устанавливает или отменяет указанные флаги опций, как описано в разделе «Обработка списка аргументов». В качестве особого случая, если опция -o или +o и аргумент не указан, оболочка выводит настройки всех своих опций. Если опция -o, настройки выводятся в удобочитаемом формате; если опция +o, настройки выводятся в формате, пригодном для повторного ввода в оболочку, чтобы изменить те же настройки опций.

В дополнение к именам опций, перечисленным в разделе «Обработка списка аргументов», следующие опции могут быть указаны в качестве аргументов для -o или +o:

pipefail   Определяет код выхода конвейера на основе кодов выхода всех команд в конвейере, а не только последней команды, как описано в разделе «Конвейеры».

Третье использование команды set — установить значения позиционных параметров оболочки на указанные аргументы. Чтобы изменить позиционные параметры без изменения каких-либо опций, используйте -- в качестве первого аргумента для set. Если аргументы отсутствуют, команда set очищает все позиционные параметры (эквивалентно выполнению shift $#).

shift [n]

Сдвигает позиционные параметры на n позиций. При сдвиге значение $1 присваивается значению $2, значение $2 присваивается значению $3 и так далее, при этом значение $# уменьшается на единицу. Если n больше, чем количество позиционных параметров, команда shift выдаст сообщение об ошибке и завершится с кодом возврата 2.

test expression

[ expression ]

Утилита test вычисляет значение выражения и, если оно истинно, возвращает нулевой (истинный) код выхода; в противном случае она возвращает 1 (ложь). Если выражение отсутствует, test также возвращает 1 (ложь).

Все операторы и флаги являются отдельными аргументами для утилиты test.

Следующие основные элементы используются для построения выражения:

-b file       Истинно, если файл существует и является блочным специальным файлом.

-c file       Истинно, если файл существует и является символьным специальным файлом.

-d file       Истинно, если файл существует и является каталогом.

-e file       Истинно, если файл существует (независимо от типа).

-f file       Истинно, если файл существует и является обычным файлом.

-g файл       Возвращает true, если файл существует и установлен флаг идентификатора группы.

-h файл       Возвращает true, если файл существует и является символической ссылкой.

-k файл       Возвращает true, если файл существует и установлен его битовый флаг.

-n строка     Возвращает true, если длина строки не равна нулю.

-p файл       Возвращает true, если файл является именованным каналом (FIFO).

-r файл       Возвращает true, если файл существует и доступен для чтения.

-s файл       Возвращает true, если файл существует и имеет размер больше нуля.

-t файловый_дескриптор

Возвращает true, если файл, для которого указан файловый дескриптор, открыт и связан с терминалом.

-u файл       Возвращает true, если файл существует и установлен флаг идентификатора пользователя.

-w файл       Возвращает true, если файл существует и доступен для записи. True указывает только на то, что установлен флаг записи. Файл не будет доступен для записи в файловой системе, если она установлена в режим «только для чтения», даже если этот тест возвращает true.

-x файл       Возвращает true, если файл существует и доступен для выполнения. True указывает только на то, что установлен флаг выполнения. Если файл является каталогом, true указывает на то, что файл можно просматривать.

-z строка     Возвращает true, если длина строки равна нулю.

-L файл       Возвращает true, если файл существует и является символической ссылкой. Этот оператор сохранен для совместимости с предыдущими версиями этой программы. Не полагайтесь на его существование; используйте -h вместо него.

-O файл       Возвращает true, если файл существует и его владелец соответствует эффективному идентификатору пользователя этого процесса.

-G файл       Возвращает true, если файл существует и его группа соответствует эффективному идентификатору группы этого процесса.

-S файл       Возвращает true, если файл существует и является сокетом.

file1 -nt file2

Возвращает true, если file1 и file2 существуют и file1 новее, чем file2, или если file1 существует, но file2 нет.

file1 -ot file2

Возвращает true, если file1 и file2 существуют и file1 старше, чем file2, или если file2 существует, но file1 нет.

file1 -ef file2

Возвращает true, если file1 и file2 существуют и ссылаются на один и тот же файл.

строка        Возвращает true, если строка не является пустой.

s1 = s2       Возвращает true, если строки s1 и s2 идентичны.

s1 != s2      Возвращает true, если строки s1 и s2 не идентичны.

s1 < s2       Возвращает true, если строка s1 предшествует строке s2 на основе значения ASCII их символов.

s1 > s2       Возвращает true, если строка s1 следует за строкой s2 на основе значения ASCII их символов.

n1 -eq n2     Возвращает true, если целые числа n1 и n2 алгебраически равны.

n1 -ne n2     Возвращает true, если целые числа n1 и n2 не являются алгебраически равными.

n1 -gt n2     Возвращает true, если целое число n1 алгебраически больше, чем целое число n2.

n1 -ge n2     Возвращает true, если целое число n1 алгебраически больше или равно целому числу n2.

n1 -lt n2     Возвращает true, если целое число n1 алгебраически меньше, чем целое число n2.

n1 -le n2     Возвращает true, если целое число n1 алгебраически меньше или равно целому числу n2.

Эти основные операторы можно комбинировать со следующими операторами:

! выражение  Возвращает true, если выражение ложно.

выражение1 -a выражение2

Возвращает true, если и выражение1, и выражение2 истинны.

выражение1 -o выражение2

Возвращает true, если хотя бы одно из выражений выражение1 или выражение2 истинно.


(выражение) Истина, если выражение истинно.

Оператор -a имеет более высокий приоритет, чем оператор -o.

times Выводит накопленное время работы процессора для оболочки и для процессов, запущенных из оболочки. Код возврата равен 0.

trap [действие сигнал ...]

Заставляет оболочку анализировать и выполнять действие при получении любого из указанных сигналов. Сигналы указываются по номеру или по имени сигнала. Если сигнал равен 0 или EXIT, действие выполняется при выходе из оболочки. Действие может быть пустым (''), что приводит к игнорированию указанных сигналов. Если действие опущено или установлено в '-', указанные сигналы устанавливаются на действие по умолчанию. Когда оболочка создает дочернюю оболочку, она сбрасывает перехваченные (но не игнорируемые) сигналы на действие по умолчанию. Команда trap не влияет на сигналы, которые игнорировались при запуске оболочки. Команда trap без каких-либо аргументов выводит список сигналов и связанных с ними действий в стандартный вывод в формате, подходящем для использования в качестве входных данных для оболочки, которая обеспечивает те же результаты перехвата.

Примеры:

trap

Выводит список перехваченных сигналов и соответствующих им действий.

trap '' INT QUIT tstp 30

Игнорирует сигналы INT, QUIT, TSTP, USR1.

trap date INT

Выводит дату при получении сигнала INT.

type [имя ...]

Интерпретирует каждое имя как команду и выводит результат поиска команды. Возможные результаты: ключевое слово оболочки, псевдоним, встроенная команда оболочки, команда, отслеживаемый псевдоним и не найдено. Для псевдонимов выводится расширение псевдонима; для команд и отслеживаемых псевдонимов выводится полный путь к команде.

ulimit [-H | -S] [-a | -tfdscmlpnvwr [значение]]

Запрашивает или устанавливает жесткие или мягкие ограничения для процессов или устанавливает новые ограничения. Выбор между жестким ограничением (которое ни один процесс не может нарушить и которое нельзя повысить после его понижения) и мягким ограничением (которое вызывает отправку сигналов процессам, но не обязательно приводит к их завершению, и которое можно повысить) осуществляется с помощью следующих флагов:

-H устанавливает или запрашивает жесткие ограничения.

-S устанавливает или запрашивает мягкие ограничения. Если ни -H, ни -S не указаны, отображается мягкое ограничение или устанавливаются оба ограничения. Если указаны оба, последний из них имеет приоритет.

Затем ограничение, которое необходимо запросить или установить, выбирается путем указания любого из следующих флагов:

-a показывает все текущие ограничения.

-t показывает или устанавливает ограничение на время работы процессора (в секундах).

-f показывает или устанавливает ограничение на размер самого большого файла, который можно создать (в блоках по 512 байт).

-d показывает или устанавливает ограничение на размер сегмента данных процесса (в килобайтах).

-s показывает или устанавливает ограничение на размер стека процесса (в килобайтах).

-c показывает или устанавливает ограничение на максимальный размер файла дампа ядра, который может быть создан (в блоках по 512 байт).

-m показывает или устанавливает ограничение на общий объем физической памяти, который может использоваться процессом (в килобайтах).

-l показывает или устанавливает ограничение на объем памяти, который процесс может заблокировать с помощью mlock(2) (в килобайтах).

-p          отображает или устанавливает ограничение на количество процессов, которые может иметь пользователь одновременно.

-n          отображает или устанавливает ограничение на количество файлов, которые процесс может открыть одновременно.

-v          отображает или устанавливает ограничение на общий объем виртуальной памяти, используемой процессом (в килобайтах).

-w          отображает или устанавливает ограничение на общее количество блокировок, удерживаемых процессом.

-r          отображает или устанавливает ограничение на приоритет реального времени для процесса.

Если ни один из этих параметров не указан, отображается или устанавливается ограничение на размер файла. Если указано значение, ограничение устанавливается на это число; в противном случае отображается текущее ограничение.

Ограничения для произвольного процесса можно отображать или устанавливать с помощью утилиты sysctl(8).

umask [маска]

Устанавливает значение umask (см. umask(2)) на указанное восьмеричное значение. Если аргумент опущен, печатается значение umask.

unalias [-a] [имя]

Если указано имя, оболочка удаляет этот псевдоним. Если указан параметр -a, удаляются все псевдонимы.

unset [-fv] имя ...

Указанные переменные и функции удаляются и отменяются. Если указан параметр -f или -v, соответствующая функция или переменная удаляются соответственно. Если данное имя соответствует как переменной, так и функции, и не указаны параметры, удаляется только переменная.

wait [задача]

Ожидает завершения указанной задачи и возвращает код выхода последнего процесса в задаче. Если аргумент опущен, ожидает завершения всех задач и возвращает код выхода, равный нулю.

Редактирование командной строки

При интерактивном использовании dash из терминала текущую команду и историю команд (см. fc в разделе «Встроенные команды») можно редактировать с помощью редактирования командной строки в режиме vi. В этом режиме используются команды, описанные ниже, аналогичные подмножеству команд, описанных в справочной странице vi. Команда set -o vi включает редактирование в режиме vi и переводит sh в режим вставки. При включенном режиме vi sh можно переключать между режимом вставки и режимом команд. Это похоже на vi: нажатие ⟨ESC⟩ переводит в режим команд vi. Нажатие ⟨return⟩ в режиме команд передает строку в оболочку.

КОД ВЫХОДА

Ошибки, обнаруживаемые оболочкой, такие как синтаксическая ошибка, приведут к тому, что оболочка завершит работу с ненулевым кодом выхода. Если оболочка не является интерактивной, выполнение файла оболочки будет прервано. В противном случае оболочка вернет код выхода последней выполненной команды или, если используется встроенная команда exit с числовым аргументом, вернет этот аргумент.

ОКРУЖЕНИЕ

HOME       Автоматически устанавливается командой login(1) из каталога входа пользователя в файле паролей (passwd(4)). Эта переменная окружения также действует как аргумент по умолчанию для встроенной команды cd.

PATH       Путь поиска по умолчанию для исполняемых файлов. См. раздел выше «Поиск по пути».

CDPATH     Путь поиска, используемый встроенной командой cd.

MAIL       Имя файла почтового ящика, в котором будет проверяться наличие новой почты. Переопределяется
MAILPATH.

MAILCHECK  Частота в секундах, с которой оболочка проверяет наличие новой почты в файлах, указанных в
MAILPATH или в файле MAIL. Если установлено значение 0, проверка будет выполняться при каждом
вызове командной строки.

MAILPATH   Список имен файлов, разделенных двоеточием «:», которые оболочка должна проверять на наличие
входящей почты. Эта переменная среды переопределяет переменную MAIL. Максимальное количество почтовых
ящиков, которые можно отслеживать одновременно, составляет 10.

PS1        Основная строка приглашения, которая по умолчанию имеет значение «$ », если вы не являетесь
суперпользователем, в этом случае она по умолчанию имеет значение «# ».

PS2        Вторичная строка приглашения, которая по умолчанию имеет значение «> ».

PS4        Вывод перед каждой строкой при включенной трассировке выполнения (set -x), по умолчанию
«+ ».

IFS        Разделители полей ввода. Обычно устанавливается в ⟨пробел⟩, ⟨табуляция⟩ и ⟨новая строка⟩.
См. раздел «Разделение по пробелам» для получения дополнительной информации.

TERM       Настройка терминала по умолчанию для оболочки. Она наследуется дочерними процессами
оболочки и используется в режимах редактирования истории.

HISTSIZE   Количество строк в буфере истории оболочки.

PWD        Логическое значение текущего рабочего каталога. Устанавливается командой cd.

OLDPWD     Предыдущее логическое значение текущего рабочего каталога. Устанавливается командой cd.

PPID       Идентификатор процесса родительского процесса оболочки.

ФАЙЛЫ

$HOME/.profile

/etc/profile

СМ. ТАКЖЕ

csh(1), echo(1), getopt(1), ksh(1), login(1), printf(1), test(1), getopt(3), passwd(5), environ(7), sysctl(8)

ИСТОРИЯ

dash — это POSIX-совместимая реализация /bin/sh, которая стремится быть как можно более компактной.
dash является прямым потомком версии ash (Almquist SHell) NetBSD, портированной в Linux в начале 1997 года.
В 2002 году она была переименована в dash.

ОШИБКИ

Следует избегать использования setuid-скриптов оболочки, так как они представляют значительный риск для безопасности.

PS1, PS2 и PS4 должны подвергаться расширению параметров перед отображением.