Понимание командной строки Linux/Unix

Содержание
  1. Все, что вам нужно знать о Bash, а затем о некоторых
  2. Варианты Bash
  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, а затем о некоторых

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

Варианты Bash

В дополнение к односимвольным параметрам оболочки, описанным в описании встроенной команды 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 , выходные данные отображаются в формате, который можно повторно использовать в качестве входного.
  • : A сигнализирует об окончании действия параметров и отключает дальнейшую обработку параметров. Любые аргументы после обрабатываются как имена файлов и аргументы. Аргумент эквивалентен .

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

  • – dump-po-strings : эквивалентно -D , но выходные данные находятся в GNU gettext po (переносимый объект) формат файла.
  • – dump-strings : эквивалентно -D .
  • – help . Отобразите сообщение об использовании в стандартном выводе и успешно завершите работу.
  • – файл инициализации : файл и – файл rcfile файл : выполнение команд из файла вместо стандартного личного файла инициализации ~/.bashrc , если оболочка является интерактивной.
  • – войти : эквивалентно -l .
  • – noediting : не используйте библиотеку GNU readline для чтения командных строк, когда оболочка является интерактивной.
  • – noprofile . Не читайте общесистемный загрузочный файл /etc/profile или какие-либо личные файлы инициализации ~/.bash_profile , ~/.bash_login или ~/.profile . По умолчанию bash читает эти файлы, когда он вызывается как оболочка входа.
  • – norc : не читайте и не выполняйте файл личной инициализации ~/.bashrc , если оболочка является интерактивной. Эта опция включена по умолчанию, если оболочка вызывается как sh .
  • – posix : измените поведение bash , если операция по умолчанию отличается от стандарта POSIX, чтобы соответствовать стандарту ( режим posix ).
  • – ограничен : оболочка становится ограниченной.
  • – rpm-require : . Создает список файлов, необходимых для запуска сценария оболочки. Это подразумевает ‘-n’ и подчиняется тем же ограничениям, что и проверка на ошибки времени компиляции; Backticks, [] тесты и evals не анализируются, поэтому некоторые зависимости могут быть пропущены.
  • – подробный : эквивалентен -v .
  • – версия : . Выведите информацию о версии для этого экземпляра bash в стандартный вывод и успешно завершите работу.

аргументы

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

мольба

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

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

Определения

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

  • Пусто : . Пробел или табуляция.
  • Word : последовательность символов, рассматриваемая оболочкой как единое целое. Также известен как токен .
  • Имя : Слово , состоящее только из буквенно-цифровых символов и подчеркиваний и начинающееся с буквенного символа или подчеркивания. Также называется идентификатором .
  • Метасимвол . Символ, который без кавычек разделяет слова. Одно из следующего: | &; () пробел
  • Оператор управления : токен , который выполняет функцию управления. Это один из следующих символов: || & &&; ;; () |

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

Зарезервированные слова – это слова, которые имеют особое значение для оболочки. Следующие слова распознаются как зарезервированные, если они не заключены в кавычки и являются первым словом простой команды или третьим словом команды case или for :

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

Грамматика оболочки: простые команды

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

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

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

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

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

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

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

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

Списки

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

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

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

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

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

command1 && command2

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

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

command1 || command2

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

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

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

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

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

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

[[ выражение ]]: вернуть состояние 0 или 1 в зависимости от оценки условного выражения выражение . Выражения состоят из основных цветов, описанных ниже в разделе Условные выражения. Разделение слов и расширение пути не выполняются в словах между [[ и ]] ; Выполняется расширение тильды, расширение параметров и переменных, арифметическое расширение, подстановка команд, подстановка процессов и удаление кавычек.

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

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

  • (Выражение): возвращает значение выражение . Это может быть использовано для отмены нормального приоритета операторов.
  • ! expressio n: True, если expression равно false.
  • expression1 && expression2 : Истинно, если и expression1 , и expression2
  • expression1 || expression2 : true, если expression1 или expression2 имеет значение true.

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

  • for name [ in word ]; сделать список ; done : список слов, следующих за в , расширяется, создавая список элементов. Переменная name устанавливается по очереди для каждого элемента этого списка, и list выполняется каждый раз. Если in word опущено, команда for выполняет list один раз для каждого установленного позиционного параметра. Статус возврата – это статус выхода последней команды, которая выполняется. Если раскрытие элементов, следующих за в , приводит к пустому списку, команды не выполняются, а статус возврата равен 0.
  • for (( expr1 ; expr2 ; expr3 )); сделать список ; done : . Сначала арифметическое выражение expr1 оценивается в соответствии с правилами, описанными в разделе Арифметическая оценка. Арифметическое выражение expr2 затем оценивается многократно, пока не станет равным нулю. Каждый раз, когда expr2 оценивается как ненулевое значение, выполняется список и вычисляется арифметическое выражение expr3 . Если какое-либо выражение опущено, оно ведет себя так, как будто оно имеет значение 1. Возвращаемое значение – это состояние завершения последней команды в списке , которая выполняется, или значение false, если какое-либо из выражений является недопустимым.
  • выберите имя [ в слово ]; сделать список ; done : Список слов, следующих за в , расширяется, создавая список элементов. Набор расширенных слов напечатан на стандартной ошибке, каждому из которых предшествует число. Если in word опущено, позиционные параметры печатаются. Затем отобразится приглашение PS3 и строка будет считана со стандартного входа. Если строка состоит из числа, соответствующего одному из отображаемых слов, этому значению присваивается значение name . Если строка пуста, слова и подсказка отображаются снова. Если EOF читается, команда завершается. Любое другое прочитанное значение приводит к тому, что для name устанавливается значение null. Чтение строки сохраняется в переменной ОТВЕТИТЬ . list выполняется после каждого выбора, пока не будет выполнена команда break . Состояние выхода select – это состояние выхода последней команды, выполненной в списке , или ноль, если команды не выполнялись.
  • case word в [[(] шаблон [ | шаблон ]: команда case сначала раскрывает word и пытается сопоставить его с каждым шаблоном , используя те же правила сопоставления, что и для расширения пути. Когда совпадение найдено, выполняется соответствующий список . После первого совпадения никакие последующие совпадения не предпринимаются. Состояние выхода равно нулю, если не найдено ни одного шаблона. В противном случае это выход статус последней команды, выполненной в списке .
  • , если список ; затем список; и [ elif список ; затем список ; ] … [ else list ; ] fi : if список выполняется. Если статус выхода равен нулю, выполняется затем список . В противном случае каждый elif список выполняется по очереди, и если его статус выхода равен нулю, соответствующий затем список выполняется и команда завершается. В противном случае, else list выполняется, если он присутствует. Состояние выхода – это состояние выхода последней выполненной команды или ноль, если ни одно из условий не проверено как истинное.
  • , а список ; сделать список ; сделано и до списка ; сделать список ; done . Команда 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. Экранирующие последовательности с обратной косой чертой, если они есть, декодируются следующим образом:

  • \ a : оповещение (звонок)
  • \ b : забой
  • \ e : escape-символ
  • \ f : подача формы
  • \ n : новая строка
  • \ r : возврат каретки
  • \ t : горизонтальная вкладка
  • \ v : вертикальная вкладка
  • \\ : обратная косая черта
  • \ ‘: одинарная кавычка
  • \ nnn : восьмибитный символ, значение которого является восьмеричным значением nnn (от одной до трех цифр)
  • \ x HH : восьмибитный символ, значение которого является шестнадцатеричным значением HH (одна или две шестнадцатеричные цифры)
  • \ c x : управляющий символ x

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

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

параметры

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

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

переменная может быть назначена оператором в форме: name = [ value ]

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

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

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

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

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

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

  • * : расширяется до позиционных параметров, начиная с единицы. Когда раскрытие происходит в двойных кавычках, оно расширяется до одного слова со значением каждого параметра, разделенного первым символом специальной переменной 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 : переменная массива, содержащая текущее содержимое стека каталогов. Каталоги появляются в стеке в том порядке, в котором они отображаются встроенной функцией dirs . Присвоение членам этой переменной массива может использоваться для изменения каталогов, уже находящихся в стеке, но встроенные функции pushd и popd должны использоваться для добавления и удаления каталогов. Присвоение этой переменной не изменит текущий каталог. Если DIRSTACK не установлено, оно теряет свои специальные свойства, даже если впоследствии оно сбрасывается.

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

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

GROUPS : переменная массива, содержащая список групп, членом которых является текущий пользователь. Назначения в ГРУППЫ не имеют никакого эффекта и возвращают статус ошибки. Если 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. Последовательность случайных чисел можно инициализировать, присвоив значение СЛУЧАЙНО . Если СЛУЧАЙНЫЙ не установлен, он теряет свои специальные свойства, даже если впоследствии он сбрасывается.

REPLY : укажите строку ввода, прочитанную встроенной командой 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”.

КОЛОННЫ : используется встроенной командой выбор для определения ширины терминала при печати списков выбора. Автоматически устанавливается при получении SIGWINCH.

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

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

FIGNORE : список суффиксов, разделенных двоеточиями, которые следует игнорировать при завершении имени файла. Имя файла, суффикс которого соответствует одной из записей в 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 .

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

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

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

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

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

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

LINES : используется встроенной командой 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 : значение этого параметра раскрывается и используется в качестве основной строки приглашения. Значением по умолчанию является « \ s- \ v \ $ ».

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

PS3 : значение этого параметра используется в качестве подсказки для команды выбрать .

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

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

  • %% . Литерал % .
  • % [ p ] [l] R: истекшее время в секундах
  • % [ p ] [l] U: количество секунд использования процессора в пользовательском режиме
  • % [ p ] [l] S: количество секунд работы процессора в системном режиме
  • % P : процент загрузки процессора, рассчитывается как (% 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 . объявить -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/{old, new, dist, bugs} 

или же

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

Расширение скобок вносит небольшую несовместимость с историческими версиями 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} : отображать ошибку, если ноль или не установлен. Если параметр равен нулю или не установлен, расширение word (или сообщение об этом, если word отсутствует) записывается в стандарт Ошибка и оболочка, если она не является интерактивной, завершается. В противном случае значение параметра подставляется.
  • $ {параметр: + слово} : использовать альтернативное значение. Если параметр равен нулю или не задан, ничего не подставляется, в противном случае подставляется расширение слова .
  • $ {параметр: смещение} и $ {параметр: смещение: длина} : расширение подстроки. Расширяется до длины символов параметра , начиная с символа, указанного в offset . Если длина опущена, расширяется до подстроки параметра , начиная с символа, указанного в смещении . Длина и смещение являются арифметическими выражениями. Длина должна иметь значение, большее или равное нулю. Если смещение оценивается как число меньше нуля, значение используется как смещение от конца значения параметра . Если параметр равен @ , результатом будет длина позиционных параметров, начинающихся со значения смещения . Если параметр является именем массива, индексированным с помощью @ или *, то результатом будут элементы длины массива, начинающиеся с $ { параметра [ смещение ]}. Индексирование подстроки начинается с нуля, если только не используются позиционные параметры, и в этом случае индексация начинается с 1.
  • $ {! prefix *} : расширяется до имен переменных, имена которых начинаются с prefix , разделенных первым символом специальной переменной IFS . ,
  • $ {# параметр} : подставляется длина в символах значения параметра . Если параметр равен * или @ , подставляемое значение является числом позиционных параметров. Если параметр – это имя массива, подписанное * или @ , подставляемое значение – это количество элементов в массиве.
  • $ {параметр # слово} и $ {параметр ## слово} : слово раскрывается, чтобы создать шаблон так же, как в раскрытии пути. Если шаблон соответствует началу значения параметра , то результатом расширения является расширенное значение параметра с самым коротким соответствующим шаблоном ( # ‘case) или самый длинный соответствующий шаблон (случай ## ‘) удален. Если параметр равен @ или * , операция удаления шаблона применяется поочередно к каждому позиционному параметру, и расширение представляет собой список результатов.Если параметр является переменной массива, подписанной @ или * , операция удаления шаблона применяется к каждому члену массива по очереди, и расширение является результирующим списком.
  • $ {параметр% word} и $ {параметр %% word} : слово раскрывается, чтобы создать шаблон так же, как в раскрытии пути. Если шаблон соответствует завершающей части расширенного значения параметра , то результатом расширения является расширенное значение параметра с кратчайшим подходящим шаблоном ( % ‘) или самый длинный соответствующий шаблон ( %% ) удален. Если параметр равен @ или * , операция удаления шаблона применяется по очереди к каждому позиционному параметру, и расширение является результирующим списком. Если параметр является переменной массива, подписанной @ или * , операция удаления шаблона применяется к каждому члену массива по очереди, и расширение является результирующим списком.
  • $ {параметр/шаблон/строка} и $ {параметр // шаблон/строка} : pattern раскрывается для создания шаблона так же, как в раскрытии пути. Параметр раскрывается, и самое длинное соответствие pattern его значению заменяется на строку . В первой форме заменяется только первый матч. Вторая форма вызывает замену всех совпадений pattern на string . Если шаблон начинается с # , он должен совпадать с началом расширенного значения параметра . Если шаблон начинается с % , он должен совпадать в конце расширенного значения параметра . Если строка равна нулю, совпадения с шаблоном удаляются, а /, следующий за шаблоном , можно не указывать. Если параметр равен @ или * , операция замещения применяется к каждому позиционному параметру по очереди, и расширение является результирующим списком. Если параметр является переменной массива, подписанной @ или * , операция замещения применяется к каждому члену массива по очереди, и расширение является результирующим списком.

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

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

$ ( команда ) и команда

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

После разделения слов, если не был установлен параметр -f , bash сканирует каждое слово на наличие символов * , ? и [. Если появляется один из этих символов, то слово рассматривается как шаблон и заменяется отсортированным по алфавиту списком имен файлов, соответствующих шаблону. Если не найдено подходящих имен файлов, а параметр оболочки nullglob отключен, слово остается без изменений. Если установлена ​​опция nullglob и совпадений не найдено, слово удаляется. Если включен параметр оболочки nocaseglob , сопоставление выполняется без учета буквенных символов. Если для раскрытия пути используется шаблон, символ “. ” в начале имени или сразу после косой черты должен явно совпадать, если только параметр оболочки dotglob не указан. При сопоставлении имени пути символ косой черты всегда должен совпадать явно. В других случаях символ “. ” специально не обрабатывается. См. Описание shopt в разделе Команды встроенной оболочки , где описаны nocaseglob , nullglob и Параметры оболочки dotglob .

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

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

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

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

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

? : соответствует любому отдельному символу

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

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

alnum alpha ascii пустая цифра cntrl график нижний пробел пробел верхнее слово xdigit

Класс символов соответствует любому символу, принадлежащему этому классу. Класс символов word соответствует буквам, цифрам и символу _.

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

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

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

  • ? ( pattern-list ) : Соответствует нулю или одному вхождению данных шаблонов
  • * ( pattern-list ) : соответствует ни одному или нескольким вхождениям данных шаблонов.
  • + ( pattern-list ) . Соответствует одному или нескольким вхождениям указанных шаблонов.
  • @ ( pattern-list ) : точно соответствует одному из указанных шаблонов
  • ! ( 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

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

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

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

  << [ - ]  слово здесь-документ  
разделитель

Для параметра 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 не указано Если файл не существует, он создается.

Псевдонимы

Псевдонимы позволяют заменить слово на строку, когда оно используется в качестве первого слова простой команды. Оболочка поддерживает список псевдонимов, которые можно устанавливать и отменять с помощью встроенных команд alias и unalias . Первое слово каждой команды, если оно не заключено в кавычки, проверяется на наличие псевдонима. Если это так, это слово заменяется текстом псевдонима. Имя псевдонима и текст замены могут содержать любые допустимые входные данные оболочки, включая перечисленные выше метасимволы , за исключением того, что имя псевдонима может не содержать =. Первое слово замещающего текста проверяется на псевдонимы, но слово, идентичное расширяемому псевдониму, не раскрывается во второй раз. Это означает, что, например, можно создать псевдоним ls для ls -F , а bash не пытается рекурсивно развернуть замещающий текст. Если последний символ значения псевдонима является пустым , то следующее слово команды после псевдонима также проверяется на расширение псевдонима.

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

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

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

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

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

функции

Функция оболочки хранит серию команд для последующего выполнения. Когда имя функции оболочки используется в качестве простого имени команды, выполняется список команд, связанных с этим именем функции.Функции выполняются в контексте текущей оболочки; не создается новый процесс для их интерпретации (в отличие от выполнения сценария оболочки). Когда функция выполняется, аргументы функции становятся позиционными параметрами во время ее выполнения. Специальный параметр # обновляется с учетом изменений. Позиционный параметр 0 не изменяется. Переменная FUNCNAME установлена ​​на имя функции во время ее выполнения. Все остальные аспекты среды выполнения оболочки идентичны для функции и ее вызывающей стороны, за исключением того, что ловушка DEBUG не наследуется, если функции не присвоен атрибут trace .

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

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

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

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

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

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

  • id ++ id – : переменная после увеличения и после уменьшения
  • ++ id id: предварительное увеличение и предварительное уменьшение переменной
  • – + : унарный минус и плюс
  • ! ~ : логическое и побитовое отрицание
  • ** : возведение в степень
  • * /% : умножение, деление, остаток
  • + – : сложение, вычитание
  • <> : сдвиг влево и вправо по битам
  • = : сравнение
  • ==! = : равенство и неравенство
  • & : побитовое И
  • ^ : битовое исключающее ИЛИ
  • | : побитовое ИЛИ
  • && : логическое И
  • || : логическое ИЛИ
  • expr ? expr : expr : условная оценка
  • = * =/=% = + = – = <> = & = ^ = | = : назначение
  • expr1 , 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 файл : истина, если файл существует и является специальным файлом блока
  • -c файл : истина, если файл существует и является специальным символьным файлом
  • -d файл : истина, если файл существует и является каталогом
  • -e файл : Истина, если файл существует
  • -f файл : Истина, если файл существует и является обычным файлом
  • -g файл : Истинно, если файл существует и является set-group-id
  • -h файл : Истина, если файл существует и является символической ссылкой
  • -k файл . Истинно, если файл существует и установлен его бит закрепления
  • -p файл . Истинно, если файл существует и является именованным каналом (FIFO)
  • -r файл : Истина, если файл существует и доступен для чтения
  • -s файл : истина, если файл существует и имеет размер больше нуля
  • -t fd : истина, если дескриптор файла fd открыт и ссылается на терминал
  • -u файл : истина, если файл существует и установлен его бит set-user-id
  • -w файл : истина, если файл существует и доступен для записи
  • -x файл : true, если файл существует и является исполняемым
  • -O файл : Истина, если файл существует и принадлежит эффективному идентификатору пользователя
  • -G файл : истина, если файл существует и принадлежит эффективному идентификатору группы
  • -L файл . Истинно, если файл существует и является символической ссылкой
  • -S файл : истина, если файл существует и является сокетом
  • -N файл : Истина, если файл существует и был изменен с момента последнего чтения
  • file1 nt file2 : истина, если file1 новее (в соответствии с датой изменения), чем file2 или если file1 существует, а file2 нет
  • file1 ot file2 : истина, если file1 старше file2 или если файл2 существует, а файл1 не существует
  • file1 -ef file2 : истина, если file1 и file2 ссылаются на одно устройство и номера инодов
  • -o optname : true, если включен параметр оболочки optname .
  • -z строка : истина, если длина строки равна нулю
  • строка -n строка : истина, если длина строки не равна нулю
  • string1 == string2 : истина, если строки равны. = может использоваться вместо == для строгого соответствия POSIX.
  • string1 ! = string2 : истина, если строки не равны.
  • string1 < string2 : истина, если string1 сортирует перед string2 лексикографически в текущей локали
  • string1 > string2 : истина, если string1 сортирует после string2 лексикографически в текущей локали
  • arg1 OP arg2 : OP является одним из -eq , – ne , -lt , -le , -gt или -ge . Эти арифметические бинарные операторы возвращают true, если arg1 равно, не равно, меньше, меньше или равно, больше или больше или равно arg2 , соответственно. Arg1 и arg2 могут быть положительными или отрицательными целыми числами.

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

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

  • 1. . Слова, помеченные синтаксическим анализатором как присвоения переменных (предшествующие имени команды) и перенаправления, сохраняются для последующей обработки.
  • 2. : слова, которые не являются переменными или не перенаправляют, раскрываются. Если после раскрытия остаются какие-либо слова, первое слово считается именем команды, а остальные слова – аргументами.
  • 3.. Перенаправление выполняется.
  • 4. : текст после = в каждом назначении переменной подвергается расширению тильды, расширению параметров, подстановке команд, арифметическому расширению и удалению кавычек перед присвоением переменной.

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

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

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

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

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

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

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

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

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

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

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

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

  • Открытые файлы, унаследованные оболочкой при вызове, измененные путем перенаправлений, предоставляемых встроенной функции exec .
  • Текущий рабочий каталог, установленный cd , pushd или popd , или унаследованный оболочкой при вызове
  • Маска режима создания файла, установленная umask или унаследованная от родителя оболочки
  • Текущие ловушки, установленные ловушкой
  • Параметры оболочки, которые устанавливаются путем назначения переменных или с помощью set или наследуются от родительского объекта оболочки в среде
  • Функции оболочки, определенные во время выполнения или унаследованные от родителя оболочки в среде
  • Параметры включаются при вызове, либо по умолчанию, либо с аргументами командной строки, либо с помощью set
  • Параметры, включенные shopt
  • Псевдонимы оболочки, определенные с помощью псевдонима
  • Различные идентификаторы процессов, включая фоновые задания, значение $$ и значение $ PPID .

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

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

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

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

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

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