Главная - Windows
Linux все переменные окружения работающего процесса. М.Гаррельс

Оригинал: Linux Fundamentals
Автор: Paul Cobbaut
Дата публикации: 16 октября 2014 г.
Перевод: А.Панин
Дата перевода: 13 декабря 2014 г.

Глава 12. Переменные командной оболочки

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

Символ доллара ($)

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

Ниже приведено несколько примеров использования переменных $HOSTNAME, $USER, $UID, $SHELL и $HOME. $ echo Это командная оболочка $SHELL Это командная оболочка /bin/bash $ echo Данная командная оболочка $SHELL используется на компьютере $HOSTNAME Данная командная оболочка /bin/bash используется на компьютере RHELv4u3.localdomain $ echo Идентификатор пользователя $USER равен $UID Идентификатор пользователя paul равен 500 $ echo Моей домашней директорией является директория $HOME Моей домашней директорией является директория /home/paul

Зависимость от регистра

В данном примере показано, что имена переменных командной оболочки зависят от регистра! $ echo Привет $USER Привет paul $ echo Привет $user Привет

Создание переменных

В данном примере осуществляется создание переменной $MyVar с последующей установкой ее значения. После этого в примере используется команда echo для проверки значения созданной переменной. $ MyVar=555 $ echo $MyVar 555 $

Кавычки

Обратите внимание на то, что двойные кавычки также позволяют осуществлять раскрытие переменных в строке команды, в то время, как одинарные кавычки позволяют предотвратить такое раскрытие. $ MyVar=555 $ echo $MyVar 555 $ echo "$MyVar" 555 $ echo "$MyVar" $MyVar

Командная оболочка bash будет заменять переменные на их значения в строках, помещенных в двойные кавычки, но не будет осуществлять такую замену в строках, помещенных в одинарные кавычки. paul@laika:~$ city=Burtonville paul@laika:~$ echo "Сейчас мы находимся в городе $city." Сейчас мы находимся в городе Burtonville. paul@laika:~$ echo " Сейчас мы находимся в городе $city." Сейчас мы находимся в городе $city.

Команда set

Вы можете использовать команду set для вывода списка переменных окружения. В системах Ubuntu и Debian команда set также выведет список функций командной оболочки после списка переменных командной оболочки. Поэтому для ознакомления со всеми элементами списка переменных окружения при работе с данными системами рекомендуется использовать команду set | more .

Команда unset

Следует использовать команду unset для удаления переменной из вашего окружения командной оболочки. $ MyVar=8472 $ echo $MyVar 8472 $ unset MyVar $ echo $MyVar $

Переменная окружения $PS1

Переменная окружения $PS1 устанавливает формат приветствия вашей командной оболочки. При вводе строки форматирования вы можете использовать обратный слэш для экранирования таких специальных символов, как символ \u , предназначенный для вывода имени пользователя, или \w , предназначенный для вывода имени рабочей директории. На странице руководства командной оболочки bash представлен полный список специальных символов.

В примере ниже мы несколько раз изменяем значение переменной окружения $PS1 . paul@deb503:~$ PS1=приглашение приглашение приглашениеPS1="приглашение " приглашение приглашение PS1="> " > > PS1="\u@\h$ " paul@deb503$ paul@deb503$ PS1="\u@\h:\W$" paul@deb503:~$

Для того, чтобы избежать неисправимых ошибок, вы можете использовать зеленый цвет для приглашений командной оболочки, выводимых обычным пользователям, и красный цвет для приглашений командной оболочки, выводимых пользователю root. Добавьте следующие строки в ваш файл.bashrc для использования зеленого цвета в приглашениях, выводимых обычным пользователям. # цветное приглашение командной оболочки, созданное paul RED="\[\033" WHITE="\[\033" GREEN="\[\033" BLUE="\[\033" export PS1="${debian_chroot:+($debian_chroot)}$GREEN\u$WHITE@$BLUE\h$WHITE\w\$ "

Переменная окружения $PATH

Переменная окружения $PATH устанавливает директории файловой системы, в которых командная оболочка ищет бинарные файлы, необходимые для исполнения команд (за исключением тех случаев, когда команда является встроенной или представлена псевдонимом команды). Данная переменная содержит список путей к директориям с символами двоеточия в качестве разделителей. [$ echo $PATH /usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:

Командная оболочка не будет осуществлять поиск бинарных файлов, которые могут быть исполнены, в текущей директории. (Функция поиска исполняемых файлов в текущей директории являлась простейшим механизмом несанкционированного доступа к данным, хранящимся на компьютерах под управлением PC-DOS). В том случае, если вы хотите, чтобы командная оболочка осуществляла поиск исполняемых файлов в текущей директории, вам следует добавить символ. в конец строки, являющейся значением переменной $PATH вашей командной оболочки. $ PATH=$PATH:. $ echo $PATH /usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:. $

Значение переменной $PATH вашей командной оболочки может отличаться в случае использования команды su вместо команды su - , так как последняя команда позволяет дополнительно использовать значения переменных окружения целевого пользователя. К примеру, в представленный значением переменной $PATH список директорий пользователя root обычно добавляются директории /sbin . $ su Password: # echo $PATH /usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin # exit $ su - Password: # echo $PATH /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin: #

Команда env

Команда env в случае использования без параметров выведет список экспортированных переменных окружения. Отличие данной команды от команды set с параметрами заключается в том, что команда set выводит список всех переменных окружения, включая те переменные, которые не экспортируются в дочерние командные оболочки.

Кроме того, команда env может также использоваться для запуска "чистой" командной оболочки (командной оболочки без наследования какого-либо окружения). Команда env -i позволяет очистить окружение дочерней командной оболочки.

При рассмотрении данного примера следует обратить внимание на то, что командная оболочка bash установит значение переменной окружения $SHELL при запуске. $ bash -c "echo $SHELL $HOME $USER" /bin/bash /home/paul paul $ env -i bash -c "echo $SHELL $HOME $USER" /bin/bash $

Вы можете использовать команду env для установки значения переменной $LANG или любой другой переменной окружения одного экземпляра командной оболочки bash в рамках одной команды. В примере ниже данная возможность используется для демонстрации влияния значения переменной $LANG на работу механизма поиска файлов по шаблонам (для получения дополнительной информации о данном механизме следует обратиться к главе, посвященной поиску файлов по шаблонам). $ env LANG=C bash -c "ls File" Filea Fileb $ env LANG=en_US.UTF-8 bash -c "ls File" Filea FileA Fileb FileB $

Команда export

Вы можете экспортировать переменные командной оболочки в другие командные оболочки с помощью команды export . В примере ниже с помощью данной команды осуществляется экспорт переменной окружения в дочерние командные оболочки. $ var3=три $ var4=четыре $ export var4 $ echo $var3 $var4 три четыре $ bash $ echo $var3 $var4 четыре

При этом с помощью данной команды переменная не экспортируется в родительскую командную оболочку (ниже приведено продолжение предыдущего примера). $ export var5=пять $ echo $var3 $var4 $var5 четыре пять $ exit exit $ echo $var3 $var4 $var5 три четыре $

Разграничения переменных

До текущего момента мы сталкивались с тем, что командная оболочка bash интерпретирует переменную начиная с символа доллара, продолжая интерпретацию до появления первого не алфавитно-цифрового символа, который не является символом подчеркивания. В некоторых ситуациях такое поведение может оказаться проблемой. Для решения этой проблемы могут использоваться фигурные скобки таким образом, как показано в примере ниже. $ prefix=Super $ echo Привет $prefixman и $prefixgirl Привет и $ echo Привет ${prefix}man и ${prefix}girl Привет Superman и Supergirl $

Несвязанные переменные

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

Однако, существует параметр командной оболочки nounset , который вы можете использовать для генерации ошибки в том случае, если используемой переменной не существует. paul@laika:~$ set -u paul@laika:~$ echo $Myvar bash: Myvar: unbound variable paul@laika:~$ set +u paul@laika:~$ echo $Myvar paul@laika:~$

В командной оболочке bash команда set -u идентична команде set -o nounset и, по аналогии, команда set +u идентична команде set +o nounset .

Практическое задание: переменные командной оболочки

2. Создайте переменную answer , значение которой равно 42.

3. Скопируйте значение переменной $LANG в значение переменной $MyLANG.

4. Выведите список используемых в данное время переменных командной оболочки.

5. Выведите список всех экспортируемых переменных командной оболочки.

6. Присутствует ли информация о вашей переменной в выводе команд env и set ?

7. Уничтожьте вашу переменную answer .

8. Создайте две переменные и экспортируйте одну из них.

9. Выведите значение экспортированной переменной в дочерней интерактивной командной оболочке.

10. Создайте переменную и присвойте ей значение "Dumb", после чего аналогичным образом создайте другую переменную с значением "do". Используйте команду echo и две созданные переменные для вывода слова "Dumbledore".

11. Найдите список экранированных с помощью обратного слэша управляющих символов на странице руководства командной оболочки bash. Добавьте управляющий символ в значение переменной PS1 для вывода времени в приветствии командной оболочки.

Корректная процедура выполнения практического задания: переменные командной оболочки

1. Используйте команду echo для вывода строки "Привет", после которой должно следовать ваше имя. (Используйте переменную командной оболочки bash!)

Переменные окружения в Linux - это специальные переменные, определенные оболочкой и используемые программами во время выполнения. Они могут определяться системой и пользователем. Системные переменные окружения Linux определяются системой и используются программами системного уровня.

Например, команда PWD использует системную переменную, чтобы сохранять прежнюю рабочую директорию. Пользовательские переменные окружения устанавливаются пользователем, для текущей оболочки, временно или постоянно. Вся концепция добавления и удаления переменных оболочки крутится вокруг нескольких файлов, команд и различных оболочек.

Если смотреть более широко, переменная окружения может быть трех типов:

1. Локальные переменные окружения

Эти переменные определены только для текущей сессии. Они будут безвозвратно стерты после завершения сессии, будь то удаленный доступ или эмулятор терминала. Они не хранятся ни в каких файлах, а создаются и удаляются с помощью специальных команд.

2. Пользовательские переменные оболочки

Эти переменные оболочки в Linux определяются для конкретного пользователя и загружаются каждый раз когда он входит в систему при помощи локального терминала, или же подключается удаленно. Такие переменные, как правило, хранятся в файлах конфигурации: .bashrc, .bash_profile, .bash_login, .profile или в других файлах, размещенных в директории пользователя.

3. Системные переменные окружения

Эти переменные доступны во всей системе, для всех пользователей. Они загружаются при старте системы из системных файлов конфигурации: /etc/environment, /etc/profile, /etc/profile.d/ /etc/bash.bashrc.

Конфигурационные файлы переменных окружения Linux

Здесь мы кратко рассмотрим различные конфигурационные файлы, перечисленные выше, которые используются для настройки переменных окружения для всей системы или конкретного пользователя.

.bashrc

Это файл переменных конкретного пользователя. Загружается каждый раз, когда пользователь создает терминальный сеанс, то есть проще говоря, открывает новый терминал. Все переменные окружения, созданные в этом файле вступают в силу каждый раз когда началась новая терминальная сессия.

.bash_profile

Эти переменные вступают в силу каждый раз когда пользователь подключается удаленно по SSH. Если этот файл отсутствует система будет искать.bash_login или.profile.

/etc/environment

Этот файл для создания, редактирования и удаления каких-либо переменных окружения на системном уровне. Переменные окружения, созданные в этом файле доступны для всей системы, для каждого пользователя и даже при удаленном подключении.

/etc/bash.bashrc

Системный bashrc. Этот файл выполняется для каждого пользователя, каждый раз когда он создает новую терминальную сессию. Это работает только для локальных пользователей, при подключении через интернет, такие переменные не будут видны.

/etc/profile

Системный файл profile. Все переменные из этого файла, доступны любому пользователю в системе, только если он вошел удаленно. Но они не будут доступны, при создании локальной терминальной сессии, то есть если вы просто откроете терминал.

Все переменные окружения Linux созданные с помощью этих файлов, могут быть удаленны всего лишь удалением их оттуда. Только после каждого изменения, нужно либо выйти и зайти в систему, либо выполнить эту команду:

source имя_файла

Добавление пользовательских и системных переменных окружения в Linux

Теперь, когда вы знаете немного теории, перейдем к практике. Локальные переменные окружения в Linux можно создавать следующими командами:

var=значение
$ export var=значение

Эти переменные будут доступны только для текущей терминальной сессии.

Для удаления переменных окружения можно использовать несколько команд:

1. Использование env

По умолчанию с помощью env можно посмотреть все установленные переменные среды. Но с опцией -i она позволяет временно удалить все переменные оболочки и выполнить команду без переменных.

env –i команда

Var - это любая переменная, которую вы хотите передать этой команде.

Такая команда запустит оболочку вообще без переменных окружения:

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

2. Использование unset

Это другой способ удаления переменных окружения Linux. Unset удаляет переменную по имени до конца текущей сессии:

unset имя_переменной

3. Установить значение переменной в ""

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

Замечание: С помощью таких способов вы можете изменять значения системных или пользовательских переменных, но они будут актуальны только для текущего сеанса.

Создание пользовательских и системных переменных окружения

В этом разделе рассмотрим как установить и удалить системные и пользовательские переменные не только для текущего сеанса, а так чтобы эффект сохранялся после перезагрузки.

1. Устанавливаем и удаляем локальные переменные в Linux

Давайте создадим локальную переменную VAR и установим ей любое значение, затем удалим ее с помощью unset и убедимся что она удалена:

VAR1="Losst"
$ echo $VAR1
$ unset VAR1
$ echo $VAR1

Другой способ создать переменную - команда export. Удалим ее присвоив пустое значение:

export VAR="Losst"
$ echo $VAR
$ VAR=
$ echo $VAR

Теперь создадим переменную VAR2 также зададим ей значение. А потом временно удалим все локальные переменные выполнив env -i. Она запустит оболочку без каких-либо переменных. После ввода exit все переменные будут восстановлены.

VAR2="Losst"
$ echo $VAR2
$ env -i bash
$ echo $VAR2

Установка и удаление пользовательских переменных

Отредактируйте файл.bashrc, в вашей домашней директории, добавив команду export, для экспортирования нужной переменной. Затем выполните команду source для применения изменений. Создадим, например, переменную CD:

Добавьте такую строчку (o, затем вставить, затем Esc и:wq):

export CD="This is Losst Home"

Теперь осталось обновить конфигурацию:

source .bashrc
$ echo $CD

Для удаления этой переменной просто удалите ее из.bashrc.

Теперь добавим переменную окружения с помощью.bash_profile. Эта переменная, как вы уже знаете будет доступна только при удаленном входе:

vi .bash_profile

Добавьте строчку:

export VAR2="This is Losst Home"

И выполните эти команды, чтобы применить изменения и проверить добавление переменной:

source .bash_profile
$ echo $VAR2

Переменная недоступна, так как вы создали локальную терминальную сессию, теперь подключитесь по ssh:

ssh user@localhost
$ echo $VAR2

Удалить эту переменную окружения можно так же как и в предыдущем случае, удалив ее из файла.

Замечание: Эти переменные доступны всегда, но не для всех пользователей.

Установка и удаление системных переменных окружения

Создадим переменную, доступную для всех пользователей, во всех терминальных сессиях, кроме удаленных, добавлением ее в /etc/bash.profile:

vi /etc/bash.profile

export VAR="This is system-wide variable"

Затем обновляем:

source /etc/bash.bashrc

Теперь эта переменная доступна для всех пользователей, во всех терминалах:

echo $VAR
$ sudo su
$ echo $VAR
$ su -
$ echo $VAR

Если вы хотите сделать переменную окружения доступной для всех пользователей, которые подключаются к этой машине удаленно, отредактируйте файл /etc/profile:

export VAR1="This is system-wide variable for only remote sessions"

Обновите конфигурацию, и проверьте доступность переменной, она будет доступна только удаленно:

source /etc/profile
$ echo $VAR1

Если нужно добавить переменную окружения в Linux, так чтобы она была доступна и удаленно, и для локальных сессий, экспортируйте ее в /etc/environment:

vi /etc/environment

export VAR12="I am available everywhere"

Проверяем:

source /etc/environment
$ echo $VAR12
$ sudo su
$ echo $VAR12
$ exit
$ ssh localhost
$ echo $VAR12

Понятие параметра в оболочке bash подобно понятию переменной в обычных языках программирования. Именем (или идентификатором) параметра может быть слово, состоящее из алфавитных символов, цифр и знаков подчеркивания (только первый символ этого слова не может быть цифрой), а также число или один из следующих специальных символов: * , @ , # , ? , - (дефис), $ , ! , 0 , _ (подчеркивание).

Говорят, что параметр задан или установлен, если ему присвоено значение. Значением может быть и пустая строка. Чтобы вывести значение параметра, используют символ $ перед его именем. Так, команда

$ echo name

выдаст на экран слово name , а команда

$ echo $name

выдаст значение переменной name (если таковое, конечно, задано).

5.6.1 Разновидности параметров

Параметры разделяются на три класса: позиционные параметры, специальные параметры (именами которых как раз и служат перечисленные только что специальные символы) и переменные оболочки .

Имена (идентификаторы) позиционных параметров состоят из одной или более цифр (только не из одиночного нуля). Значениями позиционных параметров являются аргументы, которые были заданы при запуске оболочки (первый аргумент является значением позиционного параметра 1, и т. д.). Изменить значение позиционного параметра можно с помощью встроенной команды set . Значения этих параметров изменяются также на время выполнения оболочкой одной из функций (об этом будет рассказано ниже, вразд. 5.8 ).

Специальные параметры являются шаблонами, замена (подстановка) которых производится следующим образом.

Таблица 5.2. Специальные параметры.

Параметр

Правила замены

Заменяется позиционными параметрами, начиная с первого. Если замена производится внутри двойных кавычек, то этот параметр заменяется на одно единственное слово, составленное из всех позиционных параметров, разделенных первым символом специальной переменной IFS (о ней будет сказано ниже). То есть ``$*"" эквивалентно ``$1c$2c..."", где c — первый символ в значении переменной IFS. Если IFS присвоено пустое значение или ее значение не установлено, параметры разделяются пробелами

Заменяется позиционными параметрами, начиная с первого. Если замена производится внутри двойных кавычек, то каждый параметр заменяется отдельным словом. Так, `` $@"" эквивалентно ""$1"" ""$2"" ... Если позиционных параметров нет, то значение не присваивается (параметр @ просто удаляется)

Заменяется десятичным значением числа позиционных параметров

Заменяется статусом выхода последнего из выполнявшихся на переднем плане программных каналов

(дефис)

Заменяется текущим набором значений флагов, установленных с помощью встроенной команды set или при запуске самой оболочки

Заменяется идентификатором процесса(P ID) оболочки

Заменяется идентификатором процесса (P ID) последней из выполняющихся фоновых (асинхронно выполнявшихся) команд

Заменяется именем оболочки или запускаемого скрипта. Если bash запускается для выполнения командного файла, $0 равно имени этого файла. В противном случае это значение равно полному пути к оболочке

(подчеркивание)

Заменяется последним аргументом предыдущей из выполнявшихся команд (если это параметр или переменная, то подставляется ее значение)

Специальные параметры, перечисленные в приведенной выше таблице, отличаются тем, что на них можно только ссылаться; присваивать им значения нельзя.

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

$ name=value

где name — имя переменной, а value — присваиваемое ей значение (может быть пустой строкой). Имя переменой может состоять только из цифр и букв и не может начинаться с цифры. Значением может быть любой текст. Если значение содержит специальные символы, то его надо взять в кавычки. Присвоенное значение этих кавычек не содержит, естественно. Если переменная задана, то ее можно удалить, используя встроенную команду оболочки unset .

Набор всех установленных переменных оболочки с присвоенными им значениями называется окружением (enviro nment) или средой оболочки. Вы можете просмотреть его с помощью команды set без параметров (только, может быть, следует организовать конвейер "set | less" ). В выводе этой команды все переменные окружения перечисляются в алфавитном порядке.Для того чтобы просмотреть значение одной конкретной переменной, можно вместо команды set (в выводе которой нужную переменную еще искать и искать) можно воспользоваться командой

$ echo $name

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

Среди переменных, которые вы увидите в выводе команды set , встречаются очень интересные переменные. Обратите, например, внимание на переменную RANDOM. Если вы несколько раз подряд выполните команду

$ echo $RANDOM

вы каждый раз будете получать новое значение. Дело в том, что эта переменная возвращает случайное целое из интервала 0 — 32 768.

5.6.2 Приглашения оболочки

Одна из очень важных переменных имеет имя PS1 . Эта переменная задает вид приглашения, которое bash выводит, когда ожидает ввода очередной команды пользователем. По умолчанию этой переменной присвоено значение "\s-\v\$ ". Вообще-то в bash существует четыре приглашения, которые используются в разных ситуациях. Переменная PS1 задает вид строки приглашения, которая выдается тогда, когда оболочка ждет ввода команды. Вторичное приглашение, задаваемое переменной PS2 , появляется тогда, когда оболочка ожидает от пользователя ввода еще каких-то данных, необходимых для продолжения работы запущенной команды или программы. По умолчанию переменная PS2 имеет значение " >" . Вы уже имели возможность видеть это приглашение, когда запускали команду cat для ввода данных с клавиатуры в файл. Другой пример — команда ftp , после запуска которой приглашение тоже принимает такой вид.

Приглашение, задаваемое переменной PS3 , используется в команде select . Приглашение, задаваемое переменной PS4 , выводится перед каждой командой, в то время, когда bash отслеживает процесс выполнения. Значение по умолчанию — "+ ".

Если у вас есть такое желание, вы можете изменить вид переменных PS1 и PS2 . При этом можно использовать как любые символы, вводимые с клавиатуры, так и некоторое число специальных символов, которые при формировании строки приглашения декодируются в соответствии с табл. 5.3(приводим только некоторые из них, для примера; полный список см. в man -странице по утилите bash ) .

Таблица 5.3. Специальные символы для формирования приглашения

Символ

Его значение

Звуковой сигнал (ASCII-код 07)

Дата в формате "День, месяц, число", например, Срд, Окт, 17.

Имя хоста (hostname) до первой точки

Полное имя хоста

Текущее время в 24-часовом формате: HH:MM:SS (часы:минуты:секунды)

Текущее время в 12-часовом формате: HH:MM:SS

Текущее время в 12-часовом формате am/pm

Имя пользователя, запустившего оболочку

Полное имя текущего рабочего каталога (начиная с корня)

Текущий рабочий каталог (без указания пути)

Символ #, если оболочка запущена суперпользователем, и символ $ , если оболочка запущена обычным пользователем.

\nnn

Символ, имеющий восьмеричный код nnn

Н овая строка(перевод строки)

Имя оболочки

Текущий номер команды

Обратный слэш (a backslash)

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

Конец последовательности не печатаемых символов

Порядковый номер данной команды в истории команд

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

После того, как значение переменной, определяющей подсказку, прочитано оболочкой, в нем могут быть произведены подстановки в соответствии с правилами расширения параметров, подстановок в именах команд и арифметических выражениях, а также разбиения слов (word splitting). Об этих правилах будет рассказано чуть ниже, в разд. 5.7.

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

# PS1="[\u@\h \W]\$"

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

5.6.3 Переменная PATH

Еще одна очень важная переменная имеет имя PATH . Она задает перечень путей к каталогам, в которых bash осуществляет поиск файлов (в частности, файлов с командами) в тех случаях, когда полный путь к файлу не задан в командной строке. Отдельные каталоги в этом перечне разделяются двоеточиями. По умолчанию переменная PATH включает каталоги /usr/local/bin, /bin, /usr/bin, /usr/X11R6/bin, т. е. имеет вид:

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

Для того, чтобы добавить каталог в этот список, нужно выполнить следующую команду:

# PATH=$PATH:new_path.

При осуществлении поиска оболочка просматривает каталоги именно в том порядке, как они перечислены в переменной PATH.

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

5.6.4 Переменная IFS

Эта переменная задает разделители полей (Internal Field Separator), которые используются при операции разделения слов при преобразованиях командной строки, выполняемых оболочкой перед тем, как запустить командную строку на исполнение. Значение этой переменной по умолчанию — "<Пробел><Символ_ новой_ строки>".

5.6.5 Текущий и домашний каталоги

Имя текущего каталога сохраняется в переменной окружения (с именем PWD), и значение этой переменной изменяется при каждом запуске программы cd (а также при смене текущего каталога любым другим способом, например, через Midnight Commander).

Аналогичным образом полное имя (с указанием пути) домашнего каталога пользователя, запустившего данный процесс, сохраняется в переменной HOME.

5.6.6 Команда export

Когда оболочка запускает на выполнение какую-то программу или команду, она передает им часть переменных окружения. Для того, чтобы переменная окружения передавалась запускаемому из оболочки процессу, ее нужно задавать с помощью специальной команды export , т. е. вместо

$ name=value

надо записать

$ export name=value

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

В. Костромин (kos at rus-linux dot net) - 5.6. Параметры и переменные. Окружение оболочки

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

Значениями переменной среды может быть редактор по умолчанию, который будет использоваться, например, расположение всех файлов, которые могут быть выполнены в системе или локальные настройки для системы. Для начинающих это немного сложно, но переменная окружения – отличный способ совместного использования настроек конфигурации между несколькими приложениями и процессами.

В пакете Coreutils размещены программы env и printenv. Чтобы перечислить все переменные среды, которые в настоящее время имеют значение, просто введите:

$ printenv

В оболочке bash существуют два типа переменных среды:

  • Глобальные переменные
  • Местные переменные

Глобальные переменные окружения

Из сеанса оболочки отображаются глобальные переменные окружения, и любые дочерние процессы, которые генерирует оболочка.

С другой стороны, локальные переменные могут быть доступны в оболочке только при их создании. Это делает глобальные переменные среды полезными в приложениях, которые требуют информации из родительского процесса и порождают дочерние процессы.

По умолчанию система Linux устанавливает определенные глобальные переменные среды при запуске сеанса bash. Переменные системной среды каждый раз используют все заглавные буквы, чтобы отличать их от обычных переменных среды пользователя.

Локальные переменные среды

Поскольку их имя указывает, что переменные локальной среды могут отображаться только в локальном процессе, в котором они определены. Не смешивайте, хотя и о переменных локальной среды, они одинаково важны как глобальные переменные среды. Фактически, система Linux также по умолчанию будет определять стандартные локальные переменные среды для вас. Это становится сложно, когда вы пытаетесь увидеть список переменных локальной среды. К сожалению, для нас нет команды, которая будет отображать только локальные переменные среды. Существует команда, которая отображает все переменные среды, заданные для определенного процесса. Обратите внимание, что это также включает глобальные переменные окружения.

Установка переменных среды

Вы можете создавать свои собственные переменные среды прямо из оболочки bash. В следующем разделе мы покажем вам, как создавать собственные переменные среды и ссылаться на них из вашей интерактивной программы оболочки или оболочки.

Настройка переменных локальной среды

После запуска оболочки bash (или появления сценария оболочки) вам разрешено создавать локальные переменные, которые видны внутри вашего shell-процесса. Вы можете присвоить переменную окружения переменной string или numeric с помощью знака равенства, которому присваивается значение переменной:

$ andreyex_test=testing $ echo $andreyex_test testing $

Поздравляем, вы только что создали свою первую переменную. Просто помните, что в любое время вам нужно ссылаться на значение переменной среды andreyex_test, просто ссылайтесь на нее по имени $ andreyex_test.

Если вам нужно назначить строку значений, содержащих пробелы, вам нужно будет использовать один кавычек, чтобы указать начало и конец строки:

$ andreyex_test=testing a long string -bash: a: command not found $ andreyex_test="testing a long string" $ echo $andreyex_test testing a long string

Если оставить его без одиночных кавычек, оболочка bash предполагает, что следующий символ – это еще одна команда для обработки.

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

В оболочке bash это стандартное соглашение. Если вы настраиваете новые переменные среды, это не требуется, но рекомендуется использовать строчные буквы. Это помогает дифференцировать ваши личные переменные среды из результатов переменных системной среды.

ПРИМЕЧАНИЕ . Очень важно, чтобы между именем переменной среды, знаком равенства и значением не было пробелов. Если вы помещаете какие-либо пробелы в присваивание, оболочка bash интерпретирует значение как отдельную команду:

$ andreyex_test2 = test -bash: andreyex_test2: command not found $

Установленная локальная переменная среды в вашем процессе оболочки будет доступна для использования в любом месте вашего shell-процесса. Но если вы создаете другую оболочку, она недоступна в дочерней оболочке:

$ bash $ echo $andreyex_test $ exit exit $ echo $andreyex_test testing a long string $

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

Аналогично, если вы установите локальную переменную окружения в дочернем процессе после того, как вы покинете дочерний процесс, переменная локальной среды перестает быть доступной:

$ bash $ andreyex_test=testing $ echo $andreyex_test testing $ exit exit $ echo $andreyex_test $

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

Настройка глобальных переменных окружения

Глобальные переменные окружения видны из всех процессов дочернего процесса, созданных процессом, который устанавливает глобальную переменную среды. Метод, используемый для создания глобальной переменной окружения, заключается в создании локальной переменной среды, а затем ее экспорта в глобальную среду.

Это выполняется с помощью команды export:

$ echo $andreyex_test testing a long string $ export andreyex_test $ bash $ echo $andreyex_test testing a long string $

После того, как мы используем экспорт команды в локальной переменной среды andreyex_test, мы начали новый процесс оболочки и просмотрели значение переменной среды andreyex_test. На этот раз команда export сделала глобальную переменную среды глобальной, поэтому она сохранила свою ценность.

Обратите внимание, что при запуске экспорта команды в локальной переменной среды вы не используете знак доллара для ссылки на имя переменной.

Удаление переменных среды

Очевидно, что если вы можете создать новую переменную среды, было бы разумно, что вы также можете удалить существующую переменную среды. Это можно сделать, используя команду unset:

$ echo $andreyex_test testing $ unset andreyex_test $ echo $andreyex_test $

Если вы ссылаетесь на переменную среды в команде unset, имейте в виду не использовать знак доллара.

При работе с глобальными переменными среды все становится немного сложнее. Если вы находитесь в дочернем процессе и отключите глобальную переменную окружения, она применима только к дочернему процессу. Глобальная переменная среды остается доступной в родительском процессе:

$ andreyex_test=testing $ export andreyex_test $ bash $ echo $andreyex_test testing $ unset andreyex_test $ echo $andreyex_test $ exit exit $ echo $andreyex_test testing $

В этом примере мы устанавливаем локальную переменную среды, называемую andreyex_test, затем экспортируем ее, чтобы сделать ее глобальной переменной окружения. Затем мы начали процесс дочерней оболочки и были проверены, чтобы убедиться, что глобальная переменная среды andreyex_test все еще доступна. Затем, еще находясь в дочерней оболочке, мы использовали команду unset для удаления глобальной переменной среды andreyex_test, а затем вышли из дочерней оболочки. Теперь вернемся к исходной родительской оболочке, мы проверили значение переменной среды andreyex_test, и оно все еще действует.

Переменные среды Shell по умолчанию

Существуют конкретные переменные среды, которые bash shell использует для определения системной среды. Вы всегда можете подсчитать эти переменные, которые будут использоваться в вашей системе Linux. Поскольку оболочка bash является производной исходной оболочки Unix Bourne, она также включает переменные среды, первоначально определенные в этой оболочке.

Следующие примеры показывают, что переменные среды, предоставляемые оболочкой bash, совместимы с исходной оболочкой Unix Bourne.

До сих пор наиболее ценной переменной среды в этом списке является переменная среды PATH.

Когда вы вводите команду в командной оболочке оболочки (интерфейс командной строки), оболочка должна искать систему, чтобы найти программу. Каталоги, которые он ищет в поисках команд, определяются переменной среды PATH. В системе Linux переменная среды PATH должна выглядеть примерно так:

$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin $

В этом случае показано, что существует восемь каталогов, в которых оболочка ищет команды. Каждый каталог разделяется двоеточием, и в конце переменной PATH нет и конца списка каталогов. Вы всегда можете добавить дополнительные каталоги в PATH, добавив новый каталог и добавив еще один двоеточие. PATH также демонстрирует запрос, в котором он ищет заказы.

В дополнение к стандартным переменным среды Bourne, оболочка bash также предоставляет несколько переменных, как показано:

Переменные Bash Shell Bourne:

CDPATH: список каталогов, разделенных двоеточиями, используемых в качестве пути поиска для команды cd.
HOME: домашний каталог текущего пользователя.
IFS: список символов, которые разделяют поля, используемые оболочкой для разделения текстовых строк.
MAIL: имя файла для почтового ящика текущего пользователя. Оболочка bash проверяет этот файл для новой почты.
MAILPATH: список из нескольких имен файлов для почтового ящика текущего пользователя. Оболочка bash проверяет каждый файл в этом списке для новой почты.
OPTARG: значение последнего аргумента параметра, обрабатываемого командой getopts.
OPTIND: значение индекса последнего аргумента параметра, обработанного командой getopts.
PATH: список каталогов, разделенных двоеточиями, где оболочка ищет команды.
PS1: строка приглашения командной строки основной командной строки.
PS2: строка приглашения интерфейса командной строки вторичной оболочки.

Переменные среды Shell bash:

BASH: полное имя пути для выполнения текущего экземпляра оболочки bash.
BASH_ENV: при установке каждый сценарий bash пытается запустить файл запуска, определенный этой переменной перед запуском.
BASH_VERSION: номер версии текущего экземпляра оболочки bash.
BASH_VERSINFO: массив переменных, содержащий отдельные основные и младшие номера версий текущего экземпляра оболочки bash.
COLUMNS: содержит ширину терминала терминала, используемую для текущего экземпляра оболочки bash.
COMP_CWORD: индекс в переменной COMP_WORDS, который содержит текущую позицию курсора.
COMP_LINE: текущая командная строка.
COMP_POINT: индекс текущей позиции курсора относительно начала текущей команды.
COMP_WORDS: переменный массив, содержащий отдельные слова в текущей командной строке.
COMPREPLY: переменный массив, содержащий возможные коды завершения, генерируемые функцией оболочки.
DIRSTACK: массив переменных, содержащий текущее содержимое стека директорий.
EUID: эффективный идентификатор пользователя текущего пользователя.
FCEDIT: редактор по умолчанию, используемый командой fc.
FIGNORE: список суффиксов, разделенных двоеточиями, для игнорирования при выполнении завершения имени файла.
FUNCNAME: имя исполняемой в данный момент функции оболочки.
GLOBIGNORE: список разделенных двоеточиями шаблонов, определяющих набор имен файлов, которые следует игнорировать, расширяя имя файла.
GROUPS: переменный массив, содержащий список групп, членом которого является текущий пользователь.
histchars: до трех символов, которые управляют расширением истории.
HISTCMD: номер истории текущей команды.
HISTCONTROL: Управляет тем, какие команды вводятся в списке истории оболочки.
HISTFILE: имя файла для сохранения списка истории оболочки (по умолчанию – история.bash).
HISTFILESIZE: максимальное количество строк для сохранения в файле истории.
HISTIGNORE: список шаблонов, разделенных двоеточием, используемый для определения того, какие команды игнорируются для файла истории.
HISTSIZE: максимальное количество команд, хранящихся в файле истории.
HOSTFILE: содержит имя файла, который должен быть прочитан, когда оболочке необходимо заполнить имя хоста.
HOSTNAME: имя текущего хоста.
HOSTTYPE: Строка, описывающая машину bash-shell, работает.
IGNOREEOF: количество последовательных символов EOF, которые должна получить оболочка перед выходом. Если это значение не существует, по умолчанию оно равно единице.
INPUTRC: имя файла инициализации Readline (по умолчанию – .inputrc).
LANG: категория локали для оболочки.
LC_ALL: переопределяет переменную LANG, определяя категорию локали.
LC_COLLATE: устанавливает порядок сортировки, используемый при сортировке строковых значений.
LC_CTYPE: Определяет интерпретацию символов, используемых при расширении имени файла и сопоставлении с образцом.
LC_MESSAGES: определяет параметр локали, используемый при интерпретации строк с двойными кавычками, которым предшествует знак доллара.
LC_NUMERIC: указывает локальную настройку, используемую для форматирования чисел.
LINENO: номер строки в исполняемом скрипте.
LINES: Определяет количество линий, доступных на терминале.
MACHTYPE: строка, определяющая тип системы в формате cpu-company-system.
MAILCHECK: как часто оболочка должна проверять (по умолчанию 60 секунд) для новой почты.
OLDPWD: предыдущий рабочий каталог, используемый в оболочке.
OPTERR: если установлено значение 1, оболочка bash отображает ошибки, сгенерированные командой getopts.
OSTYPE: Строка, определяющая операционную систему, в которой работает оболочка.
PIPESTATUS: переменный массив, содержащий список значений статуса выхода из процессов процесса переднего плана.
POSIXLY_CORRECT: если установлено, bash запускается в режиме POSIX.
PPID: идентификатор процесса (PID) родительского процесса оболочки bash.
PROMPT_COMMAND: если установлено, команда для выполнения перед отображением первичного приглашения.
PS3: приглашение использовать команду select.
PS4: подсказка, отображаемая до того, как командная строка будет эхом, если используется параметр bash -x.
PWD: текущий рабочий каталог.
RANDOM: возвращает случайное число от 0 до 32767. Присвоение значения этой переменной сгенерирует генератор случайных чисел.
REPLY: переменная по умолчанию для команды чтения.
SECONDS: количество секунд с момента запуска оболочки. Присвоение значения сбрасывает таймер на значение.
SHELLOPTS: список разрешенных опций оболочки bash, разделенных двоеточием.
SHLVL: указывает уровень оболочки, увеличивающийся на единицу при каждом запуске новой оболочки bash.
TIMEFORMAT: формат, определяющий, как оболочка отображает значения времени.
TMOUT: значение того, как долго (в секундах) команды выбора и чтения должны ждать ввода. Значение по умолчанию, равное нулю, означает, что нужно ждать бесконечно.
UID: реальный идентификатор пользователя текущего пользователя.

Вы можете заметить, что после использования команды set отображаются не все переменные среды по умолчанию. Объяснением этого может быть то, что хотя это переменные среды по умолчанию, не все из них должны содержать значение.

Вывод

В этом руководстве мы рассмотрели мир переменных среды Linux. Глобальные переменные окружения часто получают доступ к любому дочернему процессу, порожденному процессом, в котором они определены. Локальные переменные окружения будут доступны только из процесса, в котором они определены.

Система Linux использует каждую глобальную и локальную переменные среды для хранения информации о системной среде. Вы сможете получить доступ к этой информации из интерфейса командной строки оболочки, а также для внутренних сценариев оболочки. Оболочка bash использует переменные системной среды, определенные в исходной оболочке UNO Bourne, также как и множество новых переменных среды. Переменная среды PATH определяет шаблон поиска, который принимает оболочка bash для поиска исполняемой команды. Вы сможете изменить переменную среды PATH, чтобы добавить свои собственные каталоги или, возможно, текущий символ каталога, чтобы упростить работу с вашими программами. Вы также можете создавать свои собственные глобальные и локальные переменные среды для собственного использования. После создания переменной среды она доступна для всего сеанса оболочки.

Существует много файлов запуска, которые запускают оболочку bash после ее запуска. Эти файлы запуска могут содержать определения переменных среды для установки стандартных переменных среды для каждого сеанса bash. После входа в систему Linux оболочка bash обращается к файлу запуска /etc/profile, а также к трем локальным файлам запуска для каждого пользователя, $HOME/.bash, $HOME/.bash login и $HOME/.profile.

Пользователи будут настраивать эти файлы для включения переменных среды и сценариев запуска для собственного использования. Оболочка bash дополнительно предоставляет переменные массивы окружения. Эти переменные среды могут содержать несколько значений в одной переменной. Вы сможете получить доступ к значениям индивидуально, указав значение индекса или в целом, указав полное имя массива переменных среды. Наконец, в этом руководстве мы должны упомянуть использование командных псевдонимов. Хотя не переменные среды, псевдонимы команд ведут себя почти как переменные среды. Они позволяют вам определять псевдоним для команды вместе с ее параметрами. Вместо того, чтобы вводить очень длинную команду и параметры, вы сможете просто присвоить ей простой псевдоним и использовать псевдоним в любое время в сеансе оболочки.

Переменные окружения Linux вместе с переменными оболочки — то, что определяет настройки в рамках пользовательской сессии.

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

Переменные окружения Linux, переменные оболочки

Переменные окружения используются для процесса пользовательского shell и всех порождаемые в нем дочерних процессах.

Переменные оболочки содержат данные, которые определяют состояние текущей сессии. Например, текущая директория.

В каждой сессии используются и переменные окружения, и переменные оболочки.

Список переменных окружения можно посмотреть выполнив printenv или env

……
LC_MEASUREMENT=ru_RU.UTF-8
LESSCLOSE=/usr/bin/lesspipe %s %s
LC_PAPER=ru_RU.UTF-8
LC_MONETARY=ru_RU.UTF-8
LANG=en_US.UTF-8
……

Разница в том, что printenv позволяет выводить данные по определенной переменной — например:

Преимущество env в том, что появляется возможность передать переменную определенной команде

Например:

env SHELL=»/bin/bash» ls -la /opt

Просмотреть переменные среды

BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
……

Вывод можно перенаправить в less , чтобы в нем удобнее было ориентироваться

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

В POSIX режиме не будут выводиться заданные bash функции

Самые часто используемые переменные:
  • SHELL — оболчка, которая интерпретирует команды
  • USER — пользователь
  • PWD — текущий каталог
  • TERM — тип, терминала, который эмулируется

Команды в оболочке позволяют менять значение переменных. Так pwd выводит в консоль текущую директорию

/home/admin

Это переменная оболочки PWD

admin@desktop:~$ set | grep PWD

OLDPWD=/tmp
PWD=/home/admin

Перейдем в /tmp и посмотрим как изменится значение

admin@desktop:~$ cd /tmp/

admin@desktop:/tmp$ set | grep PWD

OLDPWD=/home/admin
PWD=/tmp

Можно увидеть при смене каталога просто меняется значение переменной shell-а PWD, также изменяется и OLDPWD

Как установить переменную окружения или оболчки

Переменная оболочки добавляется следующим образом

SOMEVAR="Hi there"

В выводе env ее не будет, потому, что это переменная именно shell, а не окружения

Просмотреть содержимое можно через echo добавив знак $ перед именем

Hi there

Чтобы переменную добавить в окружение ее нужно экспортировоать

export SOMEVAR=»Hi there»

SOMEVAR=Hi there

После этого значение будет наследоваться дочерними процессами.

Удалить переменную окружения можно той же командой export с ключем -n

Из оболочки значение удаляется unset

Автоматическая загрузка переменных при логине

Linux системы используют файлы ~/.bashrc , ~/.bash_profile , ~/.bash_login или ~/.profile для определение переменных. Файлы считываются при логине, какой из них используется зависит от дистрибутива.

В Ubuntu/Debain это ~/.bashrc. В него добавляются как переменные окружения, так и переменные оболочки.

Самым первым считывается /etc/profile . В нем задано и может быть переопределено какие файлы и в каком порядке использовать дальше.

Для non-login сессии переменные задаются в /etc/bash.bashrc. Такая сессия свойственна для скриптов, запускаемых в фоне.

Для большинства задач достаточно отредактировать ~/.bashrc .



 


Читайте:



Микросхемы драйверов RGB-светодиодов Драйвер для rgb светодиод 3 вт

Микросхемы драйверов RGB-светодиодов Драйвер для rgb светодиод 3 вт

Самым оптимальным способом подключения к 220В, 12В является использование стабилизатора тока, светодиодного драйвера. На языке предполагаемого...

Как оплатить World of Warcraft?

Как оплатить World of Warcraft?

Оплачиваете игровое время WoW с помощью ТК за голд ? Тогда для Вас будет интересна оплата WoW за голд . В ином случае - оптимальным для Вас...

Как удалить историю мейл-агента

Как удалить историю мейл-агента

История сообщений, как и корзина рабочего стола компьютера, всегда должна очищаться. С одной стороны, хранение давних и незначительных бесед...

Скоро подключим мышки и клавиатуры к Xbox One Когда xbox one получит поддержку клавиатуры

Скоро подключим мышки и клавиатуры к Xbox One Когда xbox one получит поддержку клавиатуры

Первая ревизия Xbox One появилась в России в 2014 году, спустя год после официального старта продаж в США. Сегодня, кроме обновленных версий X и S,...

feed-image RSS