Опубликован: 15.06.2004 | Уровень: специалист | Доступ: платный
Лекция 2:

Язык shell

Служебные переменные языка shell

Значения некоторых переменных устанавливаются самим языком shell. Перечислим эти переменные и опишем их предназначение.

#

Количество фактических аргументов (десятичное).

-

Флаги (однобуквенные опции ), указанные при запуске shell или установленные посредством команды set (см. далее).

?

Десятичное значение, возвращенное предыдущей синхронно выполненной командой.

$

Идентификатор процесса, в рамках которого выполняется shell.

!

Идентификатор последнего асинхронно запущенного процесса.

*, @

Совокупность всех фактических аргументов (начиная с $1 ), разделенных пробелами.

Напомним: чтобы получить значения этих переменных, перед ними нужно поставить знак $.

Значения $@ и $* имеют некоторые тонкие различия, на которых мы, однако, останавливаться не будем.

Несколько усложним процедуру three_args, чтобы продемонстрировать только что описанные возможности (см. листинг 2.15).

echo Идентификатор текущего процесса: $$
echo Имя команды: $0
echo Число фактических аргументов: $#
echo Совокупность всех аргументов: $@
echo Значение первого аргумента: $1
echo Значение второго аргумента: $2
echo Значение третьего аргумента: $3
Листинг 2.15. Усовершенствованная shell-процедура three_args.

Теперь, вызывая усовершенствованную процедуру three_args, выполним командную строку

three_args arg1 . - arg4

Тогда на экране появится примерно следующее (см. листинг 2.16):

Идентификатор текущего процесса: 3882
Имя команды: three_args
Число фактических аргументов: 4
Совокупность всех аргументов: arg1 . - arg4
Значение первого аргумента: arg1
Значение второго аргумента: .
Значение третьего аргумента: -
Листинг 2.16. Результат вызова усовершенствованной процедуры three_args.

Окружение процессов

Окружение - это набор пар (имя, значение), который передается выполняемой программе так же, как и обычный список аргументов. Иными словами, порождаемые процессы наследуют окружение процесса-предка. Компонентами окружения являются, помимо прочих, следующие переменные и их значения:

HOME

Подразумеваемый аргумент утилиты смены текущего каталога cd - домашний каталог пользователя.

IFS

Цепочка символов, где перечислены разделители полей; обычно включает пробел, табуляцию и перевод строки.

PATH

Список имен каталогов для поиска команд. В дальнейшем подобные списки называются списками поиска. Элементы списка разделяются двоеточием. Пустой элемент означает текущий каталог.

PS1

Основное приглашение интерактивного языка shell (по умолчанию " $ ").

TERM

Тип пользовательского терминала.

TZ

Информация о часовом поясе.

Для отсылки информации об окружении на стандартный вывод следует воспользоваться командой

env

Поясним подробнее смысл некоторых переменных окружения.

Прежде чем выполнить команду, shell ищет файл с соответствующим именем в последовательности каталогов, являющейся значением переменной PATH. Назовем подобную последовательность списком поиска. Если, например, значение $PATH суть

/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin

то нужный файл будет сначала разыскиваться в каталоге /usr/local/bin, затем в /bin и т.д. Как только файл отыщется, поиск прекратится. Это важно, если в разных каталогах есть одноименные выполнимые файлы.

Значение $IFS влияет не только на разбор команд, но и на чтение строк данных с помощью команды read (см. далее). Кроме того, первый символ из значения $IFS вставляется между фактическими аргументами при выполнении подстановки $*.

Переменная TERM хранит тип терминала пользователя. Интерактивные утилиты (редакторы или другие программы с экранным интерфейсом, например talk ) с помощью значения $TERM настраиваются на конкретный тип терминала.

Переменная TZ задает локальный часовой пояс. Эта информация необходима всегда, когда требуется показать текущее время. Особенно полезна она при почтовом взаимодействии с территориально удаленными (в частности, зарубежными) пользователями.

Для изменения окружения мало присвоить новое значение соответствующей переменной. Дело в том, что по умолчанию переменные считаются локальными по отношению к shell-процедуре, т. е. присваивание изменит локальную переменную, но не затронет одноименную переменную окружения. Таким образом, в окружение новых процессов (порожденных, например, для выполнения последующих команд данной shell-процедуры) войдет переменная со старым значением.

С помощью конструкции

export  имя[=слово]

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

Следующая строка иллюстрирует типичное применение команды export:

export PATH=/local/bin:$PATH

Переменная PATH изменилась, и новое значение экспортировано в окружение.

Команда

export -p

выдает на стандартный вывод имена и значения всех экспортированных переменных. Эту выдачу можно использовать для сохранения и последующего восстановления (быть может, с некоторыми модификациями) окружения. Ниже приведен фрагмент возможного результата работы команды export -p (см. листинг 2.17).

export HISTSIZE="1000"
export HOME="/home/galat"
export LANG="C"
export LESSCHARSET="koi8-r"
export LOGNAME="galat"
export MAIL="/var/spool/mail/galat"
export TTY="/dev/ttyS4"
export USER="galat"
Листинг 2.17. Возможные результаты выполнения команды export -p.

Мы видим, что выдача устроена так, чтобы вновь быть поданной на вход командного интерпретатора.

Антон Коновалов
Антон Коновалов

В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13
Планируется ли актуализация материалов данного очень полезного курса?

Ирина Воскресенская
Ирина Воскресенская
Россия, Москва, НИЯУ МИФИ
Максим Баранов
Максим Баранов
Россия