Некоторые переменные среды
являются зарезервированными
словами, которые использует
интерпретатор shell. Их значения
устанавливаются, когда вы
регистрируетесь в системе. Другие
переменные используются
различными другими частями системы
UNIX. Имея под рукой полный список, вы
можете убедиться, что все
необходимые переменные определены.
Имена переменных могут
варьироваться в System V, BSD и XENIX. Здесь
приведены имена для System V.
Эти shell-переменные являются
частью среды вашего
регистрационного интерпретатора
shell. Они хранятся в виде символьных
строк, и если уж они установлены, от
них нельзя избавиться. Только
переустановка их значений на
пустые строки может исключить их
присутствие. Когда меняются
значения переменных, новые
значения локальны для текущего
интерпретатора shell до тех пор, пока
они не будут экспортированы.
CDPATH
Строка поиска,
определяющая, куда вы можете
перейти с помощью команды cd
HOME
Место хранения ваших
файлов в системном дереве
IFS
Внутренний
разделитель полей, который
определяет символы,
разделяющие слова между собой
LOGNAME
Ваше регистрационное
имя, определенное в /etc/passwd
MAIL
Определяет
местонахождение вашего
почтового ящика, чтобы вас
можно было оповестить о
поступлении вам новой почты
PATH
Определяет порядок и
имена каталогов для поиска
исполняемых модулей
PS1
Главная строка
подсказки, которая
отображается в качестве вашего
обычного приглашения
PS2
Вторичная строка
подсказки, которая
отображается, когда
интерпретатору shell нужен
дополнительный ввод
TERM
Строка, определяющая
ваш тип терминала
TERMCAP
Устанавливается либо
на файл описания терминала,
либо на запись этого файла
TZ
Зона времени,
понимаемая так, как описано в
ctime(3)
SHELL
Имя
shell-интерпретатора, который вы
запускаете
EXINIT
Строка инициализации
для редактора ex
ПРИЛОЖЕНИЕ 2.
ПОСЛЕДОВАТЕЛЬНОСТЬ ДЕЙСТВИЙ
ИНТЕРПРЕТАТОРА SHELL
Shell выполняет определенную
последовательность действий по
интерпретации команд для каждой
прочитанной им строки. Зная эту
последовательность, вы можете
изолировать многие проблемы на
соответствующем уровне. Иногда на
определенном шаге этой
последовательности могут
появиться странные вхождения
символов. Поэтому важно знать,
когда изменяются значения
переменных.
Один из примеров относится к
раскрытию имени файла и символу
звездочки. Shell НЕ раскрывает
метасимволы во время присвоения
значений. Оператор F=* означает в
действительности, что переменной F
присваивается один символ. Когда
выполняется шаг 7
последовательности действий,
звездочка раскрывается как
метасимвол имени файла,
превращаясь во все имена файлов в
текущем каталоге. Это можно
продемонстрировать на примере
команды "echo $F". Для того чтобы
сохранить литеральное значение
звездочки, вам нужно экранировать
ее, что защитит ее от шага 7.
Получается команда echo "$F". А
для того чтобы вообще подавить
значение переменной F, вам следует
исключить шаг 3 - подстановку
параметров. Указывая команду echo '$F',
вы печатаете буквы $F, а не значение
переменной F.
Далее эти шаги рассматриваются
более подробно. Когда вы
программируете на языке shell,
попытайтесь представить себе,
какой шаг вы используете для каждой
строки текста программы. Возможно,
вы путаете два-три шага между собой.
Зная порядок шагов, вы можете проще
определять эффект от действия
ваших команд и сокращать число
возможных ошибок.
Командная строка или
логическая конструкция
читается с терминала или из
файла данных. Чтение
останавливается при
обнаружении следующих
символов: точки с запятой (;),
символа фоновой задачи (&),
логического и (&&),
логического или (||) либо
символа новой строки (\n).
Выполняется разбор введенных
данных на слова с учетом
пробелов и табуляций.
Если в текущем интерпретаторе
shell установлен флаг
многословности (-v), то
прочитанная строка
отображается на стандартное
устройство регистрации ошибок.
Выполняется подстановка
параметров. Сюда входит
подстановка позиционных
параметров, подстановка
переменных и подстановка
специальных выражений.
Параметры всегда имеют префикс
в виде денежного знака ($).
Выполняется подстановка
команд. Это относится ко всем
командам, взятым в символы
ударения (`). Такая команда
вычисляется и выполняется, а
результирующий текст заменяет
исходное выражение в полной
командной строке. Выполняемая
команда может содержать
последовательные команды,
конвейеры или команды,
сгруппированные в скобках.
Любые лишние пробелы,
табуляции или символы новой
строки, появившиеся в
результате выполнения команды,
впоследствии удаляются при
обработке внутренних
разделителей полей. Если нужно
сохранить эти лишние символы,
примените двойные кавычки
вокруг всего выражения.
Проверяется переназначение
ввода-вывода. Если таковое
имеется, исходный дескриптор
файла (0, 1 или 2) закрывается, а
затем открывается повторно с
новым значением. Вновь
открытый дескриптор файла
занимает в файловом
вводе-выводе то же место, что и
закрытый файловый дескриптор.
Символы переназначения
удаляются из командной строки.
Поскольку командная строка
могла измениться по сравнению
со своим исходным состоянием в
результате подстановок, она
вновь разбирается на слова с
учетом переменной среды IFS. Эта
переменная содержит
разделители между полями,
которые отделяют слова друг от
друга в командной строке.
Каждый символ командной
строки, который занесен в IFS,
заменяется на пробел, чтобы
разграничить слова. Все
неэкранированные пробелы,
табуляции, символы новой
строки и нулевые аргументы
удаляются из командной строки.
Все экранированные значения
переменных защищены от
разбора, выполняемого в
соответствии с IFS. Для того
чтобы увидеть значение IFS,
введите такой конвейер команд:
echo
"<$IFS>" | od -bc
Далее shell ищет все слова, для
которых требуется раскрытие
имени файла (метасимвола).
Делается попытка сопоставить
образец с файлами текущего
каталога. Если подходящие
файлы найдены, они заменяют
выражение в командной строке.
Если соответствия не
обнаружено, метасимволы
остаются в этом выражении. Все
присвоения переменным
защищены от раскрытия
метасимволов. Типичным
примером является команда "ls
z*". Если имена каких-либо
файлов начинаются с буквы z, эти
имена перечисляются. В
противном случае печатается
сообщение "z* not found".
Если установлен флаг
трассировки выполнения (-x), то
командная строка отображается
на стандартное устройство
регистрации ошибок перед тем,
как она будет фактически
выполнена. Если это командная
строка, то она выводится с
префиксом "+", если же это
просто присвоение значения
переменной, префикса нет.
На этом шаге всем переменным
присваиваются значения, затем
в соответствии с переменной
среды PATH ищется
местонахождение команды.
Присвоение значений
переменным происходит справа
налево вдоль командной строки.
Поиск по переменной PATH,
наоборот, происходит слева
направо. Если имя найдено, то
полное маршрутное имя заменяет
вызов команды в командной
строке. Если переменная PATH
имеет пустое значение,
подразумевается текущий
каталог. Если в каком-либо
месте исходного имени команды
имеется косая черта (/), то
переменная PATH не
просматривается, а считается,
что указано полное маршрутное
имя.
Наконец, команда выполняется.
Если это встроенная команда,
текущий shell отрабатывает ее. В
противном случае делается
попытка загрузить команду в
память, как если бы это была
скомпилированная программа.
Если эта попытка успешна,
команда выполняется
посредством системного вызова
exec(2). Если загрузка команды не
удалась, то считается, что это
командный файл еще одного
интерпретатора shell, и
порождаемый shell читает этот
командный файл в качестве
своих данных.
ПРИЛОЖЕНИЕ 3. СПЕЦИАЛЬНЫЕ
СИМВОЛЫ SHELL-ПЕРЕМЕННЫХ
Приведенные здесь символы
рассматриваются shell-переменными
как специальные, так как они
означают завершение слова. Для того
чтобы использовать символ в его
обычном значении, а не в качестве
специальной функции, нужно
экранировать его обратной косой
чертой (\) или взять в одинарные
кавычки.
\b
Пробел: код 20
(шестнадцатеричный),
ограничитель слов
\n
Символ новой строки:
^j, код A (шестнадцатеричный),
ограничитель слов
\t
Табуляция: ^i, код 9,
ограничитель слов
;
Точка с запятой:
завершает программный
конвейер
(
Левая скобка:
ограничивает подчиненный shell
)
Правая скобка:
ограничивает подчиненный shell
|
Вертикальная черта,
или символ программного
конвейера: разделяет команды
^
Стрелка вверх, знак
вставки: старый символ,
используемый в качестве |
Амперсанд: вызывает
асинхронное (фоновое)
выполнение
{
Левая фигурная
скобка: очерчивает слово для
первоначального разбора слова
}
Правая фигурная
скобка: завершает знак
очерчивания слова
ПРИЛОЖЕНИЕ 4. СПЕЦИАЛЬНЫЕ
СИМВОЛЫ SHELL-ОПЕРАТОРОВ
Эти символы встречаются в
синтаксисе операторов языка shell. Их
следует рассматривать как
зарезервированные. Отдельные
символы могут использоваться
по-разному. Например, символ #
является комментарием в операторе,
а также может быть параметром, как в
записи $#, означающей количество
аргументов в командной строке.
&&
Двойной амперсанд:
выполнить список, если
программный конвейер
отработал успешно
||
Двойная вертикальная
черта: выполнить список в
случае неудачи программного
конвейера
`
Знак ударения:
перехватить стандартный вывод
в команде
*
При использовании в
качестве параметра
соответствует всем
позиционным параметрам;
является также символом
генерации имен файлов,
соответствующим любой строке
#
Комментарий до конца
строки; соответствует также
количеству позиционных
параметров в командной строке
?
При использовании в
качестве параметра
соответствует статусу
завершения последней
синхронно выполненной команды;
используется также при
генерации имен файлов и
означает при этом любой
одинарный символ
-
Обозначает флаги,
влияющие на функционирование
интерпретатора shell
$
Вводит заменяемые
параметры; соответствует также
идентификатору процесса
!
При использовании в
качестве параметра
соответствует идентификатору
процесса последнего фонового
задания; применяется также в
команде проверки, где означает
"не"
"
Двойная кавычка:
окаймляет символы и разрешает
производить подстановку
параметров
'
Одинарная кавычка:
окаймляет символы, но
запрещает подстановку
параметров
\
Обратная наклонная
черта: экранирует одиночный
символ, чтобы снять его
специальное значение
[]
Альтернативное
использование для вызова
команды проверки. Применяется
также при генерации имен
файлов, означая при этом
диапазон символов
@
Соответствует
каждому позиционному
параметру командной строки
>>
Дополнить
стандартный вывод
<<
Переназначить
стандартный ввод на вводимые
строки текста
&
Используется как
символ фонового процесса;
соответствует также
"файловому дескриптору",
если используется в
переадресации
ПРИЛОЖЕНИЕ 5. ВСТРОЕННЫЕ
ОПЕРАТОРЫ ЯЗЫКА SHELL
Перечисленные ниже команды
употребляются в программах на
языке shell. Здесь имеется в виду System V
Bourne shell.
В System V.2 - более новой версии System V -
интерпретатор shell имеет некоторые
дополнительные команды,
перечисленные в отдельном списке.
Имеется также интерпретатор ksh
(фактически это улучшенный Bourne shell),
обладающий возможностями
командных строк, характерными для
csh (Си-shell). Интерпретатор ksh здесь не
рассматривается.
ПРИМЕЧАНИЕ. Не позволяйте
команде exec сбить вас с толку. Это не
то же самое, что команда exec(2). Данная
команда exec обрабатывается
интерпретаторм shell, а exec(2) является
системным вызовом.
КОМАНДЫ System V Bourne Shell
.
Точка: запустить
данную команду из текущего
интерпретатора shell, а не из
порождаемого
:
Двоеточие: ничего не
делать, а только возвратить
успешный статус (0)
{}
Фигурные скобки:
запустить последовательный
список команд
break
Оборвать следующую
итерацию текущего цикла
case
Многократный выбор
if-then-else
cd
Сменить каталог
continue
Перейти на следующую
итерацию цикла for, while или until
eval
Выполнить еще раз
этап подстановки переменных
exec
Выполнить команду с
аргументами, перекрывая
текущий shell
exit
Остановить
выполнение текущего
командного файла
export
Отправить значение
переменной всем подчиненным
интерпретаторам shell
for
Управляющее слово в
цикле for-do-done
if
Управляющее слово в
последовательности if-then-else
newgrp
Изменить текущий
идентификатор группы
read
Одну строку
стандартного ввода присвоить
переменной в качестве значения
readonly
Объявить переменную
только для чтения, ее значение
изменять нельзя
set
Включение и
выключение флагов
конфигурации shell
shift
Убрать позиционный
параметр из командной строки
test
Вычислить
взаимосвязи между строками и
целыми числами
times
Печатать время работы
процессов, запущенных из shell
trap
Определить
обработчики прерываний для
конкретных сигналов
ulimit
Установить предел
размера файлов в 512-байтных
блоках
umask
Маска прав доступа к
файлам, используемая при их
создании
until
Управляющее слово в
цикле until-do-done
wait
Shell ждет завершения
указанных порожденных
процессов
while
Управляющее слово в
цикле while-do-done
ДОПОЛНИТЕЛЬНЫЕ КОМАНДЫ System V.2
hash
При поиске команд
использовать хэширование
name
Определить имя
shell-функции
pwd
Сообщить текущий
каталог; теперь это встроенная
команда для ускорения
return
Выйти из shell-функции и
возвратить значение
set -f
Запретить фазу
генерации имен файлов
set -h
Сохранить, а не
выполнять функциональные
команды, если они определены
type
Определить, каким
образом можно
интерпретировать имя в
качестве команды