Особенности работы оболочки 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 стандарту.

Есть несколько односимвольных опций, которые недоступны встроенной команде set.
-c строка

Читает и выполняет команды со строки после выполнения опций, затем выходит.

-i

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

-s

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

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

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

bind [-m таблица_ключей] [-lvd] [-q имя]
bind [-m таблица_ключей] -f имя_файла
bind  [-m  таблица_ключей]   последовательность_ключей:имя_функции
Изображает ключ текущего Readline (см. главу 7 "Редактирование командной строки") и связи функций, или компонует последовательность ключей в функцию Readline или макрофункцию. Введенный скомпонованный синтаксис идентичен синтаксису '.inputrc' (см. раздел 7.3.), но каждая связь должна быть передана как отдельный аргумент:'"\C-x\C-r":re-read-init-file'. Если используются опции, они имеют следующие значения:
-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

command[-pVv] команда [аргументы...]
Выполняет команду с аргументом, пропуская функции оболочки. Если у вас есть функция оболочки с именем ls и вы хотите назвать так же команду, вы говорите 'command ls'. Опция -p осуществляет использование переменной по умолчанию для $PATH, что гарантирует нахождение всех стандартных сервисных программ.

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

declare

declare [-frxi] [имя[=значение]]
Объявляет переменные и/или дает им атрибуты. Если не даны имена, вместо них выводятся значения переменных. -f значит использование только имен функций. -r говорит, что имена должны только читаться. -x отмечает имена для экспорта. -i рассматривает переменную как целое число; арифметическое вычисление (см. раздел 4.7) выполнено, когда переменной прис воено значение. При использовании + вместо - удаляется заме щающий атрибут. Использование функции declare делает имена локальными, как при помощи команды local.

enable

enable [n] [-a] [имя...]
Включает и выключает команды оболочки. Это позволяет ис пользовать команду диска, имеющую то же имя, что и встроен ная команда оболочки. Если используется n, то "имена" стано вятся запрещенными. В противном случае имена вводятся в дей ствие. Например, чтобы использовать бинарный поиск test с помощью $PATH вместо встроенной команды оболочки, нужно ввести 'enable -n test'. Опция -a предназначена для занесения в список каждой встроенной команды с пометкой, включена она или нет.

help

help [шаблон]
Выводится вспомогательная информация о встроенных командах. Если определен шаблон, help дает подробную информацию о всех командах, совпадающих с шаблоном, в противном случае выводится список встроенных команд.

local

local имя[=значение]
Для каждого аргумента создается локальная переменная под названием "имя" и ей дается "значение". local может использоваться только внутри функции: он заставляет перемен ную иметь видимый контекст, ограниченный этой функцией и ее потомками.

type

type [-all] [-type | -path] [имя...]
Для каждого "имени" помечает, как оно должно интерпретиро ваться при использовании имени команды. Если используется флаг type, type возвращает единственное слово - "alias", "function", "builtin", "file", или "keyword", если имя псевдоним, функция оболочки, встроенная команда оболочки, дисковый файл или зарезервированное оболочкой слово соответственно. Если используется флаг -path, type возвращает имя дискового файла, или ничего, если type не должен возвратить "file". Если используется флаг -all, возвращаются все места, содержащие выполнимый названный файл. Псевдонимы и функции включаются если и только если флаг -path также не использует ся.

ulimit

ulimit [acdmstfpnuvSH] [предел]
Ulimit проводит контроль за источниками, используемыми для начальных процессов в оболочке,в системах, которые допускают такой контроль. Если дана опция, она интерпретируется следующим образом:
-S

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

-H

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

-a

сообщает все текущие пределы.

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

-d

максимальный размер сегмента данных процесса.

-m

максимальный размер резидентного набора.

-s

максимальный размер стека.

-t

максимальное время cpu в секундах.

-f

максимальный размер файла, созданного оболочкой.

-p

максимальный размер канального буфера.

-n

максимальное число открытых файловых дескрипторов.

-u

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

-v

максимальное количество виртуальной памяти, доступное процессу.

Если дан предел, зто - новое значение указанного источника. В противном случае выводится текущее значение указанного источника. Если не дана опция, предполагается -f. Значения -f - в 1024-байтовых блоках, исключение делается для -t (в секундах), -p (в единицах 512-байтных блоков), -n и -u (неизмеримые).

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 выключаются. Если здесь нет аргументов, позиционный параметр не изменяется.

При использовании + вместо - осуществляется выключение зтих флагов. Флаги также могут использоваться при вызове оболочки. Текущий набор флагов можно найти в $-. Оставшиеся N переменных - позиционные параметры и присваиваются по порядку $1, $2,...,$N. Если аргументы не даны, выводятся все переменные оболочки.

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', то:

$ cd/usr/sys; echo $PWD
/usr/sys
$ cd..; pwd
/usr
Если nolinks существует, то:
$ cd /usr/sys; echo $PWD
/usr/local/sys
$  cd ..; pwd /usr/local
См. также описание опции -p встроенной команды set, раздел 4.5.

4.7 Арифметика оболочки.

Арифметические вычисления.

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

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

-+

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

!~

логическое и поразрядное отрицания

*÷%

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

+ -

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

<< >>

левый и правый поразрядные сдвиги

<= >= < >

сравнение

==!=

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

&

поразрядное И

^

поразрядное исключительное ИЛИ

|

поразрядное ИЛИ

&&

логическое И

||

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

= *= ÷= %= += -= <<= >>= &= ^= |=

распределение по приоритету.

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

Константы, начинающиеся с 0, интерпретируются как восьмиричные числа. Начало 0x или 0X обозначает шестнадцатиричное число. Кроме того, числа в форме [основание#]n, когда основание - десятичное число от 2 до 36, представляющее арифметическое основание системы счисления, а n - число в зтой системе. Если основание не указано, подразумевается 10.

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

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

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

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

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

Арифметические встроенные команды.

let

let выражение [выражение]
Встроенная команда let позволяет выполнять арифметические действия над переменными оболочки. Каждое выражение вычисляется согласно приведенным ранее правилам (см. раздел 4.7.1). Если последнее вычисление равно 0, let возвращает 1, в противном случае - 0.

4.8 Контролирование приглашения.

Значение переменной $PROMPT_COMMAND проверяется непосредственно перед выдачей Bash каждого базового приглашения. Если оно задано и не ноль, то значение выводится, как если бы оно было напечатано на командной строке.

Приведенная таблица описывает специальные символы, которые могут появляться в переменной PS1:

\t

время в формате часы: минуты: секунды.

\d

Дата в формате день_недели месяц число.

\n

перевод строки.

\s

имя оболочки, базовое имя $0 (участок, следующий за конечным /)

\w

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

\W

базовое имя $PWD

\u

имя пользователя, под которым вы эарегистрированы

\h

hostname

\#

номер зтой команды

\!

номер истории зтой команды

\nnn

символ, соответствующий восьмиричному числу nnn

\$

если зффективный uid=0, то #, иначе $.

\\

обратная косая черта (backslash)

\[

начало последовательности невыводимых символов. Может использоваться для осуществления управления терминалом в приглашении.

\]

конец последовательности невыводимых символов.


Вперед Назад Содержание