Читаем UNIX полностью

He все переменные имеют специальное значение для интерпретатора. Можно создавать новые переменные, присваивая им значения. По традиции переменные, имеющие специальное значение, обозначаются прописными буквами, а обычные переменные — строчными. Типичным примером использования переменных является хранение в них длинных строк, таких, как имена файлов:

$ pwd

/usr/you/bin

$ dir=`pwd`        Запомним, где находимся

$ cd /usr/mary/bin Перейдем в другое место

$ ln $dir/cx .     Используем переменную в имени файла

$ ...              Поработаем некоторое время

$ cd $dir          Вернемся

$ pwd

/usr/you/bin

$

Встроенная в интерпретатор команда set показывает значения всех определенных вами переменных. Для просмотра одной или двух переменных более подходит команда echo:

$ set

HOME=/usr/you

IFS=

PATH=:/usr/you/bin:/bin/:/usr/bin

PS1=$

PS2=>

dir=/usr/you/bin

$ echo $dir

/usr/you/bin

$

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

$ x=Hello Создание x

$ sh      Новый shell

$ echo $x Происходит только перевод строки,

 x не определено в порожденном интерпретаторе

$ ctl-d   Возврат в исходный интерпретатор

$ echo $x

Hello     x по-прежнему определено

$

Это означает, что в командном файле нельзя изменить значение переменной, поскольку выполнением командного файла управляет порожденный интерпретатор:

$ echo 'x="Good bye" Создание shell-файла из двух строк…

> echo $x' >setx     …для определения и печати x

$ cat setx

x="Good Bye"

echo $x

$ echo $x

Hello                x есть Hello в исходном интерпретаторе

$ sh setx

Good Bye             x есть Good Bye в порожденном интерпретаторе…

$ echo $x

Hello                …но по-прежнему есть Hello в текущем интерпретаторе

$

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

$ cat /usr/you/bin/games

PATH=$PATH:/usr/games Добавим /usr/games к PATH

$ echo $PATH

:/usr/you/bin:/bin:/usr/bin

$ . games

$ echo $PATH

:/usr/you/bin:/bin:/usr/bin:/usr/games

$

Поиск файла для команды '.' осуществляется с помощью переменной PATH, так что его можно поместить в ваш каталог bin.

Когда используется команда '.', только условно можно считать, что выполняется командный файл. Файл не "выполняется" в обычном смысле этого слова. Команды из него запускаются, как если бы вы ввели их в диалоговом режиме: стандартный входной поток интерпретатора временно переключается на файл. Поскольку файл читается, не нужно иметь право на его выполнение. Другое отличие состоит в том, что файл не получает аргументов командной строки; $1, $2 и т.д. являются пустыми строками. Было бы неплохо, если бы аргументы передавались, но этого не происходит.

Есть еще один способ установить значение переменной в порожденном интерпретаторе — присвоить его явно в командной строке перед самой командой:

$ echo 'echo $x' >echox

$ cx echox

$ echo $x

Hello Как и прежде

x не определено в порожденном интерпретаторе

$ x=Hi echox

Hi    Значение x передается порожденному интерпретатору

$

(Первоначально присваивания всюду в командной строке передавались команде, но это противоречило dd(1).)

Операцию '.' следует использовать, чтобы навсегда изменить значение переменной, тогда как присваивания в командной строке предназначены для временных изменений. В качестве примера рассмотрим еще раз поиск команд в каталоге /usr/games, не указанном в вашей переменной PATH:

$ ls /usr/games | grep fort

fortune Игровая команда fortune

$ fortune

fortune: not found

$ echo $PATH

:/usr/you/bin:/bin:/usr/bin /usr/games не входит в PATH

$ PATH=/usr/games fortune

Позвони в звонок; закрой книгу; задуй свечу.

$ echo $PATH

:/usr/you/bin:/bin:/usr/bin PATH не изменилось.

$ cat /usr/you/bin/games    команда games все еще здесь

$ . games

$ fortune

Непродуманная оптимизация - источник всех бед - Кнут

$ echo $PATH

Перейти на страницу:

Похожие книги

Полное руководство по Microsoft Windows XP
Полное руководство по Microsoft Windows XP

В книге известного американского автора описывается среда ОС Windows XP и принципы ее функционирования, приведен сравнительный анализ Windows XP с предшествующими версиями операционной системы Windows. Рассматриваются вопросы применения и модификации нового интерфейса с целью получения прямого доступа ко всем функциям Windows XP обсуждаются варианты подключения к компьютерным сетям. Несколько разделов посвящены работе с реестром и конфигурационными файлами, мультимедийным функциям и разнообразным системным службам, а также методам решения проблем с программным обеспечением и оборудованием. Особое внимание уделено обеспечению безопасности операционной системы.Издание адресовано пользователям и сетевым администраторам, желающим активно применять возможности операционной системы Windows XP (в том числе и недокументированные).

Джон Поль Мюллер , Питер Нортон

ОС и Сети, интернет / ОС и Сети / Книги по IT