Linux для пользователя - Виктор Костромин
Шрифт:
Интервал:
Закладка:
Текущий номер команды (порядковый номер выполняемой команды в рамках текущей сессии) может отличаться от номера данной команды в списке истории команд, поскольку последний включает в себя команды, которые были сохранены в файле истории команд.
После того, как значение переменной, определяющей подсказку, прочитано оболочкой, в нем могут быть произведены подстановки в соответствии с правилами расширения параметров, подстановок в именах команд и арифметических выражениях, а также разбиения слов (word splitting). Об этих правилах будет рассказано чуть ниже, в разд. 5.7.
Например, после выполнения команды (поскольку в строке имеется пробел, кавычки обязательны)
[root]# PS1="[[email protected]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
В таком случае все запускаемые из оболочки программы (в том числе вторичные экземпляры самой оболочки) будут иметь доступ к заданным таким образом переменным, т. е. могут вызывать их значения по именам.
5.7. Раскрытие выражений (expansion)
Когда оболочка получает какую-то командную строку на выполнение, она до начала выполнения команды осуществляет "грамматический разбор" полученной командной строки. Одним из этапов такого "разбора" является раскрытие или подстановка выражений (expansion). В bash имеется семь типов подстановки выражений:
• раскрытие скобок (brace expansion);
• замена знака тильды (tilde expansion);
• подстановка параметров и переменных;
• подстановка команд;
• арифметические подстановки (выполняемые слева направо);
• разделение слов (word splitting);
• раскрытие шаблонов имен файлов и каталогов (pathname expansion).
Все эти операции выполняются именно в том порядке, как они здесь перечислены. Рассмотрим их последовательно.
5.7.1 Раскрытие скобок
Раскрытие скобок проще всего пояснить на примере. Предположим, что нам нужно создать сразу несколько подкаталогов в каком-то каталоге, или поменять владельца сразу у нескольких файлов. Эти действия можно выполнить с помощью следующих команд:
[user]$ mkdir /usr/local/src/bash/{old,new,dist,bugs}
[root]# chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
В первом случае в каталоге /usr/local/src/bash/ будут созданы подкаталоги old, new, dist и bugs. Во втором случае владелец будет изменен у файлов /usr/ucb/ex /usr/lib/ex?.?* /usr/ucb/edit /usr/lib/ex?.?* /usr/ucb/ex /usr/lib/how_ex /usr/ucb/edit /usr/lib/how_ex
То есть для каждой пары скобок генерируются несколько отдельных строк (их число равно числу слов, стоящих внутри скобок) путем приписывания к каждому слову из скобок (спереди) того, что стоит перед скобкой, и приписывания в конец каждого полученного слова того, что стоит после скобки. Еще один пример: строка a{d,c,b}e при раскрытии скобок превращается в три слова "ade ace abe".
Раскрытие скобок выполняется до выполнения других видов подстановок в командной строке, причем все специальные символы, встречающиеся в командной строке, в том числе внутри скобок, сохраняются неизменными (они будут интерпретированы на следующих этапах анализа строки).
5.7.2 Замена тильды (Tilde Expansion)
Если слово начинается с символа тильды ('~'), все символы до первого слэша (или все символы, если слэша нет) трактуются как имя пользователя (login name).
Если это имя есть пустая строка (т. е. вслед за тильдой идет сразу слэш), то тильда заменяется на значение переменной HOME. Если значение переменной HOME не задано, тильда заменяется на полный путь к домашнему каталогу пользователя, запустившего оболочку.
Если вслед за знаком тильды (до слэша) стоит слово, совпадающее с именем одного из легальных пользователей, тильда и имя пользователя заменяются полным именем домашнего каталога этого пользователя. Если слово, следующее за тильдой, не является именем пользователя (и не пусто), то оно остается неизменным.
Если вслед за знаком тильды стоит ‘+’, эти два знака заменяются на полное имя текущего каталога (т. е. значение переменной PWD). Если за знаком тильды следует ‘-‘, подставляется значение переменой OLDPWD.
5.7.3 Подстановка параметров и переменных
Символ $ используется для обозначения операций подстановки параметров, подстановки команд и подстановок арифметических выражений. Выражение или имя, следующее за $, может быть заключено в скобки; что не обязательно, но удобно, так как позволяет отделить заменяемое выражение от следующих за ним слов или символов. Таким образом, чтобы в командной строке вызвать значение параметра (в частности, любой переменной), нужно вставить выражение вида ${parameter}.
Скобки необходимы только в том случае, если имя параметра состоит из нескольких цифр, или когда за именем следует символ, который не должен интерпретироваться как часть имени.
Все значения переменных подвергаются подстановке знака тильды, раскрытию параметров и переменных, подстановке команд, подстановкам арифметических выражений, а также удалению специальных символов цитирования (см. ниже). Разделение слов не производится, за исключением случая "[email protected]" (объяснение см. выше в табл. 5.3). Раскрытие шаблонов имен файлов и каталогов не производится.
5.7.4 Подстановка команд
Подстановка команд является очень мощным инструментов bash. Она заключается в замене имени команды на результат ее выполнения. Существует две формы подстановки команд:
$(command) и `command`
Если применяется вторая из этих форм, то обратный слэш внутри кавычек трактуется как литерал, кроме тех случаев, когда за ним следует $, `, или . Если же используется форма $(command), все символы внутри скобок составляют команду и ни один из них не считается специальным символом.
Если подстановка производится внутри двойных кавычек, то в результатах подстановки не осуществляется разделение слов и раскрытие шаблонов имен файлов и каталогов.
5.7.5 Арифметичеcкие подстановки (Arithmetic Expansion)
Арифметические подстановки позволяют вычислить значение арифметического выражения и подставить вместо него результат. Существует две формы задания арифметических подстановок:
$[expression]
$((expression)),
где expression трактуется так, как если бы оно было заключено в двойные кавычки, но встречающиеся в expression двойные кавычки трактуются как простой литерал. Внутри expression выполняются подстановки параметров и команд.