Операционная система UNIX - страница 29

стр.


Таблица 1.7. Способы получения значения переменной

>$varЗначение var; ничего, если переменная var не определена
>${var}То же, но отделяет имя переменной var от последующих символов
>${var:-string}Значение var, если определено; в противном случае — string. Значение var при этом не изменяется
>${var:=string}То же, но если переменная var не определена, ей присваивается значение строки string
>${var:?string}Если переменная var не определена, выводится строка string и интерпретатор прекращает работу. Если строка string пуста, то выводится сообщение var: parameter not set
>${var:+string}Строка string, если переменная var определена, в противном случае — ничего

Приведем несколько примеров, используя команду echo:

>$ var=user1

>$ var1=user2

>$ echo $var1

>user2

>$ echo ${var}l

>user11

>$ echo ${var1:+"do you want to redefine var?"}

>do you want to redefine var?

Для нормальной работы в UNIX ряд переменных должен быть определен и зависит от тех приложений, с которыми вы работаете. Приведем несколько наиболее употребительных переменных:

ИмяОписаниеВозможное значение
НОМЕКаталог верхнего уровня пользователя/usr/'logname'[13]
PATHПоисковый путь/bin:/etc:/usr/bin:.
MAILИмя почтового ящика/usr/spool/mail/'logname'
TERMИмя терминалаansi
PS1Первичное приглашение shell#
PS2Вторичное приглашение shell>

Начальное окружение вашего сеанса устанавливается программой login(1) исходя из записей в файле паролей, и имеет следующий вид:

Переменная окруженияПоле файла паролей
HOME=домашний_каталог6
LOGNAME=зарегистрированное_имя1
PATH=/usr/bin:-
SHELL=интерпретатор_сеанса7
MAIL=/var/mail/зарегистрированное_имя1
TZ=временная_зонаопределено системой

Переменная НОМЕ в основном используется в команде cd, которая служит для перехода в каталог:

>$ pwd

>/u/usr

>$ cd some/new/directory

>$ pwd

>/u/usr/some/new/directorу

В результате текущим каталогом (команда pwd(1) выводит на терминал полное имя текущего каталога) становится /u/usr/some/new/directory. Вызов команды cd без параметра эквивалентен следующему вызову:

>$ cd $HOME

который вернет вас в домашний каталог.

Переменная PATH служит для поиска командным интерпретатором запускаемых на выполнение программ, если их имя не содержит пути. Например, при запуске программы:

>$ run

интерпретатор попытается найти файл run в каталогах пути поиска. В то же время при запуске программы run с указанием пути, переменная PATH использоваться не будет:

>$ ./run

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

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

Поиск запускаемых программ в текущем каталоге таит потенциальную опасность, поэтому для суперпользователя переменная PATH обычно инициализируется без '.'. Рассмотрим следующую ситуацию. Злоумышленник создает программу, наносящую вред системе (удаляющую файл паролей), помещает ее в каталог общего пользования, например в /tmp, открытый на запись всем пользователям системы, с именем ls. Известно, что в UNIX существует стандартная команда ls(1) (она обычно находится в каталоге /bin), выводящая на экран список файлов каталога. Допустим теперь, что администратор системы делает текущим каталог /tmp и хочет вывести список файлов данного каталога. Если текущий каталог ('.') расположен в пути поиска (переменной PATH) раньше каталога /bin, то выполнится программа, "подложенная" злоумышленником. Даже если текущий каталог указан последним в пути поиска, все равно существует вероятность, что вы захотите запустить команду, которая расположена в каталоге, не попавшем в переменную PATH, на самом деле вы можете запустить троянского коня.

Переменная MAIL определяет местоположение вашего почтового ящика, программы работы с электронной почтой используют эту переменную. Переменная MAIL инициализируется программой login(1).

Переменная TERM содержит имя терминала и используется программами для доступа к