MyTetra Share
Делитесь знаниями!
Оболочка bash Предыдущий раздел
Время создания: 25.04.2013 21:42
Раздел: root - Linux - Console - bash
Запись: Yurons/mytetra/master/base/1366915368681pj41l12/text.html на raw.github.com

Глава 5. Оболочка bash Предыдущий раздел Оглавление Следующий раздел

 

5.6. Параметры и переменные. Окружение оболочки

 

Понятие параметра в оболочке bash подобно понятию переменной в обычных языках программирования. Именем (или идентификатором) параметра может быть слово, состоящее из алфавитных символов, цифр и знаков подчеркивания (только первый символ этого слова не может быть цифрой), а также число или один из следующих специальных символов: *, @, #, ?, - (дефис), $, !, 0, _ (подчеркивание).

 

Говорят, что параметр задан или установлен, если ему присвоено значение. Значением может быть и пустая строка. Чтобы вывести значение параметра, используют символ $ перед его именем. Так, команда

 

[user]$ echo name

 

выдаст на экран слово name, а команда

 

[user]$ echo $name

 

выдаст значение переменной name (если таковое, конечно, задано).

5.6.1 Разновидности параметров

 

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

 

Имена (идентификаторы) позиционных параметров состоят из одной или более цифр (только не из одиночного нуля). Значениями позиционных параметров являются аргументы, которые были заданы при запуске оболочки (первый аргумент является значением позиционного параметра 1, и т. д.). Изменить значение позиционного параметра можно с помощью встроенной команды set. Значения этих параметров изменяются также на время выполнения оболочкой одной из функций (об этом будет рассказано ниже, в разд. 5.8).

 

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

 

Таблица 5.2. Специальные параметры.

Параметр

Правила замены

 

*

Заменяется позиционными параметрами, начиная с первого. Если замена производится внутри двойных кавычек, то этот параметр заменяется на одно единственное слово, составленное из всех позиционных параметров, разделенных первым символом специальной переменной IFS (о ней будет сказано ниже). То есть ``$*'' эквивалентно ``$1c$2c...'', где c — первый символ в значении переменной IFS. Если IFS присвоено пустое значение или ее значение не установлено, параметры разделяются пробелами

 

@

Заменяется позиционными параметрами, начиная с первого. Если замена производится внутри двойных кавычек, то каждый параметр заменяется отдельным словом. Так, `` $@'' эквивалентно ''$1'' ''$2'' ... Если позиционных параметров нет, то значение не присваивается (параметр @ просто удаляется)

 

#

Заменяется десятичным значением числа позиционных параметров

 

?

Заменяется статусом выхода последнего из выполнявшихся на переднем плане программных каналов

 

-

 

(дефис)

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

 

$

Заменяется идентификатором процесса (PID) оболочки

 

!

Заменяется идентификатором процесса (PID) последней из выполняющихся фоновых (асинхронно выполнявшихся) команд

 

0

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

 

_

 

(подчеркивание)

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

 

 

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

 

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

 

[user]$ name=value

 

где name — имя переменной, а value — присваиваемое ей значение (может быть пустой строкой). Имя переменой может состоять только из цифр и букв и не может начинаться с цифры. Значением может быть любой текст. Если значение содержит специальные символы, то его надо взять в кавычки. Присвоенное значение этих кавычек не содержит, естественно. Если переменная задана, то ее можно удалить, используя встроенную команду оболочки unset.

 

Набор всех установленных переменных оболочки с присвоенными им значениями называется окружением (environment) или средой оболочки. Вы можете просмотреть его с помощью команды set без параметров (только, может быть, следует организовать конвейер "set | less"). В выводе этой команды все переменные окружения перечисляются в алфавитном порядке. Для того чтобы просмотреть значение одной конкретной переменной, можно вместо команды set (в выводе которой нужную переменную еще искать и искать) можно воспользоваться командой

 

[user]$ echo $name

 

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

 

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

 

[user]$ echo $RANDOM

 

вы каждый раз будете получать новое значение. Дело в том, что эта переменная возвращает случайное целое из интервала 0 — 32 768.

5.6.2 Приглашения оболочки

 

Одна из очень важных переменных имеет имя PS1. Эта переменная задает вид приглашения, которое bash выводит, когда ожидает ввода очередной команды пользователем. По умолчанию этой переменной присвоено значение "\s-\v\$ ". Вообще-то в bash существует четыре приглашения, которые используются в разных ситуациях. Переменная PS1 задает вид строки приглашения, которая выдается тогда, когда оболочка ждет ввода команды. Вторичное приглашение, задаваемое переменной PS2, появляется тогда, когда оболочка ожидает от пользователя ввода еще каких-то данных, необходимых для продолжения работы запущенной команды или программы. По умолчанию переменная PS2 имеет значение ">". Вы уже имели возможность видеть это приглашение, когда запускали команду cat для ввода данных с клавиатуры в файл. Другой пример — команда ftp, после запуска которой приглашение тоже принимает такой вид.

 

Приглашение, задаваемое переменной PS3, используется в команде select. Приглашение, задаваемое переменной PS4, выводится перед каждой командой, в то время, когда bash отслеживает процесс выполнения. Значение по умолчанию — "+".

 

Если у вас есть такое желание, вы можете изменить вид переменных PS1 и PS2. При этом можно использовать как любые символы, вводимые с клавиатуры, так и некоторое число специальных символов, которые при формировании строки приглашения декодируются в соответствии с табл. 5.3 (приводим только некоторые из них, для примера; полный список см. в man-странице по утилите bash).

 

Таблица 5.3. Специальные символы для формирования приглашения

Символ

Его значение

 

\a

Звуковой сигнал (ASCII-код 07)

 

\d

Дата в формате "День, месяц, число", например, Срд, Окт, 17.

 

\h

Имя хоста (hostname) до первой точки

 

\H

Полное имя хоста

 

\t

Текущее время в 24-часовом формате: HH:MM:SS (часы:минуты:секунды)

 

\T

Текущее время в 12-часовом формате: HH:MM:SS

 

\@

Текущее время в 12-часовом формате am/pm

 

\u

Имя пользователя, запустившего оболочку

 

\w

Полное имя текущего рабочего каталога (начиная с корня)

 

\W

Текущий рабочий каталог (без указания пути)

 

\$

Символ #, если оболочка запущена суперпользователем, и символ $, если оболочка запущена обычным пользователем.

 

\nnn

Символ, имеющий восьмеричный код nnn

 

\n

Новая строка (перевод строки)

 

\s

Имя оболочки

 

\#

Текущий номер команды

 

\\

Обратный слэш (a backslash)

 

\[

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

 

\]

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

 

\!

Порядковый номер данной команды в истории команд

 

 

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

 

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

 

Например, после выполнения команды (поскольку в строке имеется пробел, кавычки обязательны)

 

[root]# PS1="[\u@\h \W]\$"

 

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

5.6.3 Переменная PATH

 

Еще одна очень важная переменная имеет имя PATH. Она задает перечень путей к каталогам, в которых bash осуществляет поиск файлов (в частности, файлов с командами) в тех случаях, когда полный путь к файлу не задан в командной строке. Отдельные каталоги в этом перечне разделяются двоеточиями. По умолчанию переменная PATH включает каталоги /usr/local/bin, /bin, /usr/bin, /usr/X11R6/bin, т. е. имеет вид:

 

/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:

 

Для того, чтобы добавить каталог в этот список, нужно выполнить следующую команду:

 

[root]# PATH=$PATH:new_path.

 

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

 

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

5.6.4 Переменная IFS

 

Эта переменная задает разделители полей (Internal Field Separator), которые используются при операции разделения слов при преобразованиях командной строки, выполняемых оболочкой перед тем, как запустить командную строку на исполнение. Значение этой переменной по умолчанию — "<Пробел><Tab><Символ_новой_строки>".

5.6.5 Текущий и домашний каталоги

 

Имя текущего каталога сохраняется в переменной окружения (с именем PWD), и значение этой переменной изменяется при каждом запуске программы cd (а также при смене текущего каталога любым другим способом, например, через Midnight Commander).

 

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

5.6.6 Команда export

 

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

 

[user]$ name=value

 

надо записать

 

[user]$ export name=value

 

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

 
MyTetra Share v.0.59
Яндекс индекс цитирования