Linux Unix Команда: sh

Содержание
  1. название
  2. Synopisis
  3. Описание
  4. Опции
  5. аргументы
  6. мольба
  7. Определения
  8. Зарезервированные слова
  9. Простые команды
  10. Трубопроводы
  11. Списки
  12. Составные команды
  13. Комментарии
  14. параметры
  15. Позиционные параметры
  16. Специальные параметры
  17. Переменные оболочки
  18. Массивы
  19. Расширение скобок
  20. Расширение Тильды
  21. Расширение параметра
  22. Подстановка команд
  23. Арифметическое Расширение
  24. Процесс замены
  25. Расщепление слов
  26. Расширение пути
  27. Сопоставление с образцом
  28. Удаление цитаты
  29. Перенаправление ввода
  30. Перенаправление вывода
  31. Добавление перенаправленного вывода
  32. Перенаправление стандартного вывода и стандартной ошибки
  33. Здесь документы
  34. Здесь Строки
  35. Дублирование файловых дескрипторов
  36. Перемещение дескрипторов файлов
  37. Открытие файловых дескрипторов для чтения и записи
  38. Псевдонимы
  39. функции
  40. Арифметическая оценка
  41. Условные выражения
  42. Простое расширение команд
  43. Выполнение команды
  44. Среда выполнения команд
  45. Источник

название

bash – GNU Bourne-Again Sheell

Synopisis

bash [параметры] [файл]

Описание

Bash – это sh -совместимый интерпретатор языка команд, который выполняет команды, считываемые из стандартного ввода или из файла. Bash также включает полезные функции из оболочек Korn и C ( ksh и csh ).

Bash предназначен для совместимой реализации спецификации оболочки и инструментов IEEE POSIX (IEEE Working Group 1003.2).

Опции

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

-c строка

Если указан параметр -c , команды считываются из строки . Если после строки есть аргументы, они назначаются позиционным параметрам, начиная с $ 0 .

-i

Если указан параметр -i , оболочка является интерактивной .

-l

Сделайте так, чтобы bash действовал так, как если бы он был вызван как оболочка для входа (см. ПРИВЕДЕНИЕ ниже).

-r

Если указан параметр -r , оболочка становится ограниченной (см. ОГРАНИЧЕННАЯ ОБОЛОЧКА ниже).

-s

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

-D

Список всех строк в двойных кавычках, перед которыми стоит $ , выводится в стандартном выводе. Это строки, которые подлежат переводу на язык, если текущим языковым стандартом не является C или POSIX . Это подразумевает параметр -n ; никакие команды не будут выполнены.

[- +] O [ shopt_option ]

shopt_option – это один из параметров оболочки, поддерживаемый встроенным shopt (см. ВСТРОЕННЫЕ КОМАНДЫ ОБОЛОЧКИ ниже). Если присутствует shopt_option , -O устанавливает значение этого параметра; + O удаляет его. Если shopt_option не указан, имена и значения параметров оболочки, принимаемых shopt , выводятся на стандартный вывод. Если опция вызова – + O , выходные данные отображаются в формате, который можно повторно использовать в качестве входного.

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

Bash также интерпретирует несколько многосимвольных параметров. Эти параметры должны отображаться в командной строке до распознавания односимвольных параметров.

– дамп-ро-строки

Эквивалентен -D , но вывод в формате файла GNU gettext po (переносимый объект).

– самосвалы строки

Эквивалент -D .

– помощь

Отобразите сообщение об использовании в стандартном выводе и успешно завершите работу.

– INIT-файл файл

– файл_конфигурации файл

Выполняйте команды из файла вместо стандартного личного файла инициализации ~/.bashrc , если оболочка является интерактивной (см. INVOCATION ниже).

– Войти

Эквивалент -l .

– noediting

Не используйте библиотеку GNU readline для чтения командных строк, когда оболочка является интерактивной.

– noprofile

Не читайте ни системный файл запуска /etc/profile , ни какие-либо из личных файлов инициализации ~/.bash_profile , ~/.bash_login или ~/.profile . По умолчанию bash читает эти файлы, когда он вызывается в качестве оболочки входа в систему (см. INVOCATION ниже).

– NORC

Не читайте и не выполняйте личный файл инициализации ~/.bashrc , если оболочка является интерактивной. Эта опция включена по умолчанию, если оболочка вызывается как sh .

– POSIX

Измените поведение bash , если операция по умолчанию отличается от стандарта POSIX 1003.2, чтобы он соответствовал стандарту ( режим posix ).

– ограниченный

Оболочка становится ограниченной (см. ОГРАНИЧЕННАЯ ОБОЛОЧКА ниже).

– оборотов в минуту, требуется

Создайте список файлов, необходимых для запуска сценария оболочки. Это подразумевает ‘-n’ и подчиняется тем же ограничениям, что и проверка на ошибки времени компиляции; Backticks, [] тесты и evals не анализируются, поэтому некоторые зависимости могут быть пропущены. – многословный эквивалентен -v .

– версия

Показать информацию о версии для этого экземпляра bash в стандартном выводе и успешно завершиться.

аргументы

Если аргументы остаются после обработки параметра, и ни параметр -c , ни параметр -s не были предоставлены, первым аргументом считается имя файла, содержащего команды оболочки , Если bash вызывается таким образом, для $ 0 указывается имя файла, а для позиционных параметров – оставшиеся аргументы. Bash читает и выполняет команды из этого файла, а затем завершает работу. Состояние выхода Bash – это состояние завершения последней команды, выполненной в сценарии. Если команды не выполняются, статус выхода равен 0. Сначала делается попытка открыть файл в текущем каталоге, и, если файл не найден, оболочка ищет каталоги в PATH для поиска. сценарий.

мольба

логин – это тот, чей первый символ нулевого аргумента – , или тот, который начинается с опции – логин .

Оболочка интерактивная запускается без аргументов без опций и без опции -c , стандартные входы и выходы которых подключены к терминалам (как определено isatty (3)), или один начался с опции -i . PS1 установлено, а $ – включает i , если bash является интерактивным, что позволяет сценарию оболочки или файлу запуска проверить это состояние.

В следующих параграфах описывается, как bash выполняет свои файлы запуска. Если какой-либо из файлов существует, но не может быть прочитан, bash сообщает об ошибке. Тильды раскрываются в именах файлов, как описано ниже в разделе Расширение тильды в разделе РАСШИРЕНИЕ .

Когда bash вызывается в качестве интерактивной оболочки для входа или в качестве неинтерактивной оболочки с параметром – login , он сначала читает и выполняет команды из файла /etc/profile , если этот файл существует. После прочтения этого файла он ищет ~/.bash_profile , ~/.bash_login и ~/.profile в этом порядке, и читает и выполняет команды из первой, которая существует и доступна для чтения. Параметр – noprofile можно использовать, когда оболочка запущена, чтобы запретить это поведение.

При выходе из оболочки входа в систему bash читает и выполняет команды из файла ~/.bash_logout , если он существует.

Когда запускается интерактивная оболочка, которая не является оболочкой входа, bash считывает и выполняет команды из ~/.bashrc , если этот файл существует. Это может быть запрещено с помощью параметра – norc . Параметр – rcfile file заставит bash читать и выполнять команды из файла вместо ~ /.bashrc .

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

if [-n “$ BASH_ENV”]; затем . “$ BASH_ENV”; фи

но значение переменной PATH не используется для поиска имени файла.

Если bash вызывается с именем sh , он пытается максимально близко имитировать поведение при запуске исторических версий sh , при этом соблюдая стандарт POSIX. При вызове в качестве интерактивной оболочки для входа или неинтерактивной оболочки с параметром – login он сначала пытается прочитать и выполнить команды из /etc/profile и ~/.profile , в таком порядке. Параметр – noprofile можно использовать для подавления этого поведения. При вызове в качестве интерактивной оболочки с именем sh bash ищет переменную ENV , расширяет ее значение, если она определена, и использует расширенное значение как имя файла для чтения и выполнения. Поскольку оболочка, вызываемая как sh , не пытается читать и выполнять команды из любых других файлов запуска, параметр – rcfile не действует.Неинтерактивная оболочка, вызываемая с именем sh , не пытается читать другие файлы запуска. При вызове sh , bash переходит в режим posix после чтения файлов запуска.

Когда bash запускается в режиме posix , как в случае с параметром командной строки – posix , он соответствует стандарту POSIX для файлов запуска. В этом режиме интерактивные оболочки расширяют переменную ENV , а команды читаются и выполняются из файла, имя которого является расширенным значением. Другие файлы запуска не читаются.

Bash пытается определить, когда он запускается демоном удаленной оболочки, обычно rshd . Если bash определит, что он запускается rshd , он читает и выполняет команды из ~/.bashrc , если этот файл существует и доступен для чтения. Это не будет сделано, если вызывается как sh . Параметр – norc можно использовать для запрета этого поведения, а параметр – rcfile можно использовать для принудительного чтения другого файла, но rshd обычно не вызывает оболочку с этими параметрами и не позволяет их указывать.

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

Определения

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

пробел

Пробел или табуляция.

слово

Последовательность символов, рассматриваемая оболочкой как единое целое. Также известен как токен .

Имя

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

метасимволом

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

| &; () пробел

оператор управления

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

|| & &&; ;; () |

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

Зарезервированные слова – это слова, которые имеют особое значение для оболочки. Следующие слова распознаются как зарезервированные, если не заключены в кавычки, и либо первое слово простой команды (см. ГРАММАТА ОБОЛОЧКИ ниже), либо третье слово из регистра или для команда:

! дело сделано elif else esac fi для функции if в select then до while {} time [[]]

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

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

Возвращаемое значение простой команды – это состояние выхода или 128+ n , если команда завершается сигналом n .

Трубопроводы

pipe – это последовательность из одной или нескольких команд, разделенных символом | . Формат для конвейера:

[ время [ -p ]] [! ] команда [ | команда2 …]

Стандартный вывод command подключен через канал к стандартному вводу command2 . Это соединение выполняется перед любыми перенаправлениями, указанными командой (см. REDIRECTION ниже).

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

Если зарезервированное слово time предшествует конвейеру, истекшее время, а также пользовательское и системное время, затраченное на его выполнение, сообщаются, когда конвейер завершается. Параметр -p изменяет формат вывода на формат, указанный в POSIX. Переменная TIMEFORMAT может быть настроена на строку формата, которая определяет способ отображения информации о времени; см. описание TIMEFORMAT в разделе Переменные оболочки ниже.

Каждая команда в конвейере выполняется как отдельный процесс (т. Е. В подоболочке).

Списки

список – это последовательность из одного или нескольких конвейеров, разделенных одним из операторов ; , & , && , или || и могут быть прекращены одним из ; , & или .

Из этих операторов списка, && и || имеют равный приоритет, за ними следуют ; и &, , которые имеют одинаковый приоритет. старшинство.

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

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

Операторы управления && и || обозначают списки AND и OR соответственно. Список AND имеет вид

command1 && command2

command2 выполняется тогда и только тогда, когда command1 возвращает нулевое состояние завершения.

ИЛИ список имеет форму

command1 || command2

command2 выполняется тогда и только тогда, когда command1 возвращает ненулевой статус выхода. Статус возврата списков AND и OR – это статус выхода последней команды, выполненной в списке.

Составные команды

составная команда является одной из следующих:

( список )

список выполняется в подоболочке. Переменные и встроенные команды, которые влияют на среду оболочки, не остаются в силе после ее завершения. Статус возврата – это статус выхода из списка .

{ список ; }

list просто выполняется в текущей среде оболочки. список должен заканчиваться символом новой строки или точкой с запятой. Это известно как групповая команда . Статус возврата – это статус выхода из списка . Обратите внимание, что в отличие от метасимволов ( и ) , { и } являются зарезервированными словами и должно произойти, когда зарезервированное слово разрешено распознавать. Поскольку они не вызывают разрыв слова, они должны быть отделены от list пробелом.

(( выражение ))

выражение оценивается в соответствии с правилами, описанными ниже в разделе ARITHMETIC EVALUATION . . Если значение выражения не равно нулю, возвращаемый статус 0; в противном случае возвращаемый статус равен 1. Это в точности эквивалентно let “ expression.

[[ выражение ]]

Вернуть состояние 0 или 1 в зависимости от оценки условного выражения expression . Выражения состоят из основных цветов, описанных ниже в разделе УСЛОВНЫЕ ВЫРАЖЕНИЯ . Разделение слов и расширение пути не выполняются для слов между [[ и < сильный>]] ; Выполняется расширение тильды, расширение параметров и переменных, арифметическое расширение, подстановка команд, подстановка процессов и удаление кавычек.

Когда используются операторы == и ! = , строка справа от оператора считается шаблоном и сопоставляется в соответствии с правилами, описанными ниже в разделе Шаблон Сопоставление . Возвращаемое значение равно 0, если строка соответствует или не соответствует шаблону, соответственно, и 1 в противном случае. Любая часть шаблона может быть заключена в кавычки, чтобы ее можно было сопоставить как строку.

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

( выражение )

Возвращает значение выражения . Это может быть использовано для отмены нормального приоритета операторов.

! выражение

Истинно, если expression равно false.

выражение1 && выражения2

Истинно, если оба значения expression1 и expression2 имеют значение true.

expression1 || expression2 Истина, если expression1 или expression2 имеет значение true.

Операторы && и || не оценивают expression2 , если значение expression1 достаточно для определения возвращаемого значения всего условного выражения.

for name [ in word ]; сделать список ; сделано

Список слов, следующих за в , расширяется, создавая список элементов. Переменная name устанавливается по очереди для каждого элемента этого списка, и list выполняется каждый раз. Если в word опущено, команда для выполняет список один раз для каждого установленного позиционного параметра (см. ПАРАМЕТРЫ ниже). Статус возврата – это статус выхода последней команды, которая выполняется. Если раскрытие элементов, следующих за в , приводит к пустому списку, команды не выполняются, а статус возврата равен 0.

for (( expr1 ; expr2 ; expr3 )); сделать список ; сделано

Сначала арифметическое выражение expr1 оценивается в соответствии с правилами, описанными ниже в разделе АРИТМЕТИКА ОЦЕНКА . Арифметическое выражение expr2 затем оценивается многократно, пока не станет нулевым. Каждый раз, когда expr2 оценивается как ненулевое значение, выполняется список и вычисляется арифметическое выражение expr3 . Если какое-либо выражение опущено, оно ведет себя так, как будто оно имеет значение 1. Возвращаемое значение – это состояние завершения последней команды в списке , которая выполняется, или значение false, если какое-либо из выражений является недопустимым.

выберите имя [ в слово ]; сделать список ; сделано

Список слов, следующих за в , расширяется, создавая список элементов. Набор расширенных слов напечатан на стандартной ошибке, каждому из которых предшествует число. Если в word не указано, позиционные параметры печатаются (см. ПАРАМЕТРЫ ниже). Затем отобразится приглашение PS3 и строка будет считана со стандартного входа. Если строка состоит из числа, соответствующего одному из отображаемых слов, этому значению присваивается значение name . Если строка пуста, слова и подсказка отображаются снова. Если EOF читается, команда завершается. Любое другое прочитанное значение приводит к тому, что для name устанавливается значение null. Чтение строки сохраняется в переменной ОТВЕТИТЬ . list выполняется после каждого выбора, пока не будет выполнена команда break . Состояние выхода select – это состояние выхода последней команды, выполненной в списке , или ноль, если команды не выполнялись.

case word в [[(] шаблон [ | шаблон ]

Команда case сначала раскрывает word и пытается сопоставить его с каждым шаблоном по очереди, используя те же правила сопоставления, что и для раскрытия пути (см. Расширение пути ниже). Когда совпадение найдено, выполняется соответствующий список . После первого матча никакие последующие совпадения не предпринимаются. Статус выхода равен нулю, если шаблон не соответствует. В противном случае это статус завершения последней команды, выполненной в списке .

, если список ; затем список [ Элиф список ; затем список ; ] … [ else list ; ] ц

if list выполняется. Если статус выхода равен нулю, выполняется затем список . В противном случае каждый elif список выполняется по очереди, и если его статус выхода равен нулю, соответствующий затем список выполняется и команда завершается. В противном случае, else list выполняется, если он присутствует. Состояние выхода – это состояние выхода последней выполненной команды или ноль, если ни одно условие не проверено как истинное.

, а список ; сделать список ; сделано

до список ; сделать список ; сделано

Команда while непрерывно выполняет do list , пока последняя команда в list возвращает нулевое состояние выхода. , Команда till идентична команде while , за исключением того, что тест отменен; do list выполняется, пока последняя команда в list возвращает ненулевой статус выхода. Состояние выхода команд while и till – это состояние выхода последней выполненной команды do list или ноль, если ни один не был выполнен.

[ function ] name () { list ; }

Это определяет функцию с именем name . тело функции – это список команд между {и}. Этот список выполняется всякий раз, когда name указывается в качестве имени простой команды. Состояние выхода функции – это состояние выхода последней команды, выполненной в теле. (См ФУНКЦИИ ниже.)

Комментарии

В неинтерактивной оболочке или интерактивной оболочке, в которой включена опция interactive_comments встроенной функции shopt (см. КОМАНДЫ ОБЪЕКТА СТРОКИ ниже) слово, начинающееся с # , игнорирует это слово и все остальные символы в этой строке. Интерактивная оболочка без включенной опции interactive_comments не позволяет комментировать. Параметр interactive_comments включен по умолчанию в интерактивных оболочках.

квотирование

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

Каждый из метасимволов , перечисленных выше в разделе ОПРЕДЕЛЕНИЯ , имеет особое значение для оболочки и должен заключаться в кавычки, если он представляет себя.

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

Существует три механизма цитирования: escape-символ , одинарные и двойные кавычки.

Обратная косая черта без кавычек ( \ ) – это escape-символ . Он сохраняет буквальное значение следующего символа, за исключением. Если появляется пара \ и обратная косая черта сама по себе не заключена в кавычки, \ рассматривается как продолжение строки (то есть она удаляется из входного потока и фактически игнорируется ).

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

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

Специальные параметры * и @ имеют особое значение в двойных кавычках (см. ПАРАМЕТРЫ ниже).

Слова вида $ string ‘ обрабатываются специально. Слово расширяется до string , символы с обратной косой чертой заменяются в соответствии со стандартом ANSI C. Экранирующие последовательности с обратной косой чертой, если они есть, декодируются следующим образом:

\ а

оповещение (звонок)

\ Ь

возврат на одну позицию

\ е

побег персонаж

\ е

подача формы

\ п

новая линия

\ г

возврат каретки

\ т

горизонтальная вкладка

\ v

вертикальная вкладка

\\

обратный слэш

\ ‘

одиночная цитата

\ NNN

восьмибитный символ, значение которого является восьмеричным значением nnn (от одной до трех цифр)

\ х HH

восьмибитный символ, значение которого является шестнадцатеричным значением HH (одна или две шестнадцатеричные цифры)

\ с х

управляющий символ x

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

Строка в двойных кавычках, перед которой стоит знак доллара ( $ ), приведет к переводу строки в соответствии с текущей локалью. Если текущим языковым стандартом является C или POSIX , знак доллара игнорируется. Если строка переведена и заменена, замена заменяется двойными кавычками.

параметры

параметр – это объект, который хранит значения. Это может быть имя , число или один из специальных символов, перечисленных ниже в разделе Специальные параметры . Для целей оболочки переменная – это параметр, обозначаемый name . Переменная имеет значение и ноль или более атрибутов .Атрибуты назначаются с помощью встроенной команды Declare (см. Ниже Declare в разделе SHELL BUILTIN КОМАНДЫ ).

Параметр устанавливается, если ему было присвоено значение. Нулевая строка является допустимым значением. После того, как переменная установлена, ее можно сбросить только с помощью встроенной команды unset (см. КОМАНДЫ СОСТАВА ОБОЛОЧКИ ниже).

переменная может быть назначена оператором в форме

имя = [<ет> значение ]

Если значение не задано, переменной присваивается пустая строка. Все значения подвергаются раскрытию тильды, расширению параметров и переменных, подстановке команд, расширению арифметики и удалению кавычек (см. РАСШИРЕНИЕ ниже). Если для переменной задан атрибут integer , тогда value подвергается арифметическому расширению, даже если расширение $ ((…)) не используется (см. Арифметическое расширение ниже). Разделение слов не выполняется, за исключением “$ @” , как описано ниже в разделе Специальные параметры . Расширение пути не выполняется. Заявления о назначении также могут появляться в качестве аргументов для Declare , typeset , экспорт , только для чтения и локальных встроенные команды.

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

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

Когда позиционный параметр, состоящий из более чем одной цифры, раскрывается, он должен быть заключен в фигурные скобки (см. РАСШИРЕНИЕ ниже).

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

Оболочка обрабатывает несколько параметров специально. На эти параметры можно ссылаться только; присвоение им не допускается.

*

Расширяется до позиционных параметров, начиная с единицы. Когда раскрытие происходит в двойных кавычках, оно расширяется до одного слова со значением каждого параметра, разделенного первым символом специальной переменной IFS . То есть $ * эквивалентно $ 1 c $ 2 c “, где c – это первый символ значения переменной IFS . Если IFS не установлено, параметры разделяются пробелами. Если IFS равно нулю, параметры объединяются без промежуточных разделителей.

@

Расширяется до позиционных параметров, начиная с единицы. Когда раскрытие происходит в двойных кавычках, каждый параметр раскрывается в отдельное слово. То есть “ $ @ ” эквивалентно “ $ 1 ” “ $ 2 ” … Когда нет позиционных параметров, “ $ @ “и $ @ расширяются до нуля (то есть они удаляются).

#

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

Расширяется до состояния самого последнего выполненного переднего конвейера.

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

$

Расширяется до идентификатора процесса оболочки. В подоболочке () она расширяется до идентификатора процесса текущей оболочки, а не подоболочки.

Расширяется до идентификатора процесса последней выполненной фоновой (асинхронной) команды.

0

Расширяется до имени оболочки или сценария оболочки. Это устанавливается при инициализации оболочки. Если bash вызывается с файлом команд, для $ 0 указывается имя этого файла. Если bash запускается с параметром -c , то для $ 0 указывается первый аргумент после строки, которая будет выполнена, если она есть , В противном случае ему присваивается имя файла, используемое для вызова bash , как указано в нулевом аргументе.

_

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

Переменные оболочки

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

BASH

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

BASH_VERSINFO

Доступная только для чтения переменная массива, члены которой содержат информацию о версии для этого экземпляра bash . Значения, назначенные членам массива, следующие:

BASH_VERSINFO [ 0]

Основной номер версии ( выпуск ).

BASH_VERSINFO [ 1]

Дополнительный номер версии ( версия ).

BASH_VERSINFO [ 2]

Уровень патча.

BASH_VERSINFO [ 3]

Версия сборки.

BASH_VERSINFO [ 4]

Статус выпуска (например, бета1 ).

BASH_VERSINFO [ 5]

Значение MACHTYPE .

BASH_VERSION

Расширяется до строки, описывающей версию этого экземпляра bash .

COMP_CWORD

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

COMP_LINE

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

COMP_POINT

Индекс текущей позиции курсора относительно начала текущей команды. Если текущая позиция курсора находится в конце текущей команды, значение этой переменной равно $ {# COMP_LINE} . Эта переменная доступна только в функциях оболочки и внешних командах, вызываемых программируемыми средствами завершения (см. Программируемое завершение ниже).

COMP_WORDS

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

DIRSTACK

Переменная массива (см. Arrays ниже), содержащая текущее содержимое стека каталогов. Каталоги появляются в стеке в том порядке, в котором они отображаются встроенной функцией dirs . Присвоение членам этой переменной массива может использоваться для изменения каталогов, уже находящихся в стеке, но встроенные функции pushd и popd должны использоваться для добавления и удаления каталогов. Присвоение этой переменной не изменит текущий каталог. Если DIRSTACK не установлено, оно теряет свои специальные свойства, даже если впоследствии оно сбрасывается.

EUID

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

имя_функции

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

ГРУППЫ

Переменная массива, содержащая список групп, членом которых является текущий пользователь. Назначения в ГРУППЫ не имеют никакого эффекта и возвращают статус ошибки. Если GROUPS не установлено, оно теряет свои специальные свойства, даже если впоследствии оно сбрасывается.

HISTCMD

Номер истории или индекс в списке истории текущей команды. Если HISTCMD не установлено, оно теряет свои специальные свойства, даже если впоследствии оно сбрасывается.

HOSTNAME

Автоматически устанавливается на имя текущего хоста.

HOSTTYPE

Автоматически устанавливается на строку, которая однозначно описывает тип компьютера, на котором выполняется bash . Значение по умолчанию зависит от системы.

LINENO

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

MACHTYPE

Автоматически устанавливается в строку, которая полностью описывает тип системы, в которой выполняется bash , в стандартном формате GNU cpu-company-system .Значение по умолчанию зависит от системы.

OLDPWD

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

OPTARG

Значение последнего аргумента опции, обработанного встроенной командой getopts (см. КОМАНДЫ СОСТАВЛЕНИЯ ОБОЛОЧКИ ниже).

OPTIND

Индекс следующего аргумента, который будет обработан встроенной командой getopts (см. КОМАНДЫ СОСТАВЛЕНИЯ ОБОЛОЧКИ ниже).

OSTYPE

Автоматически задается строка, описывающая операционную систему, в которой выполняется bash . Значение по умолчанию зависит от системы.

PIPESTATUS

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

PPID

Идентификатор процесса родителя оболочки. Эта переменная доступна только для чтения.

PWD

Текущий рабочий каталог, установленный командой cd .

RANDOM

Каждый раз, когда на этот параметр ссылаются, генерируется случайное целое число от 0 до 32767. Последовательность случайных чисел можно инициализировать, присвоив значение СЛУЧАЙНО . Если СЛУЧАЙНЫЙ не установлен, он теряет свои специальные свойства, даже если впоследствии он сбрасывается.

СЛОВО

Укажите строку ввода, прочитанную встроенной командой read , если аргументы не указаны.

СЕКУНД

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

SHELLOPTS

Разделенный двоеточиями список включенных параметров оболочки. Каждое слово в списке является допустимым аргументом для параметра -o встроенной команды set (см. СТРОИТЕЛЬНЫЕ КОМАНДЫ ОБОЛОЧКИ ниже). В SHELLOPTS отображаются параметры, которые в указаны set -o . Если эта переменная находится в среде, когда запускается bash , каждая опция оболочки в списке будет включена перед чтением любых файлов запуска. Эта переменная только для чтения.

SHLVL

Увеличивается на единицу каждый раз, когда запускается экземпляр bash .

UID

Расширяется до идентификатора текущего пользователя, инициализируется при запуске оболочки. Эта переменная доступна только для чтения.

Следующие переменные используются оболочкой. В некоторых случаях bash назначает значение по умолчанию для переменной; эти случаи отмечены ниже.

BASH_ENV

Если этот параметр установлен, когда bash выполняет сценарий оболочки, его значение интерпретируется как имя файла, содержащее команды для инициализации оболочки, как в ~/.bashrc . Значение BASH_ENV подвергается расширению параметров, подстановке команд и арифметическому расширению перед интерпретацией в качестве имени файла. PATH не используется для поиска результирующего имени файла.

CDPATH

Путь поиска для команды cd . Это список каталогов, разделенных двоеточиями, в котором оболочка ищет каталоги назначения, указанные командой cd . Пример значения “.: ~:/Usr”.

КОЛОННЫ

Используется встроенной командой select для определения ширины терминала при печати списков выбора. Автоматически устанавливается при получении SIGWINCH.

COMPREPLY

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

FCEDIT

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

FIGNORE

Список суффиксов, разделенных двоеточиями, которые следует игнорировать при выполнении дополнения имени файла (см. READLINE ниже). Имя файла, суффикс которого соответствует одной из записей в FIGNORE , исключается из списка совпадающих имен файлов. Пример значения “.o: ~”.

GLOBIGNORE

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

HISTCONTROL

Если установлено значение ignorespace , строки, начинающиеся с символа пробел , не добавляются в список истории. Если установлено значение ignoredups , строки, соответствующие последней строке истории, не вводятся. Значение ignoreboth объединяет две опции. Если не задано или установлено любое другое значение, кроме указанных выше, все строки, считываемые анализатором, сохраняются в списке истории при условии значения HISTIGNORE . Функция этой переменной заменена на HISTIGNORE . Вторая и последующие строки многострочной составной команды не тестируются и добавляются в историю независимо от значения HISTCONTROL .

HISTFILE

Имя файла, в котором сохраняется история команд (см. ИСТОРИЯ ниже). Значением по умолчанию является ~/.bash_history . Если не установлено, история команд не сохраняется при выходе из интерактивной оболочки.

HISTFILESIZE

Максимальное количество строк, содержащихся в файле истории. Когда этой переменной присваивается значение, файл истории усекается, если необходимо, чтобы он содержал не более этого количества строк. Значение по умолчанию – 500. Файл истории также усекается до этого размера после записи при выходе из интерактивной оболочки.

HISTIGNORE

Разделенный двоеточиями список шаблонов, используемых для определения того, какие командные строки следует сохранить в списке истории. Каждый шаблон привязывается в начале строки и должен соответствовать всей строке (не добавляется неявное « * »). Каждый шаблон проверяется на соответствие строке после применения проверок, указанных в HISTCONTROL . В дополнение к обычным символам, соответствующим шаблону оболочки, ` & ‘соответствует предыдущей строке истории. ` & ‘можно экранировать с помощью обратной косой черты; обратная косая черта удаляется перед попыткой совпадения. Вторая и последующие строки многострочной составной команды не тестируются и добавляются в историю независимо от значения HISTIGNORE .

HISTSIZE

Количество команд, которые нужно запомнить в истории команд (см. ИСТОРИЯ ниже). Значение по умолчанию составляет 500.

HOME

Домашний каталог текущего пользователя; аргумент по умолчанию для встроенной команды cd . Значение этой переменной также используется при выполнении расширения тильды.

HOSTFILE

Содержит имя файла в том же формате, что и /etc/hosts , которое следует прочитать, когда оболочке необходимо заполнить имя хоста. Список возможных дополнений имени хоста может быть изменен во время работы оболочки; При следующей попытке завершения имени хоста после изменения значения bash добавляет содержимое нового файла в существующий список. Если HOSTFILE установлен, но не имеет значения, bash пытается прочитать /etc/hosts , чтобы получить список возможных дополнений имени хоста. Когда HOSTFILE не установлен, список имен хостов очищается.

IFS

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

IGNOREEOF

Управляет действием интерактивной оболочки при получении символа EOF в качестве единственного входа. Если установлено, значение – это количество последовательных символов EOF , которые должны быть введены в качестве первых символов в строке ввода перед выходом bash . Если переменная существует, но не имеет числового значения или не имеет значения, значением по умолчанию является 10. Если она не существует, EOF означает конец ввода в оболочку.

INPUTRC

Имя файла для файла запуска readline , переопределяющего значение по умолчанию ~/.inputrc (см. READLINE ниже).

LANG

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

LC_ALL

Эта переменная переопределяет значение LANG и любой другой переменной LC _ , указывающей категорию локали.

LC_COLLATE

Эта переменная определяет порядок сопоставления, используемый при сортировке результатов раскрытия имени пути, и определяет поведение выражений диапазона, классов эквивалентности и последовательностей сопоставления в раскрытии имени пути и сопоставлении с образцом.

LC_CTYPE

Эта переменная определяет интерпретацию символов и поведение классов символов при расширении пути и сопоставлении с образцом.

LC_MESSAGES

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

LC_NUMERIC

Эта переменная определяет категорию локали, используемую для форматирования чисел.

ЛИНИЙ

Используется встроенной командой select для определения длины столбца для печати списков выбора. Автоматически устанавливается при получении SIGWINCH.

MAIL

Если для этого параметра задано имя файла, а переменная MAILPATH не задана, bash информирует пользователя о прибытии почты в указанный файл.

MAILCHECK

Указывает, как часто (в секундах) bash проверяет почту. По умолчанию это 60 секунд. Когда пришло время проверять почту, оболочка делает это перед отображением основного приглашения. Если эта переменная не установлена ​​или имеет значение, которое не является числом больше или равно нулю, оболочка отключает проверку почты.

MAILPATH

Разделенный двоеточиями список имен файлов для проверки на почту. Сообщение, которое должно быть напечатано при получении почты в определенном файле, может быть указано путем отделения имени файла от сообщения с помощью `? ‘. При использовании в тексте сообщения $ _ расширяется до имени текущего почтового файла. Пример:

MAILPATH = ‘/ var/mail/bfox? “У вас есть почта”: ~/shell-mail? “$ _ имеет почту!”‘

Bash предоставляет значение по умолчанию для этой переменной, но расположение используемых ею почтовых файлов пользователя зависит от системы (например,/var/mail/ $ USER ).

Opterr

Если задано значение 1, bash отображает сообщения об ошибках, сгенерированные встроенной командой getopts (см. Ниже КОМАНДЫ ОБЪЕКТА ОБЪЕКТОВ ). OPTERR устанавливается в 1 каждый раз, когда вызывается оболочка или выполняется сценарий оболочки.

PATH

Путь поиска команд. Это разделенный двоеточиями список каталогов, в которых оболочка ищет команды (см. ИСПОЛЬЗОВАНИЕ КОМАНДЫ ниже). Путь по умолчанию зависит от системы и устанавливается администратором, который устанавливает bash . Распространенным значением является “/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin :. ”.

POSIXLY_CORRECT

Если эта переменная находится в среде, когда запускается bash , оболочка переходит в режим posix перед чтением файлов запуска, как при вызове – posix вариант был предоставлен. Если он установлен во время работы оболочки, bash включает режим posix , как если бы команда set -o posix была выполнена.

PROMPT_COMMAND

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

PS1

Значение этого параметра раскрывается (см. PROMPTING ниже) и используется в качестве основной строки приглашения. Значением по умолчанию является “ \ s- \ v \ $ ”.

PS2

Значение этого параметра раскрывается, как в PS1 , и используется в качестве вспомогательной строки приглашения. По умолчанию установлено значение “ > ”.

PS3

Значение этого параметра используется в качестве подсказки для команды select (см. ГРАММАТА ОБОЛОЧКИ выше).

PS4

Значение этого параметра расширяется, как в случае PS1 , и значение печатается перед тем, как каждая команда bash отображается во время трассировки выполнения. Первый символ PS4 повторяется несколько раз, если это необходимо, чтобы указать несколько уровней косвенности. По умолчанию установлено значение “ + ”.

TIMEFORMAT

Значение этого параметра используется как строка формата, определяющая, как должна отображаться информация о синхронизации для конвейеров с префиксом time . Символ % вводит escape-последовательность, которая расширяется до значения времени или другой информации. Escape-последовательности и их значения следующие; фигурные скобки обозначают необязательные части.

%%

Литерал % .

% [ <ет> р ] [л] Р

Истекшее время в секундах.

% [ <ет> р ] [л] U

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

% [ <ет> р ] [л] S

Количество секунд работы процессора в системном режиме.

% p

Процент CPU, рассчитанный как (% U +% S) /% R.

Необязательный p – это цифра, указывающая точность , число дробных цифр после десятичной точки. Значение 0 не приводит к выводу десятичной точки или дроби. Можно указать не более трех знаков после запятой; значения p больше 3 изменяются на 3. Если p не указано, используется значение 3.

Необязательный l указывает более длинный формат, включая минуты, в формате MM m SS . FF s. Значение p определяет, включена ли дробь.

Если эта переменная не задана, bash действует так, как если бы он имел значение $ ‘\ nreal \ t% 3lR \ nuser \ t% 3lU \ nsys% 3lS’ . Если значение равно нулю, информация о времени не отображается. Конечный символ новой строки добавляется при отображении строки формата.

TMOUT

Если задано значение больше нуля, TMOUT считается тайм-аутом по умолчанию для встроенного чтения . Команда select прекращается, если ввод не поступает через TMOUT секунд, когда ввод поступает с терминала. В интерактивной оболочке значение интерпретируется как количество секунд ожидания ввода после выдачи основного приглашения. Bash завершается после ожидания в течение указанного количества секунд, если вход не поступает.

auto_resume

Эта переменная контролирует взаимодействие оболочки с пользователем и управлением заданиями. Если эта переменная задана, простые команды, состоящие из одного слова, без перенаправлений считаются кандидатами на возобновление существующего остановленного задания. Не допускается двусмысленность; если есть несколько заданий, начинающихся с введенной строки, выбирается задание, к которому последний раз обращались. В этом контексте name остановленного задания – это командная строка, используемая для его запуска. Если установлено значение точный , предоставленная строка должна точно соответствовать имени остановленного задания; если установлено значение substring , предоставленная строка должна соответствовать подстроке имени остановленного задания. Значение substring обеспечивает функциональность, аналогичную идентификатору задания %? (см. УПРАВЛЕНИЕ ЗАДАНИЯМИ ниже). Если установлено любое другое значение, предоставленная строка должна быть префиксом имени остановленного задания; это обеспечивает функциональность, аналогичную идентификатору задания % .

histchars

Два или три символа, управляющие расширением и токенизацией истории (см. РАСШИРЕНИЕ ИСТОРИИ ниже). Первый символ – это расширение истории , символ, который сигнализирует о начале расширения истории, обычно это ! . Вторым символом является символ быстрой замены , который используется в качестве сокращения для повторного выполнения предыдущей введенной команды, заменяя одну строку другой в команде. По умолчанию установлено значение ^ . Необязательный третий символ – это символ, который указывает, что оставшаяся часть строки является комментарием, когда он находится в качестве первого символа слова, обычно ` # ‘. Символ комментария к истории заставляет пропустить подстановку истории для оставшихся слов в строке. Это не обязательно заставляет анализатор оболочки обрабатывать оставшуюся часть строки как комментарий.

Массивы

Bash предоставляет переменные одномерного массива. Любая переменная может использоваться как массив; встроенная функция Declare будет явно объявить массив. Не существует максимального ограничения на размер массива и каких-либо требований, чтобы члены были проиндексированы или назначены непрерывно. Массивы индексируются с использованием целых чисел и начинаются с нуля.

Массив создается автоматически, если любая переменная назначается с использованием синтаксиса name [ subscript ] = value . subscript обрабатывается как арифметическое выражение, которое должно иметь значение, большее или равное нулю. Чтобы явно объявить массив, используйте Declare -a name (см. ВСТРОЕННЫЕ КОМАНДЫ SHELL ниже). объявить -a имя [ нижний индекс ] также принято; нижний индекс игнорируется. Атрибуты могут быть указаны для переменной массива с помощью встроенных функций Declare и readonly . Каждый атрибут применяется ко всем членам массива.

Массивы назначаются для использования составных назначений в форме имя = ( значение 1 … значение n ) , где каждое значение имеет форму [ subscript ] = string . Требуется только строка . Если поставляются необязательные скобки и нижний индекс, этому индексу присваивается; в противном случае индекс назначенного элемента является последним индексом, назначенным оператором, плюс один. Индексирование начинается с нуля. Этот синтаксис также принимается встроенной функцией Declare .Для отдельных элементов массива можно использовать синтаксис name [ subscript ] = value , представленный выше.

На любой элемент массива можно ссылаться, используя $ { name [ subscript ]}. Скобки необходимы, чтобы избежать конфликтов с расширением пути. Если индекс равен @ или * , слово распространяется на всех членов name . Эти индексы отличаются только тогда, когда слово появляется в двойных кавычках. Если слово заключено в двойные кавычки, $ { name [*]} раскрывается в одно слово, в котором значение каждого члена массива отделяется первым символом специального IFS . переменная, а $ { name [@]} раскрывает каждый элемент name в отдельное слово. Когда нет элементов массива, $ { name [@]} расширяется до нуля. Это аналогично расширению специальных параметров * и @ (см. Специальные параметры выше). $ {# name [ subscript ]} расширяется до длины $ { name [ subscript ]}. Если subscript равен * или @ , расширение – это количество элементов в массиве. Ссылка на переменную массива без нижнего индекса эквивалентна ссылке на нулевой элемент.

Встроенная функция unset используется для уничтожения массивов. unset name [ subscript ] уничтожает элемент массива по индексу subscript . unset name , где name – массив, или unset name [ subscript ], где subscript равен * или @ , удаляет весь массив.

Встроенные функции Declare , local и readonly принимают опцию -a для указания массива. Встроенная функция read принимает параметр -a для назначения списка слов, прочитанных из стандартного ввода, в массив. Встроенные функции set и декларируют отображают значения массива таким образом, чтобы их можно было использовать в качестве назначений.

РАСШИРЕНИЕ

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

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

В системах, которые могут его поддерживать, доступно дополнительное расширение: замена процесса .

Только расширение фигурных скобок, разбиение слов и расширение имени пути могут изменить количество слов расширения; другие расширения расширяют одно слово в одно слово. Единственными исключениями являются расширения $ @ и $ { name [@]} . «как описано выше (см. ПАРАМЕТРЫ ).

Расширение скобок

Расширение скобок – это механизм, с помощью которого можно генерировать произвольные строки. Этот механизм похож на расширение пути , но генерируемые имена файлов не должны существовать. Шаблоны, которые должны быть развернуты в фигурные скобки, принимают форму необязательной преамбулы , за которой следует последовательность разделенных запятыми строк между двумя фигурными скобками, а затем необязательный postscript . Преамбула имеет префикс к каждой строке, содержащейся в фигурных скобках, а затем к каждой результирующей строке добавляется постскриптум, расширяющийся слева направо.

Расширение скобок может быть вложенным. Результаты каждой расширенной строки не сортируются; порядок слева направо сохраняется. Например, { d, c, b } e расширяется до «ade ace abe».

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

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

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

mkdir/usr/local/src/bash/{старый, новый, dist, ошибки}

или же

chown root/usr/{ucb/{ex, edit}, lib/{ex?.?*, How_ex}}

Расширение скобок вносит небольшую несовместимость с историческими версиями sh . sh не обрабатывает открывающие или закрывающие скобки, особенно когда они появляются как часть слова, и сохраняет их в выводе. Bash удаляет фигурные скобки из слов в результате расширения фигурных скобок. Например, слово, введенное в sh как файл {1,2} , идентично отображается в выходных данных. То же слово выводится как file1 file2 после расширения bash . Если требуется строгая совместимость с sh , запустите bash с параметром + B или отключите расширение скобок с помощью + B Параметр команды set (см. КОМАНДЫ ОБЪЕКТА ОБЪЕКТА ОБЪЕКТА ниже).

Расширение Тильды

Если слово начинается с символа тильды без кавычек (` ~ ‘), все символы, предшествующие первой косой черте без кавычек (или все символы, если косой черты без кавычек нет), считаются тильдой -prefix . Если ни один из символов в префиксе тильды не указан в кавычках, символы в префиксе тильды, следующие за тильдой, рассматриваются как возможное имя для входа . Если это имя для входа является пустой строкой, тильда заменяется значением параметра оболочки HOME . Если HOME не задано, вместо него подставляется домашний каталог пользователя, выполняющего оболочку. В противном случае префикс тильды заменяется домашним каталогом, связанным с указанным именем входа.

Если префикс тильды равен «~ +», значение переменной оболочки PWD заменяет префикс тильды. Если префикс тильды является `~ – ‘, значение переменной оболочки OLDPWD , если оно установлено, подставляется. Если символы, следующие за тильдой в префиксе тильды, состоят из числа N , необязательно с префиксом `+ ‘или` -‘, префикс тильды заменяется соответствующим элементом из каталога stack, как это будет отображаться встроенной функцией dirs , вызываемой с префиксом tilde в качестве аргумента. Если символы, следующие за тильдой в префиксе тильды, состоят из числа без начального `+ ‘или` -‘, предполагается `+ ‘.

Если логин неверен или расширение тильды завершается неудачно, слово не изменяется.

Каждое присвоение переменной проверяется на наличие префиксов тильды без кавычек сразу после : или = . В этих случаях также выполняется расширение тильды. Следовательно, можно использовать имена файлов с тильдами в присваиваниях PATH , MAILPATH и CDPATH , а оболочка назначает расширенное значение.

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

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

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

$ { параметр }

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

Если первый символ параметра является восклицательным знаком, вводится уровень косвенной косвенности. Bash использует значение переменной, сформированной из остальной части параметра , в качестве имени переменной; эта переменная затем раскрывается, и это значение используется в остальной части замещения, а не в значении самого параметра . Это известно как косвенное расширение . Исключением является расширение $ {! префикс *}, описанное ниже.

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

$ { параметр : – слово }

Использовать значения по умолчанию . Если параметр не установлен или равен нулю, расширение word заменяется. В противном случае значение параметра подставляется.

$ { параметр : = слово }

Назначить значения по умолчанию . Если параметр не задан или равен нулю, расширение word назначается параметру .Значение параметра затем подставляется. Позиционные параметры и специальные параметры не могут быть назначены таким образом.

$ { параметр : слово }

Показать ошибку, если установлено значение «Ноль» или «Не установлено» . Если параметр равен нулю или не установлен, расширение word (или сообщение об этом, если word отсутствует) записывается в стандарт Ошибка и оболочка, если она не является интерактивной, завершается. В противном случае значение параметра подставляется.

$ { параметр + слово }

Используйте альтернативное значение . Если параметр равен нулю или не задан, ничего не подставляется, в противном случае подставляется расширение слова .

$ { параметр смещение }

$ { Параметр : смещение : Длина }

Расширение подстроки. Расширяется до длины символов параметра , начиная с символа, указанного в offset . Если длина опущена, расширяется до подстроки параметра , начиная с символа, указанного в смещении . length и offset являются арифметическими выражениями (см. АРИФМЕТИЧЕСКАЯ ОЦЕНКА ниже). length должен иметь значение, большее или равное нулю. Если смещение оценивается как число меньше нуля, значение используется как смещение от конца значения параметра . Если параметр равен @ , результатом будет длина позиционных параметров, начинающихся со значения смещения . Если параметр является именем массива, индексированным с помощью @ или *, то результатом будут элементы длины массива, начинающиеся с $ { параметра [ смещение ]}. Индексирование подстроки начинается с нуля, если только не используются позиционные параметры, и в этом случае индексация начинается с 1.

$ { префикс * }

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

$ { # параметр }

Длина в символах значения параметра подставляется. Если параметр равен * или @ , подставляемое значение является числом позиционных параметров. Если параметр – это имя массива, подписанное * или @ , подставляемое значение – это количество элементов в массиве.

$ { параметр # слово }

$ { параметр <эм /> ## <сильный /> слово }

word раскрывается для создания шаблона так же, как в раскрытии пути. Если шаблон соответствует началу значения параметра , то результатом расширения является расширенное значение параметра с кратчайшим подходящим шаблоном (“ # ”) или самый длинный соответствующий шаблон (“ ## ”) удален. Если параметр равен @ или * , операция удаления шаблона применяется по очереди к каждому позиционному параметру, и расширение является результирующим списком. Если параметр является переменной массива, подписанной @ или * , операция удаления шаблона применяется к каждому члену массива по очереди, и расширение является результирующим списком.

$ { параметр <эм /> % <сильный /> слово }

$ { параметр <эм /> %% <сильный /> слово }

word раскрывается для создания шаблона так же, как в раскрытии пути. Если шаблон соответствует завершающей части расширенного значения параметра , то результатом расширения является расширенное значение параметра с кратчайшим подходящим шаблоном (“ < регистр strong>% ‘) или самый длинный соответствующий шаблон (случай “ %% ‘ ‘) удален. Если параметр равен @ или * , операция удаления шаблона применяется по очереди к каждому позиционному параметру, и расширение является результирующим списком. Если параметр является переменной массива, подписанной @ или * , операция удаления шаблона применяется к каждому члену массива по очереди, и расширение является результирующим списком.

$ { параметр / шаблон / строка }

$ { параметр // шаблон / строка }

pattern раскрывается, чтобы создать шаблон так же, как в раскрытии пути. Параметр раскрывается, и самое длинное соответствие pattern его значению заменяется на строку . В первой форме заменяется только первый матч.Вторая форма вызывает замену всех совпадений pattern на string . Если шаблон начинается с # , он должен совпадать с началом расширенного значения параметра . Если шаблон начинается с % , он должен совпадать в конце расширенного значения параметра . Если строка равна нулю, совпадения с шаблоном удаляются, а /, следующий за шаблоном , можно не указывать. Если параметр равен @ или * , операция замещения применяется к каждому позиционному параметру по очереди, и расширение является результирующим списком. Если параметр является переменной массива, подписанной @ или * , операция замещения применяется к каждому члену массива по очереди, и расширение является результирующим списком.

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

Подстановка команд позволяет выводу команды заменить имя команды. Есть две формы:

$ ( команда )

или же

` команда `

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

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

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

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

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

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

$ (( выражение ))

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

Оценка выполняется в соответствии с правилами, перечисленными ниже в разделе ARITHMETIC ОЦЕНКА . Если выражение недопустимо, bash печатает сообщение о сбое и замене не происходит.

Процесс замены

Замена процесса поддерживается в системах, которые поддерживают именованные каналы ( FIFOs ) или метод /dev/fd именования открытых файлов. Он принимает форму <( список ) или > ( список ) . Процесс list запускается с его входом или выходом, подключенным к FIFO или некоторому файлу в /dev/fd . Имя этого файла передается в качестве аргумента текущей команде в результате расширения. Если используется форма > ( list ) , запись в файл обеспечит ввод для списка . Если используется форма <( list ) , файл, переданный в качестве аргумента, следует прочитать, чтобы получить выходные данные списка .

Когда доступно, подстановка процесса выполняется одновременно с расширением параметров и переменных, подстановкой команд и арифметическим расширением.

Расщепление слов

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

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

Явные нулевые аргументы ( “” или ) сохраняются. Не приведенные в кавычки неявные нулевые аргументы, являющиеся результатом расширения параметров, которые не имеют значений, удаляются. Если параметр без значения раскрывается в двойных кавычках, нулевой аргумент получается и сохраняется.

Обратите внимание, что если расширение не происходит, разбиение не выполняется.

Расширение пути

После разделения слов, если не был установлен параметр -f , bash сканирует каждое слово на наличие символов * , ? и [. Если появляется один из этих символов, то слово рассматривается как pattern и заменяется отсортированным по алфавиту списком имен файлов, соответствующих шаблону. Если не найдено подходящих имен файлов, а параметр оболочки nullglob отключен, слово остается без изменений. Если установлена ​​опция nullglob и совпадений не найдено, слово удаляется. Если включен параметр оболочки nocaseglob , сопоставление выполняется без учета буквенных символов. Если для раскрытия пути используется шаблон, символ “. ” в начале имени или сразу после косой черты должен явно совпадать, если только параметр оболочки dotglob Установлено. При сопоставлении имени пути символ косой черты всегда должен совпадать явно. В других случаях символ “. ” специально не обрабатывается. См. Описание shopt ниже в разделе СТРОИТЕЛЬНЫЕ КОМАНДЫ SHELL , где описаны nocaseglob , nullglob и > параметры оболочки dotglob .

Переменная оболочки GLOBIGNORE может использоваться для ограничения набора имен файлов, соответствующих шаблону . Если установлено GLOBIGNORE , каждое соответствующее имя файла, которое также соответствует одному из шаблонов в GLOBIGNORE , удаляется из списка совпадений. Имена файлов “. ” и “ .. ” всегда игнорируются, даже если установлено GLOBIGNORE . Однако настройка GLOBIGNORE позволяет включить параметр оболочки dotglob , поэтому все другие имена файлов, начинающиеся с “. ” , будут совпадать. , Чтобы получить прежнее поведение игнорирования имен файлов, начинающихся с “. ” , сделайте “. * ” одним из шаблонов в GLOBIGNORE . Параметр dotglob отключен, если GLOBIGNORE не установлен.

Сопоставление с образцом

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

Символы специального шаблона имеют следующие значения:

*

Соответствует любой строке, включая пустую строку.

Соответствует любому отдельному символу.

[…]

Соответствует любому из вложенных символов. Пара символов, разделенных дефисом, обозначает выражение диапазона ; любой символ, который сортируется между этими двумя символами, включительно, с использованием последовательности сопоставления текущей локали и набора символов, сопоставляется. Если первый символ, следующий за [, является ! или ^ , то любой символ, не заключенный в него, будет сопоставлен. Порядок сортировки символов в выражениях диапазона определяется текущей локалью и значением переменной оболочки LC_COLLATE , если она установлена. можно сопоставить, включив его в качестве первого или последнего символа в наборе. ] можно сопоставить, включив его в качестве первого символа в наборе.

В [ и ] можно указать классы символов с помощью синтаксиса [: class :] , где class – это один из следующих классов, определенных в стандарте POSIX.2:

alnum alpha ascii blank cntrl цифра нижняя печать пробел пробел верхнее слово xdigit
Класс символов соответствует любому символу, принадлежащему этому классу. Класс символов word соответствует буквам, цифрам и символу _.

В [ и ] класс эквивалентности может быть указан с использованием синтаксиса [= c =] , который соответствует всем символам с таким же весом сортировки (как определено в текущей локали), что и символ c .

Внутри [ и ] синтаксис [. символ .] соответствует сортировке символ символ .

Если параметр оболочки extglob включен с помощью встроенной функции shopt , распознаются несколько расширенных операторов сопоставления с образцом. В следующем описании pattern-list представляет собой список из одного или нескольких шаблонов, разделенных | . Составные шаблоны могут быть сформированы с использованием одного или нескольких из следующих подшаблонов:

? ( шаблон-лист )

Соответствует нулю или одному вхождению данных паттернов

* ( шаблон-лист )

Соответствует нулю или более вхождений данных шаблонов

+ ( шаблон-лист )

Соответствует одному или нескольким вхождениям данных шаблонов

@ ( шаблон-лист )

Точно соответствует одному из заданных шаблонов

! ( шаблон-лист )

Совпадает с чем угодно, кроме одного из заданных шаблонов

Удаление цитаты

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

Переквалификация

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

В следующих описаниях, если номер дескриптора файла опущен, а первый символ оператора перенаправления – <, перенаправление относится к стандартному вводу (дескриптор файла 0). Если первым символом оператора перенаправления является > , перенаправление ссылается на стандартный вывод (дескриптор файла 1).

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

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

ls > dirlist 2 > & 1

направляет как стандартный вывод, так и стандартную ошибку в файл dirlist , а команда

ls 2 > & 1 > dirlist

направляет только стандартный вывод в файл dirlist , поскольку стандартная ошибка была продублирована как стандартный вывод до того, как стандартный вывод был перенаправлен на dirlist .

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

/DEV/FD/ FD

Если fd является допустимым целым числом, дескриптор файла fd дублируется.

/DEV/STDIN

Файловый дескриптор 0 дублирован.

/DEV/STDOUT

Файловый дескриптор 1 дублируется.

/DEV/STDERR

Файловый дескриптор 2 дублирован.

/DEV/TCP/ хоста / Порт

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

/DEV/UDP/ хоста / Порт

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

Ошибка открытия или создания файла приводит к сбою перенаправления.

Перенаправление ввода

Перенаправление ввода вызывает открытие файла, имя которого является результатом расширения word , для чтения по дескриптору файла n или стандартного ввода (дескриптор файла 0), если n не указано.

Общий формат для перенаправления ввода:

[<Ет> п ] < слово

Перенаправление вывода

Перенаправление вывода приводит к открытию файла, имя которого является результатом расширения word , для записи в файловый дескриптор n или в стандартный вывод (дескриптор файла 1), если n не указано. Если файл не существует, он создается; если он существует, он усекается до нулевого размера.

Общий формат для перенаправления вывода:

[<Ет> п ] <сильный >> слово

Если оператор перенаправления имеет значение > , а опция noclobber встроенной функции set включена, перенаправление завершится неудачно, если файл, имя которого будет получено из раскрытия word существует и представляет собой обычный файл. Если оператор перенаправления > | или оператор перенаправления > и параметр noclobber встроен в set Команда не включена, попытка перенаправления выполняется, даже если существует файл с именем word .

Добавление перенаправленного вывода

Перенаправление вывода таким способом вызывает открытие файла, имя которого является результатом расширения word , для добавления в дескриптор файла n или в стандартный вывод (дескриптор файла 1) если n не указано. Если файл не существует, он создается.

Общий формат добавления вывода:

[ п ] <сильный >>> слово

Перенаправление стандартного вывода и стандартной ошибки

Bash позволяет перенаправлять как стандартный вывод (дескриптор файла 1), так и стандартный вывод ошибок (дескриптор файла 2) в файл, имя которого является расширением word с помощью этого построить.

Существует два формата для перенаправления стандартного вывода и стандартной ошибки:

&> слово

а также

<Сильный >> & слово

Из двух форм первая является предпочтительной. Это семантически эквивалентно

<Сильный >> слово 2 <сильный >> & 1

Здесь документы

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

Формат документов здесь:

  << [ - ]  wordhere-document  
разделитель

Для параметра word не выполняется расширение параметров, подстановка команд, арифметическое расширение или расширение имени пути. Если какие-либо символы в word заключены в кавычки, разделитель является результатом удаления кавычек в word , а строки в здесь-документе не являются расширен. Если word не заключено в кавычки, все строки здесь-документа подвергаются расширению параметров, подстановке команд и арифметическому расширению. В последнем случае последовательность символов \ игнорируется, и \ необходимо использовать для цитирования символов \ , $ и `.

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

Здесь Строки

Вариант здесь документов, формат:

  <<<  word  

word раскрывается и передается команде на стандартный ввод.

Дублирование файловых дескрипторов

Оператор перенаправления

[<Ет> п ] <& слово/

используется для дублирования дескрипторов входных файлов. Если word раскрывается до одной или нескольких цифр, дескриптор файла, обозначенный n , считается копией этого дескриптора файла. Если цифры в слове не указывают дескриптор файла, открытый для ввода, возникает ошибка перенаправления. Если значение word равно , дескриптор файла n закрывается. Если n не указано, используется стандартный ввод (дескриптор файла 0).

Оператор

[<Ет> п ] <сильный >> & слово

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

Перемещение дескрипторов файлов

Оператор перенаправления

[<Ет> п ] <& цифра

перемещает дескриптор файла цифра в дескриптор файла n или стандартный ввод (дескриптор файла 0), если n не указан. цифра закрывается после дублирования до n .

Аналогично, оператор перенаправления

[<Ет> п ] <сильный >> & цифра

перемещает дескриптор файла цифра в дескриптор файла n или стандартный вывод (дескриптор файла 1), если n не указан.

Открытие файловых дескрипторов для чтения и записи

Оператор перенаправления

[ п ] слово

вызывает открытие файла с именем word для чтения и записи в дескрипторе файла n или в дескрипторе файла 0, если n Не указано. Если файл не существует, он создается.

Псевдонимы

Псевдонимы позволяют заменить слово на строку, когда оно используется в качестве первого слова простой команды. Оболочка поддерживает список псевдонимов, которые можно устанавливать и отменять с помощью встроенных команд псевдоним и unalias (см. Ниже КОМАНДЫ СОСТАВЛЕНИЯ ОБЪЕКТОВ ). Первое слово каждой команды, если оно не заключено в кавычки, проверяется на наличие псевдонима. Если это так, это слово заменяется текстом псевдонима. Имя псевдонима и текст замены могут содержать любые допустимые входные данные оболочки, включая перечисленные выше метасимволы , за исключением того, что имя псевдонима может не содержать = . Первое слово замещающего текста проверяется на псевдонимы, но слово, идентичное расширяемому псевдониму, не раскрывается во второй раз. Это означает, что, например, можно создать псевдоним ls для ls -F , а bash не пытается рекурсивно развернуть текст замены. Если последний символ значения псевдонима является пустым , то следующее слово команды после псевдонима также проверяется на расширение псевдонима.

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

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

Псевдонимы не раскрываются, если оболочка не является интерактивной, если параметр оболочки expand_aliases не установлен с помощью shopt (см. Описание shopt в разделе > КОМАНДЫ, ПОСТРОЕННЫЕ ОБОЛОЧКАМИ ниже).

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

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

функции

Функция оболочки, определенная как описано выше в разделе SHELL GRAMMAR , , хранит серию команд для последующего выполнения. Когда имя функции оболочки используется в качестве простого имени команды, выполняется список команд, связанных с этим именем функции. Функции выполняются в контексте текущей оболочки; не создается новый процесс для их интерпретации (в отличие от выполнения сценария оболочки). Когда функция выполняется, аргументы функции становятся позиционными параметрами во время ее выполнения. Специальный параметр # обновляется с учетом изменений. Позиционный параметр 0 не изменяется. Переменная FUNCNAME установлена ​​на имя функции во время ее выполнения. Все остальные аспекты среды выполнения оболочки идентичны для функции и ее вызывающей стороны за исключением того, что ловушка DEBUG (см. Описание встроенной функции ловушки в разделе SHELL ВСТРОЕННЫЕ КОМАНДЫ ниже) не наследуется, если функции не присвоен атрибут trace (см. Описание встроенной функции Declare ниже).

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

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

Имена и определения функций могут быть перечислены с помощью опции -f встроенных команд Declare или typeset . Опция -F для объявления или набора типов перечисляет только имена функций. Функции могут быть экспортированы, так что для подоболочек они автоматически определяются с помощью опции -f встроенной функции экспорта .

Функции могут быть рекурсивными. Количество рекурсивных вызовов не ограничено.

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

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

идентификатор ++ идентификатор

переменная после увеличения и после уменьшения

++ идентификатор идентификатор

переменное предварительное увеличение и предварительное уменьшение

– +

унарный минус и плюс

! ~

логическое и побитовое отрицание

**

экспоненцирование

* /%

умножение, деление, остаток

+ –

сложение, вычитание

<>

сдвиги влево и вправо

=

сравнение

==! =

равенство и неравенство

&

побитовое И

^

побитовое исключающее ИЛИ

|

побитовое ИЛИ

&&

логическое И

||

логическое ИЛИ

выражение выражение : выражение

условная оценка

= * =/=% = + = – = <> = & = ^ = | =

назначение

выражение1 expr2

запятая

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

Константы с ведущим 0 интерпретируются как восьмеричные числа. Ведущий 0x или 0X обозначает шестнадцатеричное. В противном случае числа принимают форму [ base # ] n, где base – десятичное число от 2 до 64, представляющее арифметическую базу, и n это число в этой базе. Если base # опущено, используется base 10. Цифры больше 9 представлены строчными буквами, заглавными буквами @ и _ в указанном порядке. Если base меньше или равно 36, строчные и заглавные буквы могут использоваться взаимозаменяемо для представления чисел от 10 до 35.

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

Условные выражения

Условные выражения используются составной командой [[ и встроенными командами test и [) для проверки атрибутов файла и выполнения сравнения строк и арифметики. Выражения формируются из следующих одинарных или двоичных основных цветов. Если какой-либо аргумент file одного из основных цветов имеет форму /dev/fd/n , то проверяется дескриптор файла n . Если аргумент file для одного из основных цветов является одним из /dev/stdin , /dev/stdout или /dev/stderr , дескриптор файла 0, 1 или 2, соответственно, проверяется.

-a файл

Истинно, если файл существует.

-b файл

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

-c файл

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

-d файл

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

-e файл

Истинно, если файл существует.

-f файл

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

-g файл

Истинно, если файл существует и является set-group-id.

-h файл

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

-k файл

Истинно, если файл существует и его бит “ sticky ” установлен.

-p файл

Истинно, если файл существует и является именованным каналом (FIFO).

-r файл

Истинно, если файл существует и доступен для чтения.

-s файл

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

-t FD

True, если дескриптор файла fd открыт и ссылается на терминал.

-u файл

Истинно, если файл существует и установлен его бит set-user-id.

-w файл

Истинно, если файл существует и доступен для записи.

-x файл

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

-O файл

Истинно, если файл существует и принадлежит эффективному идентификатору пользователя.

-G файл

Истинно, если файл существует и принадлежит эффективному идентификатору группы.

-L файл

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

-S файл

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

-N файл

Истинно, если файл существует и был изменен с момента последнего чтения.

file1 нт file2

Истинно, если file1 новее (в соответствии с датой изменения), чем file2 , или если file1 существует, а file2 – нет.

file1 а file2

Истинно, если file1 старше, чем file2 , или если file2 существует, а file1 – нет.

file1 -ef file2

Истинно, если file1 и file2 ссылаются на одно и то же устройство и номера инодов.

-o optname

Истинно, если включена опция оболочки optname . См. Список параметров под описанием параметра -o встроенного элемента set ниже.

-z строка

Истинно, если длина строки равна нулю.

-n строка

строка

Истинно, если длина строки не равна нулю.

string1 == строка2

Истинно, если строки равны. = может использоваться вместо == для строгого соответствия POSIX.

string1 ! = строка2

Истинно, если строки не равны.

string1 < строка2

Истинно, если string1 сортируется перед string2 лексикографически в текущей локали.

string1 > строка2

True, если string1 сортируется после string2 лексикографически в текущей локали.

arg1 OP арг2

OP – это один из -eq , -ne , -lt , -le . , -gt или -ge . Эти арифметические бинарные операторы возвращают true, если arg1 равно, не равно, меньше, меньше или равно, больше или больше или равно arg2 , соответственно. Arg1 и arg2 могут быть положительными или отрицательными целыми числами.

Простое расширение команд

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

1.

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

2.

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

3.

Перенаправления выполняются, как описано выше в разделе НАПРАВЛЕНИЕ .

4.

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

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

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

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

Выполнение команды

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

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

Если имя не является ни функцией оболочки, ни встроенной функцией и не содержит косых черт, bash ищет в каждом элементе PATH каталог, содержащий исполняемый файл с этим именем. Bash использует хеш-таблицу для запоминания полных путей к исполняемым файлам (см. хэш в разделе КОМАНДЫ ОБЪЕДИНЕНИЯ ОБОЛОЧКИ ниже). Полный поиск по каталогам в PATH выполняется только в том случае, если команда не найдена в хэш-таблице. Если поиск не выполнен, оболочка печатает сообщение об ошибке и возвращает состояние выхода 127.

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

Если это выполнение не выполнено из-за того, что файл не в исполняемом формате и файл не является каталогом, предполагается, что это сценарий оболочки , файл, содержащий команды оболочки. Для его запуска создается подоболочка. Эта подоболочка переинициализирует себя так, что эффект выглядит так, как будто для обработки сценария была вызвана новая оболочка, за исключением расположения команд, запоминаемых родителем (см. хэш ниже в разделе СТРОИТЕЛЬНЫЕ КОМАНДЫ ОБОЛОЧКИ ) сохраняются за ребенком.

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

Среда выполнения команд

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

*

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

*

текущий рабочий каталог, установленный cd , pushd или popd , или унаследованный оболочкой при вызове

*

маска режима создания файла, установленная umask или унаследованная от родителя оболочки

*

текущие ловушки, установленные ловушкой

*

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

*

функции оболочки, определенные во время выполнения или унаследованные от родителя оболочки в среде

*

параметры включаются при вызове (по умолчанию или с аргументами командной строки) или с помощью set

*

параметры, включенные shopt

*

псевдонимы оболочки, определенные с помощью псевдонима

*

различные идентификаторы процессов, включая фоновые задания, значение $$ и значение $ PPID .

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

*

открытые файлы оболочки, а также любые изменения и дополнения, указанные в перенаправлениях в команду

*

текущий рабочий каталог

*

маска режима создания файла

*

Переменные оболочки, помеченные для экспорта, вместе с переменными, экспортированными для команды, переданной в среде

*

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

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

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

Если за командой следует & , а управление заданиями не активно, стандартным вводом команды по умолчанию является пустой файл /dev/null . В противном случае вызываемая команда наследует файловые дескрипторы вызывающей оболочки, измененные перенаправлениями.

Источник

Справочное руководство Bash , Брайан Фокс и Чет Рами

Библиотека чтения строк Gnu , Брайан Фокс и Чет Рами

Библиотека истории Гну , Брайан Фокс и Чет Рами

Интерфейс переносимой операционной системы (POSIX). Часть 2. Оболочка и утилиты , IEEE

ш (1), <ет> КШ (1), <ет> CSH (1)

Emacs (1), <ет> VI (1)

Readline (3)

Оцените статью
Solutics.ru
Добавить комментарий