Environment - это массив переменных, который наследуют вызываемые BASH программы. Это не все переменные, а только те, которые унаследовал сам BASH, и те созданные в BASH переменные, которым был присвоен признак "экспортируемых", либо принадлежащих исполняемой программе. К примеру, вывод даты, с применением английского языка системных сообщений, можно сделать так:
bash LANG=C date
где LANG - переменная, отвечающая за язык сообщений.
Атрибуты BASH, или флаги, включают особые режимы функционирования баша устанавливаются командой set.
Команда export и используется добавления переменных к environment. Переменные, созданные в BASH, не входят автоматически в environment. Однако это можно изменить с помощью команды set.
Экспортировать можно как переменные, так и функции (-f). В принципе, команда export не нужна, так как вместо нее можно использовать declare -x.
Чтобы изъять переменную из environment, нужно использовать
export -n var
Командыdeclare, typeset. typeset -- устаревшее, но разрешенное название declare. Используйте это название, если хотите обеспечить с совместимоть с Korn shell. Без аргументов выводит значения всех переменных. Если вызвана таким образом из скрипта, ведет себя довольно странно: сначала выводит текст скрипта, предшествующий команде set, затем все переменные, а затем (?) текст скрипта, следующий за командой.
Если нет аргументов, но указаны опции, выводит определения переменных, имеющих такие опции, а именно:
-a – массивы;
-f – функции;
-i – целые числа;
-r – только для чтения;
-x – экспортируемые.
Если есть аргументы, то создаются переменные с указанными опциями или изменяются опции существующих. Если опция указана со знаком " +" вместо "-", она удаляется. Переменным попутно можно присвоить значения. Пример:
declare -irx MAGIC_NUMBER=666
создает переменную MAGIC_NUMBER, которую нельзя изменять, которая всегда будет рассматриваться как целое число, и которая автоматически добавляется к environment , как если бы была выполнена команда export. Кроме того, переменной присваивается значение.
Экспортировать и делать только для чтения можно не только переменные, но и функции (-f).
Внутри функций declare создает локальные переменные, аналогично local. В ksh (и в нек. реализациях sh?), не имеющем команды local, для создания локальных переменных можно использовать синоним declare typeset.
Опция опция -p показывает атрибуты переменной или всех переменных, если переменная не указана.
declare -r
выведет:
declare -ri EUID="42"
declare -ri PPID="1"
declare -ri UID="42",
однако, просто declare выведет переменные без указания их признаков. Зато:
export -p
работает так, как можно было бы ожидать от declare –p.
Команда readonly. Делает переменную или функцию (-f) read only или выводит список таких переменных (-p) . Аналогичную вещь делает 'declare -r', так что эта команда лишняя.
Команда unset. Отменяет определение переменной или функции (-f).
Команда set. Опции, переданные set, устанавливают атрибуты самого BASH. Если вместо "-" перед атрибутом идет "+", атрибут сбрасывается. Если есть аргументы, set присваивает их позиционным параметрам $1, $2 и т. д.
Без опций и аргументов выводит все переменные. Если вызвана таким образом из скрипта, ведет себя довольно странно, как и команда declare. Атрибуты могут задаваться в короткой или длинной форме. В длинной форме ? через опцию -o. Опция -o без параметров выводит значения всех атрибутов. Конструкция:
set -o
выведет:
allexport on
braceexpand on
emacs on
errexit off
histexpand on
ignoreeof off
interactive-comments on
monitor off
noclobber off
noexec off
noglob off
nohash off
nounset off
physical off
posix off
privileged off
verbose off
vi off
xtrace off
Интересные атрибуты:
· emacs (нет короткого названия) - расширенные возможности редактирования. В интерактивных шеллах установлена по умолчанию;
· vi (нет короткого названия) - возможности редактирования, аналогичные командам vi;
· a (allexport) - автоматический экспорт всех переменных;
· e (errexit) - прекращать работу, если команда, не входящая в группу, или группа команд возвратила ненулевое значение. При прекращении работы не выдается никаких сообщений;
· f (noglob) - запрещает обрабатывать маски (*, ? и т. д.);
· h (hashall) - запоминать пути к выполненным командам (по умолчанию);
· n (noexec) - не выполнять команды, только проверить их правильность;
· v (verbose) - аналог echo on в DOS;
· x (xtrace) - расширенный аналог verbose;
· n (nounset) - рассматривать использование неопределенной переменной как ошибку;
· C (noclobber) - см. про переменную noclobber;
· P (physical) - при смене текущей директории на линк, делать именем текущей директории не имя линка, а имя физической директории;
· "-" - если за этим ничего не следует, unset позиционные параметры.