В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13 |
Язык 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.
Мы видим, что выдача устроена так, чтобы вновь быть поданной на вход командного интерпретатора.