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
$ sh
$ echo $x
x не определено в порожденном интерпретаторе
$ ctl-d
$ echo $x
Hello
$
Это означает, что в командном файле нельзя изменить значение переменной, поскольку выполнением командного файла управляет порожденный интерпретатор:
$ echo 'x="Good bye"
> echo $x' >setx
$ cat setx
x="Good Bye"
echo $x
$ echo $x
Hello
$ sh setx
Good Bye
$ echo $x
Hello
$
Однако бывают ситуации, когда было бы полезно изменять переменные интерпретатора в командном файле. Очевидным примером является файл, добавляющий новый каталог к вашей переменной PATH
'.' (точка), которая выполняет команды из файла в текущем, а не порожденном интерпретаторе. Первоначально это было задумано для удобства пользователей, чтобы они могли повторно выполнять свой файл .profile, не входя заново в систему, но в принципе это открывает и другие возможности:$ cat /usr/you/bin/games
PATH=$PATH:/usr/games
$ 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
$
(Первоначально присваивания всюду в командной строке передавались команде, но это противоречило dd(1)
Операцию '.'
/usr/games, не указанном в вашей переменной PATH:$ ls /usr/games | grep fort
fortune
$ fortune
fortune: not found
$ echo $PATH
:/usr/you/bin:/bin:/usr/bin
$ PATH=/usr/games fortune
Позвони в звонок; закрой книгу; задуй свечу.
$ echo $PATH
:/usr/you/bin:/bin:/usr/bin
$ cat /usr/you/bin/games
$ . games
$ fortune
Непродуманная оптимизация - источник всех бед - Кнут
$ echo $PATH