Особенности работы оболочки bash.: СПЕЦИФИЧЕСКИЕ ВОЗМОЖНОСТИ ВАSH
Вперед Назад Содержание4. СПЕЦИФИЧЕСКИЕ ВОЗМОЖНОСТИ ВАSH
В этой главе описаны возможности, уникальные для Bash.
4.1 Вызов Bash
Кроме односимвольных опций командной строки оболочки (см. раздел 4.5.), есть несколько мультисимвольных опций, которые можно использовать. Для того, чтобы быть узнанными, эти опции должны появляться на командной строке перед односимвольными опциями.
- -norc
Не читает инициализацию файла '~/.bashrc' в диалоговой оболочке. Это по умолчанию, если оболочка вызывается как sh.
- -rcfile имя_файла
Выполняет команды из файла имя_файла (вместо '~/.bashrc') в диалоговой оболочке.
- -nonprofile
Не загружает файл начальных действий системы '/etc/profile' или любой из файлов персональной инициализации '~/.bash-profile' ,'~/bash-login' или '~/.profile', когда Bash вызывается как login.
- -version
выводит номер версии оболочки.
- -login
включает оболочку, как если бы она вызывалась с login. Это эквивалентно 'exec - bash', но может происходить из другой оболочки, такой как csh. Если вы хотите заменить вашу текущую входную оболочку Bash, вы должны набрать 'exec bash -login'.
- -nonbraceexpansion
Не выполняет brace-расширение (см. раздел 2.2).
- -nonlineediting
Не использует библиотеку GNU (СМ. главу 7 "Редактирование командной строки") для чтения диалоговых командных строк.
- -posix
Изменяет поведение Bash в соответствии со стандартом Posix 1003.2, когда операция по умолчанию отличается от этого стандарта. Это предназначено для того, чтобы строго подчинить Bash стандарту.
- -c строка
Читает и выполняет команды со строки после выполнения опций, затем выходит.
- -i
Заставляет оболочку выполнять команды в интерактивном режиме.
- -s
Если есть этот флаг, или после обработки опций не осталось аргументов, то команды считываются со стандартного ввода. Эта опция позволяет устанавливать позиционные параметры при вызове диалоговой оболочки.
4.2 Файлы начальных действий оболочки
Когда и как Bash выполняет файлы начальных действий:
- Для login-оболочек (имеет место для опции -nonprofile):
- при входе:
- Если '/etc/profile' существует, то сделать его источником.
- Если '~/bash_profile' существует, сделать его источником, иначе если '~/.bash_login' существует, сделать его источником, иначе if '~/.profile' существует, сделать его источником.
- При выходе:
- Если '~bash_logout' существует, сделать его источником.
- при входе:
- Для диалоговых не-login-оболочек (имеет место для опций -norc and
-rcfiles):
- При входе:
- Если '~/.bashrc' существует, сделать его источником.
- При входе:
- Для недиалоговых оболочек:
- При входе:
- Если переменная среды ENV не ноль, расширяет переменную и делает источником файл, заданный своим значением. Если оболочка запускается не в режиме Posix, она ищет BASH_ENV перед ENV.
- При входе:
Таким образом обычно ~/bash_profile содержит строку:
if [-f ~/.bashrc ]; then source ~/.bashrc; fi
после (или перед) любой специфической инициацией входа.
Если Bash вызывается как sh, он старается как можно больше походить на sh. Для login-оболочки он пытается использовать в качестве источника только '/etc/profile' и '~/.profile', в таком порядке. Oпция nonprofile может при этом использоваться для блокирования режима. Оболочка, вызванная sh, не пытается использовать в качестве источника ни один из файлов начальных действий.
Когда Bash запускается в режиме POSIX опцией -posix командной строки, он следует стандарту Posix 1003.2 для файлов начальных действий. В этом режиме переменная ENV расширяется, и этот файл используется в качестве источника; другие файлы начальных действий не считываются.
4.3 Является ли оболочка диалоговой?
Может возникнуть ситуация, что хочется определить внутри сценария начальных действий, выполняется bash в диалоговом режиме или нет. Для того, чтобы это сделать, нужно проверить переменную $PS1 - она задана в диалоговых оболочках и не задана в недиалоговых.
Таким образом:
if [-z "$PS1"]; then
echo Эта оболочка недиалоговая
else
echo Эта оболочка диалоговая
fi
Вы можете заставить диалоговый Bash не выполнять ваш файл
'~/.bashrc' с флагом -norc, можете изменить имя файла '~/.bashrc' на
любое другое имя файла с помощью имени -rcfile, и можете заставить
Bash не выполнять ваш файл '~/.bash_profile' с флагом -nonprofile.
4.4 Встроенные команды Bash.
В этом разделе описаны встроенные команды, уникальные для Bash или расширенные в нем.
- builtin
Выполняет встроенную команду оболочки. Это используется, когда вы хотите заменить встроенную команду оболочки функцией, но нужна функциональность встроенной команды внутри самой функции.builtin [встроенная_команда_оболочки [аргументы]]
- bind
Изображает ключ текущего Readline (см. главу 7 "Редактирование командной строки") и связи функций, или компонует последовательность ключей в функцию Readline или макрофункцию. Введенный скомпонованный синтаксис идентичен синтаксису '.inputrc' (см. раздел 7.3.), но каждая связь должна быть передана как отдельный аргумент:'"\C-x\C-r":re-read-init-file'. Если используются опции, они имеют следующие значения:bind [-m таблица_ключей] [-lvd] [-q имя] bind [-m таблица_ключей] -f имя_файла bind [-m таблица_ключей] последовательность_ключей:имя_функции
- -m таблица_ключей
Используется таблица_ключей как таблица ключей, на которую должны влиять последующие связывания: имена таблицы ключей, которые могут введены emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move, vi-command и vi-insert. vi эквивалентно vi-command, emacs эквивалентно emacs-standard.
- -l
Перечисляет имена всех функций чтения строки.
- -v
Перечисляет текущие имена функций и свяэывания.
- -d
Сбрасывает имена функций и присваивания так, чтобы их можно было перечитывать.
- -f имя_файла
Считывает присваивания ключей файла с именем имя_файла.
- -q
Запрос о том, какие ключи вызывают названную функцию.
- command
Выполняет команду с аргументом, пропуская функции оболочки. Если у вас есть функция оболочки с именем ls и вы хотите назвать так же команду, вы говорите 'command ls'. Опция -p осуществляет использование переменной по умолчанию для $PATH, что гарантирует нахождение всех стандартных сервисных программ.command[-pVv] команда [аргументы...]
Если обеспечиваются и опция -V, и опция -v, то выдается описание "команды". Опция -v вызывает одно слово, указывающую на команду или имя файла, использованные для вызова "ко манды", которую нужно вывести; опция -V вызывает более мно гословное описание.
- declare
Объявляет переменные и/или дает им атрибуты. Если не даны имена, вместо них выводятся значения переменных. -f значит использование только имен функций. -r говорит, что имена должны только читаться. -x отмечает имена для экспорта. -i рассматривает переменную как целое число; арифметическое вычисление (см. раздел 4.7) выполнено, когда переменной прис воено значение. При использовании + вместо - удаляется заме щающий атрибут. Использование функции declare делает имена локальными, как при помощи команды local.declare [-frxi] [имя[=значение]]
- enable
Включает и выключает команды оболочки. Это позволяет ис пользовать команду диска, имеющую то же имя, что и встроен ная команда оболочки. Если используется n, то "имена" стано вятся запрещенными. В противном случае имена вводятся в дей ствие. Например, чтобы использовать бинарный поиск test с помощью $PATH вместо встроенной команды оболочки, нужно ввести 'enable -n test'. Опция -a предназначена для занесения в список каждой встроенной команды с пометкой, включена она или нет.enable [n] [-a] [имя...]
- help
Выводится вспомогательная информация о встроенных командах. Если определен шаблон, help дает подробную информацию о всех командах, совпадающих с шаблоном, в противном случае выводится список встроенных команд.help [шаблон]
- local
Для каждого аргумента создается локальная переменная под названием "имя" и ей дается "значение". local может использоваться только внутри функции: он заставляет перемен ную иметь видимый контекст, ограниченный этой функцией и ее потомками.local имя[=значение]
- type
Для каждого "имени" помечает, как оно должно интерпретиро ваться при использовании имени команды. Если используется флаг type, type возвращает единственное слово - "alias", "function", "builtin", "file", или "keyword", если имя псевдоним, функция оболочки, встроенная команда оболочки, дисковый файл или зарезервированное оболочкой слово соответственно. Если используется флаг -path, type возвращает имя дискового файла, или ничего, если type не должен возвратить "file". Если используется флаг -all, возвращаются все места, содержащие выполнимый названный файл. Псевдонимы и функции включаются если и только если флаг -path также не использует ся.type [-all] [-type | -path] [имя...]
- ulimit
Ulimit проводит контроль за источниками, используемыми для начальных процессов в оболочке,в системах, которые допускают такой контроль. Если дана опция, она интерпретируется следующим образом:ulimit [acdmstfpnuvSH] [предел]
- -S
изменяет и сообщает гибкий предел, связанный с источником (по умолчанию, если не дана опция -H).
- -H
изменяет и сообщает твердый предел, связанный с источником.
- -a
сообщает все текущие пределы.
- -с
максимальный размер созданного файла оперативной памяти.
- -d
максимальный размер сегмента данных процесса.
- -m
максимальный размер резидентного набора.
- -s
максимальный размер стека.
- -t
максимальное время cpu в секундах.
- -f
максимальный размер файла, созданного оболочкой.
- -p
максимальный размер канального буфера.
- -n
максимальное число открытых файловых дескрипторов.
- -u
максимальное число процессов, доступных отдельному пользователю.
- -v
максимальное количество виртуальной памяти, доступное процессу.
4.5 Встроенная команда set.
Зта встроенная команда настолько перегружена, что ей посвящается целый раздел.
set [abefhkmnptuvxldCHP] [-o опция] [аргумент]
- -a
отмечает переменные, которые модифицированы или созданы для зкспорта.
- -b
вызывает прекращение фоновых заданий, о котором сообщает перед выводом следующего базового приглашения.
- -е
немедленный выход, если выходное состояние команды ненулевое.
- -f
выключает генерацию имени файла (глоббирование).
- -h
обнаруживает и запоминает (хеширует) команды как определенные функции до того, как функция будет выполнена.
- -к
В окружении команды располагаются все аргументы ключевых слов, не только те, которые предшествуют имени команды.
- -m
Разрешается управление заданиями (см. главу 5).
- -n
Читает команды, но не выполняет их.
- -о имя_опции
Устанавливает флаг, соответствующий имени_опции.
- allexport
то же, что -а.
- braceexpand
оболочка должна выполнить brace-расширение (см. раздел 2.2).
- emacs
использует интерфейс редактирования emacs (см. главу 7 "Редактирование командной строки").
- errexit
то же, что -е.
- histexpand
то же, что -Н.
- ignoreeof
оболочка не выходит при чтении EOF.
- interactive-comments
позволяет вызывать слово, начинающееся с '#', и все оставшиеся символы на этой строке игнорировать в диа логовой оболочке.
- monitor
то же, что -m.
- noclobber
то же, что -C.
- noexec
то же, что -n.
- noglob
то же, что -f.
- nohash
то же, что -d.
- notify
то же, что -b.
- nounset
то же, что -u.
- physical
то же, что -P.
- posix
изменяет режим Bash в соответствии со стандартом Posix 1003.2, когда операция по умолчанию отличается от него. Предназначен для того, чтобы сделать режим строго подчиненным зтому стандарту.
- privileged
то же, что -p.
- verbose
то же, что -v.
- vi
использует интерфейс редактирования строки редактора vi.
- xtrace
то же, что -x.
- -p
Включает привилегированный режим. В зтом режиме файл $ENV не выполняется, и функции оболочки не наследуются из среды. Зто включается автоматически начальными действиями, если идентификатор зффективного пользователя (группы) не равен идентификатору реального пользователя (группы). Выключение зтой опции присваивает идентификатор зффективного пользователя (группы) идентификатору реального пользователя (группы).
- -t
выход после чтения и выполнения команды.
- -u
во время замещения рассматривает незаданную переменную как ошибку.
- -v
выдает строки ввода оболочки по мере их считывания.
- -x
выводит команды и их аргументы по мере выполнения команд.
- -l
сохраняет и восстанавливает связывание имени в команде for.
- -d
Выключает хеширование команд, найденных для выполнения. Обычно команды запоминаются в хеш-таблице и, будучи однажды найденными, больше не ищутся.
- -С
не позволяет существующим файлам перенаправление вывода.
- -Н
закрывает замену стиля ! истории. Этот флаг принимается по умолчанию.
- -Р
Если установлена, не следует символьному указателю при выполнении команды типа cd, которая изменяет текущий каталог. Вместо этого используется физический каталог.
- --
Если нет аргументов, следующих за зтим флагом, то не задаются позиционные параметры. В противном случае позиционные параметры присваиваются аргументам, даже если некоторые из них начинаются с а-.
- -
Сигнал конца опции, вызывающей присваивание оставшихся аргументов позиционным параметрам. Опции -x и -v выключаются. Если здесь нет аргументов, позиционный параметр не изменяется.
4.6 Переменные Bash.
Эти переменные задаются и используются Bash, но в других оболочках обычно специально не рассматриваются.
- HISTCONTROL
- history_control
При присвоении значения 'ignorespace' строки, начинающиеся с пробела или табуляции, не вводятся в список истории. При присвоении значения 'ignoredups' строка, соответствующая прошлой введенной строке, не вводится. 'ignoreboth' сочетает эти две опции. Присвоение любого другого значения обозначает сохранение всех строк в списке "истории".
- HISTFILE
Имя файла, хранящего команду истории.
- HISTSIZE
Если задана, это максимальное число команд, которые должны быть запомнены в истории.
- histchars
Восходит к трем символам, контролирующим расширение истории, быстрое замещение и лексемизацию (см. раздел 6.1 "Диалог истории"). Первый символ - символ расширения истории, обозначающий начало расширения истории - обычно '!'. Второй обозначает быструю замену при нахождении первого символа на строке, обычно '^'. Опционный третий символ помечает остаток строки - комментарий, когда он найден как первый символ слова, обычно '#'. Символ комментария истории вызывает замену истории, игнорируемую для оставшихся слов на строке. Не обязательно вызывает синтаксический разбор оболочки для рассмотрения остатка строки как комментария.
- HISTCMD
Номер истории или индекс списка истории текущей команды. Если HISTCMD не задана, она теряет свои специальные свойства, даже если впоследствии она опять задается.
- hostname_completion_file
- HOSTFILE
Содержит имя файла в том же формате, что и '/etc/hosts', которое должно считываться, когда оболочке нужно завершить hostname. Вы можете иэменить файл в диалоговом режиме. В следующий раз, когда вы попытаетесь завершить hostname, Bash добавит содержание файла к уже существующей базе данных.
- MAILCHECK
Показывает, как часто (в секундах) оболочка должна проверять файлы, указанные в MAILPATH, на наличие почты.
- PROMPT_COMMAND
Если есть, содержит строку с командой для выполнения перед выводом каждой базовой команды приглашения ($PS1).
- UID
Числовой идентификатор реального пользователя для текущего пользователя.
- ЕUID
Числовой идентификатор зффективного пользователя для текущего пользователя.
- HOSTTYPE
Строка, описывающая машину, на которой запущен Bash.
- OSTYPE
Cтрока, описывающая операционную систему, в которой запущен Bash.
- FIGNORE
Разделенный двоеточиями список суффиксов, игнорируемых при завершении имени файла. Имя файла, чей суффикс соответствует одному из приведенных в FIGNORE, извлекается из списка соответствующих имен файлов. Образцовое значение - '.o:~'.
- INPUTRC
Имя файла начальных действий Readline, заменяемое по умолчанию на '~/.inputrc'.
- BASH_VERSION
Имя версии текущего зкземпляра Bash.
- IGNOREEOF
Контролирует получение символа EOF оболочкой в отдельном вводе. Если задана, то ее значение - число последовательных символов EOF, которые могут быть считаны как первые символы строки ввода перед выходом из оболочки. Если переменная существует, но не имеет числового значения, то по умолчанию зто 10. Если переменная не существует, EOF отмечает конец ввода в оболочку. Действует только в диалоговых оболочках.
- no_exit_on_failed_exec
Если эта переменная существует, то оболочка не выходит, если она не может выполнить файл, указанный в команде exec.
- nolinks
Если есть, говорит о том, что не нужно следовать символическим указателям в командах, изменяющих текущий рабочий каталог. По умолчанию Bash следует по логической цепи каталогов при выполнении команд таких как cd, изменяющая рабочий каталог. Например, если '/usr/sys/' - указатель на '/usr/local/sys', то:
Если nolinks существует, то:$ cd/usr/sys; echo $PWD /usr/sys $ cd..; pwd /usr
См. также описание опции -p встроенной команды set, раздел 4.5.$ cd /usr/sys; echo $PWD /usr/local/sys $ cd ..; pwd /usr/local
4.7 Арифметика оболочки.
Арифметические вычисления.
Оболочка позволяет вычислять арифметические выражения как одно из расширений оболочки или с помощью встроенной команды let.
Вычисления производятся в longint без проверки на переполнение, хотя деление на 0 прерывается и отмечается как ошибка. Нижеследующий список операторов сгруппирован по уровням равноприоритетных операторов. Уровни располагаются в порядке уменьшения приоритета.
- -+
унарные минус и плюс
- !~
логическое и поразрядное отрицания
- *÷%
умножение, деление, остаток
- + -
сложение и вычитание
- << >>
левый и правый поразрядные сдвиги
- <= >= < >
сравнение
- ==!=
равенство и неравенство
- &
поразрядное И
- ^
поразрядное исключительное ИЛИ
- |
поразрядное ИЛИ
- &&
логическое И
- ||
логическое ИЛИ
- = *= ÷= %= += -= <<= >>= &= ^= |=
распределение по приоритету.
Переменные оболочки допустимы как операнды; параметрическое расширение выполняется перед вычислением выражения. Значение параметра внутри выражения обязательно longint. Переменная оболочки не обязана иметь целый атрибут, включаемый в выражение.
Константы, начинающиеся с 0, интерпретируются как восьмиричные числа. Начало 0x или 0X обозначает шестнадцатиричное число. Кроме того, числа в форме [основание#]n, когда основание - десятичное число от 2 до 36, представляющее арифметическое основание системы счисления, а n - число в зтой системе. Если основание не указано, подразумевается 10.
Операторы вычисляются в порядке приоритета. Субвыражения в круглых скобках вычисляются первыми и могут не подчиняться правилам приоритета.
Арифметическое расширение.
Арифметическое расширение позволяет вычислять арифметические выражения и подставлять результат. Существуют два формата арифметического расширения:
$[ выражение ]
$(( выражение ))
Выражение рассматривается, как если бы оно было заключено в двойные
кавычки, но двойные кавычки внутри фигурных или круглых скобок специально не рассматриваются. Все лексемы в выражении подвергаются параметрическому расширению, командному замещению и устранению кавычек.
Арифметические подстановки могут вкладываться одна в другую.
Вычисление выполняется согласно вышеуказанным правилам. Если выражение некорректно, Bash выдает сообщение, обозначающее сбой, и замещение невозможно.
Арифметические встроенные команды.
- let
Встроенная команда let позволяет выполнять арифметические действия над переменными оболочки. Каждое выражение вычисляется согласно приведенным ранее правилам (см. раздел 4.7.1). Если последнее вычисление равно 0, let возвращает 1, в противном случае - 0.let выражение [выражение]
4.8 Контролирование приглашения.
Значение переменной $PROMPT_COMMAND проверяется непосредственно перед выдачей Bash каждого базового приглашения. Если оно задано и не ноль, то значение выводится, как если бы оно было напечатано на командной строке.
Приведенная таблица описывает специальные символы, которые могут появляться в переменной PS1:
- \t
время в формате часы: минуты: секунды.
- \d
Дата в формате день_недели месяц число.
- \n
перевод строки.
- \s
имя оболочки, базовое имя $0 (участок, следующий за конечным /)
- \w
текущий рабочий каталог
- \W
базовое имя $PWD
- \u
имя пользователя, под которым вы эарегистрированы
- \h
hostname
- \#
номер зтой команды
- \!
номер истории зтой команды
- \nnn
символ, соответствующий восьмиричному числу nnn
- \$
если зффективный uid=0, то #, иначе $.
- \\
обратная косая черта (backslash)
- \[
начало последовательности невыводимых символов. Может использоваться для осуществления управления терминалом в приглашении.
- \]
конец последовательности невыводимых символов.
Вперед Назад Содержание