bash doc
http://www.gnu.org/software/bash/manual/bash.html
1 Introduction
1.1 Что такое Bash
Bash это шелл, или командный интерпретатор для операционных систем GNU. Имя является акронимом от 'Bourne-Again SHell', игрой слов на Стивена Борна, автора прямого предка текущего Unix шелла - sh, который появился в Седьмом Издании Bell Labs Research версии Unix.
Bash хорошо совместим с sh и объединяет в себе полезные фишки из Korn shell ksh и C shell csh. Он направлен на то чтобы быть совместимой имплементацией 'IEEE POSIX Shell and Tools' которая является частью спецификации POSIX. Он предлагает улучшения функционала поверх sh сразу для интерактивности и использования в программировании.
Операционные системы GNU предоставляют другие шеллы, включая csh, Bash является шеллом по умолчанию. Как и другое ПО GNU, Bash полностью портабельный. На данный момент он запускается на почти каждом Unix'e и нескольких других ОС - существуют порты для MS-DOS, OS/2 и Windows которые поддерживаются независимыми разработчиками.
1.2 Что такое Шелл
В основе, шелл это макропроцессор который выполняет команды. Термин макропроцессор обозначает функциональность при которой текст и символы расширяются до больших выражений.
Unix шелл одновременно и интерпретатор команд и язык программирования. Как интерпретатор команд шелл предоставляет пользовательский интерфейс к богатому набору GNU утилит. Как язык программирования он позволяет комбинировать эти утилиты. Можно создавать файлы с командами и делать их командами. Эти новые команды могут иметь такой же статус как и системные команды в таких директориях как /bin, позволяя пользователям или группам создавать кастомные условия для автоматизации их повседневных задач.
Шеллы могут использоваться интерактивно или неинтерактивно. В интерактивном режиме они позволяют делать ввод с клавиатуры. В неинтерактивном шеллы выполняют команды читая их из файла.
Шелл позволяет выполнять GNU команды синхронно и асинхронно. Шелл ждет окончания выполнения синхронной команды прежде чем разрешить вводить новые команды; асинхронные команды продолжают выполнение в параллели с шеллом пока он читает и выполняет дополнительные команды. Перенаправления позволяют тонко контролировать ввод и вывод команд. Кроме того шелл позволяет контролировать окружения команд.
Шеллы также предоставляют небольшой набор встроенных команд (builtins) давая функциональность которую невозможно или неудобно получить через выделенные утилиты. Например, cd, break, continue и exec не могут быть выполнены снаружи шелла, потому что они направлены на управление самим шеллом. Встроенные history, getopts, kill или pwd могут быть имплементированы в выделенных утилитах, но их гораздо удобнее использовать как встроенные команды. Все встроенные команды будут описаны ниже.
Хоть выполнение команд это и суть оболочки, основная мощь (и сложность) связана с внутренним языком программирования. Как и любой высокоуровневый язык, шелл предоставляет переменные, конструкции для конроля над потоком выполнения, кавычки и функции.
Шеллы предлагают функции специфические для интерактивного использования, а не для расширения возможностей языка программирования. Эти интерактивные функции включают контроль над задачами, редактирование командной строки, историю команд и алиасы. Каждая из этих функций будет описана в этом мануале.
2 Определения
Эти определения используются во всей оставшейся части этого манула.
- POSIX - Семейство стандартов открытых систем основанных на Unix. Bash относится к части 'Shells and Utilities' стандарта POSIX 1003.1
- blank - Символ пробела или таба
- builtin - Команды которые имплементированы внутри самого шелла, вместо исполняемого файла где-либо в файловой системе
-
control operator - Символ который выполняет контролирующую функцию. Им может быть символ новой строки или один из следующих символов:
||
,&&
,&
,;
,;;
,;&
,;;&
,|
,|&
,(
или)
- exit status - Значение возвращенное командой тому кто ее вызвал. Это значение ограничено 8 битами, таким образом максимальное значение - 255
- field - Часть текста которая является результатом одного из расширений шелла. После расширения при исполнении команды результирующие поля используются как имя команды и ее аргументы
- filename - Строка символов используемая для идентификации файла
- job - Набор процессов составляющих пайплайн и некоторые процессы происходящие от него, которые находятся в одной группе процессов
- job control - Механизм которым пользователи могут выборочно останавливать (suspend) и перезапускать (resume) выполнение процессов
-
metacharacter - Символ который, когда раскавыченный, разделяет слова. Метасимвол это пробел, таб, новая строка или один из следующих символов:
|
,&
,;
,(
,)
,<
или>
- name - word состоящее исключительно из букв, цифр и подчеркиваний, и начинающееся с буквы или подчеркивания. Names используются как имена переменых и функций. То же что и identifier
- operator - control operator или redirection operator. Смотри '3.6 Перенаправления' чтобы получить список операторов перенаправления. Операторы содержат как минимум один раскавыченный метасимвол
- process group - Коллекция связанных процессов которые имеют один process group ID (PGID)
- process group ID - Уникальный идентификатор который отображает procces group на протяжении жизни процесса
- reserved word - word которое имеет специальное значение в шелле. Много зарезервированных слов представлено в конструкциях для контроля потоков исполнения, такие как for и while
- return status - То же что и exit status
- signal - Механизм с помощью которого процессы могут быть уведомлены ядром о событиях происходящих в системе
- special builtin - Встроенные команды которые могут быть классифицированы стандартом POSIX как специальные
- token - Последовательность символов рассматриваемая шеллом как одиночная единица. Это любое word или operator
- word - Последовательность символов рассматриваемая шеллом как единое целое. Слова могут не содержать раскавыченных metacharacters
3 Базовые Функции Оболочки
Bash это акроним для 'Bourne-Again SHell'. Шелл Борна это традиционный Unix шелл написанный Стивеном Борном. Все встроенные команды Шелла Борна доступны в Bash, Правила оценки и цитирования взяты из спецификации POSIX для 'стандартной' оболочки Unix.
Эта глава кратко резюмирует 'строительные блоки' шелла: команды, структуры управления, функции шелла, параметры шелла, расширения, перенаправления, которые являются способом прямого ввода и вывода из и в именованный файл, и то как шелл выполняет команды.
3.1 Синтакс Шелла
Когда шелл читает ввод, он делает это через последовательность операций. Если ввод показывает что начинается комментарий, то шелл игнорирует символ комментария ('#') и остальную строку.
Иначе, грубо говоря, шелл читает инпут и разделяет его на слова и операторы, применяя правила для выбора того какие значения назначать различным словам и символам.
Затем шелл парсит эти токены в команды и другие конструкции, убирает особый смысл у одних слов и символов, расширяет другие, перенаправляет ввод и вывод как надо, выполняет указанные команды, ждет код ответа этих команд и делает его доступным для последующей инспекции или обработки.
3.1.1 Работа Шелла
Далее краткое описание работы шелла когда он читает и выполняет команду. Обычно шелл делает следующее:
- Читает ввод из файла (см. '3.8 Шелл скрипты'), из строки которая передана аргументом в
-c
опцию вызова (см. '6.1 Вызов Bash') или из пользовательского терминала - Разделяет ввод на слова и операторы, используя правила кавычек описанные в '3.1.2 Кавычинг'. Эти токены выделяются с помощью metacharacters. Разворачивание алиасов выполняется на этом этапе (см. '6.6 Алиасы')
- Парсинг токенов в простые и сложные команды (см. '3.2 Команды Шелла')
- Выполнение различных расширений (см. '3.5 Шелл Расширения'), разбиение расширенных токенов в список имен файлов (см. '3.5.8 Расширение Имен Файлов'), команд и аргументов
- Выполнение необходимых перенаправлений (см. '3.6 Перенаправления') и удаление операторов перенаправления и их операндов из списка аргументов
- Выполнение команд (см. '3.7 Выполнение Команд')
- Опциональное ожидание завершения команд и сбор их статускодов (см. '3.7.5 Статускод')
3.1.2 Кавычинг
Кавычинг используется для удаления специальных значений определенных символов и слов в шелле. Кавычинг может быть использован для отключения специальной обработки для специльных символов, для предотвращения от распознавания зарезервированых слов как таковых, и для предотвращения разворачивания параметров.
Каждый из метасимволов (см. '2 Определения') имеет специальное значение и поэтому должен быть закавычен если он должен отображать себя. Когда используется символ разворачивания из истории команд, обычно это '!', он должен быть закавычен для предотвращения разворачивания.
Имеется три кавычинговых механизма: escape character, одиночные кавычки, двойные кавычки.
3.1.2.1 Эскейп Символы
Незакавыченный бэкслэш '\' это Bash escape символ. Он отображает буквальное значение следующего за ним символа, символ новой строки - исключение. Если встречается пара \newline в которой бэкслэш незакавычен, то символ новой строки рассматривается как продолжение строки (он удаляется из введенной строки и по факту игнорируется).
root@mars:~# echo niga\ #enter
>pidor #enter
nigapidor
3.1.2.2 Одиночные Кавычки
Символы заключенные в одиночные кавычки (" ' ") отоборажают буквальное значение каждого символа в кавычках. Одиночная кавычка не может быть между одиночными кавычками, даже если она заэкранирована бэкслэшем.
root@mars:~# echo 'niga'pidor'
> ^C
root@mars:~# echo 'niga\'pidor'
> ^C
3.1.2.3 Двойные Кавычки
Заключенные в двойные кавычки символы (' " ') отображаются буквально за исключением $
, ~
и \
и если разворачивание из истории включено, то еще !
. Когда шелл в режиме POSIX, то '!' не имеет специального значения в двойных кавычках, даже когда разворачивание из истории включено. '$' и '~' сохраняют свой особый смысл в двойных кавычках. Бэкслэш сохраняет специальное значение только когда за ним следует один из следующих символов: $
, ~
, "
, \
или newline
. В двойных кавычках бэкслэши, после которых идут перечисленные символы, будут удалены. Бэкслэши предшествующие символам без специального значения будут оставаться неизменными. Двойная кавычка может быть закавычена в двойные кавычки, с использованием предваряющего ее бэкслэша. Если разворачивание из истории включено, то оно будет выполняться пока '!' встречающийся в двойных кавычках не будет заэкранирован бэкслэшем. Предшествующий восклицательному знаку бэкслэш не удаляется.
Специальные параметры *
и @
имеют специальное значение в двойных кавычках.
3.1.2.4 ANSI-C Кавычинг
Слова в форме $'string'
обрабатываются по особому. Строка развернется в string, и заменит заэкранированные символы так как описано в ANSI C стандарте. Бэкслэшем заэкранированные последовательности, если они есть, будут декодированы следующим образом:
- \a - Алерт
- \b - Backspace
- \e/\E - Эскейп-символ (не ANSI C)
- \f - - form feed (типа перенос строки)
- \n - Новая строка
- \r - Возврат каретки
- \t - Горизонтальный таб
- \v - Вертикальный таб
- \ - Бэкслэш
- ' - Одиночная кавычка
- " - Двойная кавычка
- ? - Знак вопроса
- \nnn - Восьмибитный символ (ниже будет пример, можно искать их по таблице ASCI)
- \xHH - Шестнадцатиричный символ
- \uHHHH - Unicode (ISO/IEC 10646) символ в шестнадцатиричном виде
- \UHHHHHHHH - То же что и выше
- \cx - control-x символ
Результат разворачивания будет одинарно-закавыченный, как если бы знака доллара не было.
root@mars:~# echo $'aa\bb'
ab
root@mars:~# echo $'aa\fb'
aa
b
root@mars:~# echo $'aa\nb'
aa
b
root@mars:~# echo $'aa\rb'
ba
root@mars:~# echo $'aa\tb'
aa b
root@mars:~# echo $'aa\vb'
aa
b
root@mars:~# echo $'aa\044b'
aa$b
root@mars:~# echo $'aa\x24b'
aa$b
root@mars:~# echo $'aa\u0024b'
aa$b
root@mars:~# echo $'aa\U00000024b'
aa$b
3.1.2.5 Локаль-специфичные Переводы
Строка в двойных кавычках с предшествующим долларом ('$') будет переведена основываясь на текущей локали. gettext
выполнит поиск message catalog'a и перевод, используя переменные LC_MESSAGES и TEXTDOMAIN как объясняется ниже. Смотри документацию к gettext для дополнительных деталей. Если текущая локаль C или POSIX или если нет доступных переводов, то знак доллара будет проигнорирован. Если строка переведена и в ней выполнена замена, то результат будет в двойных кавычках.
Некоторые системы используют message catalog выбранный с помощью переменной LC_MESSAGES. Другие создают имя message catalog'a из значения переменной TEXTDOMAIN, возможно добавляя суффикс '.mo'. Если ты используешь переменную TEXTDOMAIN, тебе может потребоваться установить в переменную TEXTDOMAINDIR расположение файла message catalog'a. Некоторые все еще используют обе переменные таким образом: TEXTDOMAINDIR/LC_MESSAGES/LC_MESSAGES/TEXTDOMAIN.mo.
3.1.3 Комментарии
В неинтерактивном шелле или интерактивном, но с включенной shopt опцией interactive_comments, слова начинающиеся с '#' и вся дальнейшая строка за этим словом будет игнорироваться. В интерактивном шелле без опции interactive_comments комментарии не разрешены. Опция interactive_comments по умолчанию включена.
root@mars:~# shopt interactive_comments
interactive_comments off
root@mars:~# echo niga # pidor
niga # pidor
root@mars:~# shopt -s interactive_comments
root@mars:~# shopt interactive_comments
interactive_comments on
root@mars:~# echo niga # pidor
niga
3.2 Команды Шелла
Такие простые команды как echo a b c состоят из самой команды и следующих за ней аргументов разделенных пробелами.
Множество комплексных шелл команд состоят из простых команд объединенных вместе различными способами: пайплайном в котором вывод одной команды входит в ввод следующей, циклом или условной конструкцией, или каким-то другим способом.
3.2.1 Зарезервированные Слова
Зарезервированные слова это слова которые имеют специальное значение для шелла. Они используются для начала и окончания составных команд.
Следующие слова известны как зарезервированные когда они незаковычены и являются первым словом в команде:
if | then | elif | else | fi | time |
for | in | until | while | do | done |
case | esac | coproc | select | function | |
{ | } | [[ | ]] | ! |
in
распознается как зарезервированное слово если оно третье после команды case или select. in
и do
распознаются как зарезервированные слова если они третьи после команды for.
3.2.2 Простые Команды
Простые команды это вид команд который встречается чаще всего. Это просто последовательность слов разделенная с помощью blanks и заканчивающаяся одним из контрольных операторов шелла. Первое слово обычно определяет выполняемую команду, оставшиеся слова будут аргументами команды.
Статускод простой команды это exit status предоставляемый функцией waitpid стандарта POSIX 1003.1, или 128+n если команда была завершена сигналом n.
3.2.3 Пайплайны
Пайплайн это последовательность из одной или более команд разделенных операторами управления '|' или '|&'.
Формат пайплайнов
[time [-p]] [!] command1 [ | or |& command2 ] …
Вывод каждой команды в пайплайне соединяется через пайп с вводом следующей команды. То есть каждая команда читает аутпут предыдущей команды. Это соединение устанавливается до каких-либо перенаправлений определенных командой.
Если используется |&
, то stderr вместе с stdout command1, подключается к stdin command2 через пайп; это сокращение для 2>&1 |
. Это подразумевает что перенаправление stderr в stdout будет выполнено после редиректов определенных командой.
Я не понял два абзаца выше, поэтому вот оригинал:
The output of each command in the pipeline is connected via a pipe to the input of the next command. That is, each command reads the previous command’s output. This connection is performed before any redirections specified by the command.
If ‘|&’ is used, command1’s standard error, in addition to its standard output, is connected to command2’s standard input through the pipe; it is shorthand for 2>&1 |. This implicit redirection of the standard error to the standard output is performed after any redirections specified by the command.
Зарезервированное слово time
выводит статистику времени выполнения пайплайна. Статистика содержит затраченное время и время в user и system спейсах. Опция -p
изменяет формат вывода на определенный POSIX'ом. Когда шелл в POSIX режиме ...
No Comments