Linux системные переменные. Чтение и установка переменных среды и оболочки на сервере 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!)

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

Переменные окружения

$HOME
Переменная содержит путь к домашнему каталогу текущего пользователя. $USER
Имя текущего пользователя $PATH
Список каталогов для поиска оболочкой исполняемых программ. $PWD
Путь к текущему рабочему каталогу (либо pwd ). Пример: dir_path=$(pwd) . $SHELL
Интерпретатор по умолчанию $RANDOM
Генерирует рандомное число 0..32767 при каждом доступе к переменной. $SECONDS
Время в сек. с момента запуска командной оболочки. $? Результат выполнения предыдущей команды. $HOSTNAME
Имя компьютера $HISTFILE
Путь к файлу истории интерпретатора $IFS
Список символов-разделителей команд, параметров, элементов массива (по умолчанию: пробел, таб, новая строка) $PS1
Шаблон строки приглашения интерпретатора.

Временная установка переменной окружения

Установка переменной окружения на период сессии:

# Для нового процесса env имя_переменной=значение [команда] # Для текущей оболочки и всех ее подпроцессов export имя_переменной=значение [команда]

Значение переменной сохраняется до перезагрузки системы.

Установка постоянного значения

Переменные окружения на уровне системы устанавливаются через файл /etc/environment:

ENVIRONMENT="dev"

Установка переменной окружения для конкретного пользователя через файл ~/ .bashrc или ~/.bash_profile:

PATH="${PATH}:/home/user/bin:"

Внимание!

Файл ~/.bash_profile будет выполнен при запуске интерпретатора с ключом -l. При локальном входе этот файл не читается!

Также нужно помнить, что изменения вступят в силу только после перезагрузки сеанса!

Просмотр значения переменной окружения

Для просмотра значения переменной окружения есть команда printenv:

Printenv <имя_переменной>

#shell, #bash, #environment

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

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

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

Как работает среда и ее переменные

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

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

Среда имеет вид строки, содержащей пары вида «ключ-значение». Несколько значений, как правило, разделяются символом двоеточия (:). Каждая пара, в целом, выглядит примерно так:

КЛЮЧ=значение1:значение2:...

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

КЛЮЧ="значение с пробелами"

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

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

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

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

Вывод переменных оболочки и среды

Каждая сессия отслеживает свои переменные оболочки и среды. Вывести их можно несколькими способами.

Чтобы просмотреть список всех переменных среды, используйте команды env или printenv. По умолчанию они выведут точно такой же результат:

printenv
SHELL=/bin/bash
TERM=xterm
USER=demouser
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca:...
MAIL=/var/mail/demouser
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
PWD=/home/demouser
LANG=en_US.UTF-8
SHLVL=1
HOME=/home/demouser
LOGNAME=demouser
LESSOPEN=| /usr/bin/lesspipe %s
LESSCLOSE=/usr/bin/lesspipe %s %s
_=/usr/bin/printenv

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

printenv SHELL
/bin/bash

Команда env позволяет изменять среду, в которой запущены программы, передавая набор определений переменных в команду, примерно так:

env VAR1="blahblah" command_to_run command_options

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

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

Но как же просмотреть переменные оболочки?

Для этого используется команда set. При вводе без дополнительных параметров set выводит список всех переменных оболочки, переменных среды, локальных переменных и функций оболочки:

set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
. . .

Как правило, этот список достаточно длинный. Чтобы вывести его в более удобном формате, откройте его с помощью программы-пейджера:

Этот список содержит огромное количество дополнительной информации, которая в данный момент не нужна (к примеру, некоторые функции bash).

Чтобы «почистить» выведенный результат, нужно запустить команду set в режиме POSIX, который пропускает функции оболочки. Это нужно выполнить в субоболочке, чтобы не изменить текущую среду:

(set -o posix; set)

Данное действие выведет все переменные среды и оболочки.

Можно также сравнить этот результат с результатом команд env/printenv и попробовать вывести список только переменных оболочки, но такой список не будет идеальным, поскольку данные команды выводят информацию по-разному:

comm -23 <(set -o posix; set | sort) <(env | sort)

Скорее всего, список будет содержать несколько переменных среды, поскольку команда set выводит значения в кавычках, а команды printenv и env — нет.

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

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

Основные переменные среды и оболочки

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

Ниже приведен список основных переменных среды:

  • SHELL : описывает оболочку, которая интерпретирует введенные команды. В большинстве случаев по умолчанию установлена bash, но это значение можно изменить в случае необходимости.
  • TERM : указывает вид терминала, эмулируемого при запуске оболочки. В зависимости от операционных требований можно эмулировать разные аппаратные терминалы. Как правило, об этом не нужно беспокоиться.
  • USER : текущий пользователь.
  • PWD : текущий рабочий каталог.
  • OLDPWD : предыдущий рабочий каталог. Оболочка хранит его на случай запуска команды cd -.
  • LS_ COLORS : определяет цветовые коды, которые используются для цветного вывода результата команды ls. Такой вывод помогает пользователю быстрее прочесть результат команды (например, быстро различить типы файлов).
  • MAIL : путь к текущему почтовому ящику пользователя.
  • PATH : список каталогов, к которым обращается система при выполнении команд. Когда пользователь запускает команду, система проверяет эти каталоги в указанном порядке в поисках исполняемого файла.
  • LANG : текущие настройки языка и локализации, в том числе кодировка символов.
  • HOME : домашний каталог текущего пользователя.
  • _ : последняя выполненная команда.

Ознакомившись со списком переменных среды, изучите список переменных оболочки:

  • BASHOPTS : список опций, использованных при выполнении bash. Это можно применять для того, чтоб проверить, работает ли среда должным образом.
  • BASH_ VERSION : запущенная версия bash в удобочитаемой форме.
  • BASH_ VERSINFO : версия bash в машиночитаемом формате.
  • COLUMNS : определяет ширину вывода в столбцах.
  • DIRSTACK : стек каталогов, доступных командам pushd и popd.
  • HISTFILESIZE : максимальное количество строк, содержащееся в файле истории команд.
  • HISTSIZE : Количество команд, которые необходимо запоминать в списке истории.
  • HOSTNAME : текущее имя хоста.
  • IFS: Внутренний разделитель полей ввода в командной строке. По умолчанию установлен пробел.
  • PS1 : определяет строку первичного приглашения – вид командной строки при запуске сессии оболочки. Переменная PS2 устанавливает строку вторичного приглашения, если команда занимает несколько строк.
  • SHELLOPTS : параметры оболочки, которые можно установить при помощи set.
  • UID : уникальный идентификатор текущего пользователя.

Установка переменных оболочки и среды

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

Создание переменных оболочки

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

TEST_VAR="Hello World!"

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

Итак, полученная переменная оболочки действительна в текущей сессии, но не передается ее дочерним процессам.

Чтобы в этом убедиться, используйте команду grep на результат команды set:

set | grep TEST_VAR
TEST_VAR="Hello World!"

Убедиться, что данная переменная не является переменной среды, также можно, запустив grep на результат команды printenv:

printenv | grep TEST_VAR

Данное действие не выведет никакого результата.

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

echo $TEST_VAR
Hello World!

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

Опять же, полученная переменная не должна быть передана какому-либо дочернему процессу. Чтобы это протестировать, внутри текущей оболочки разверните новую bash-оболочку:

bash
echo $TEST_VAR

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

Чтобы вернуться в исходную оболочку, введите exit:

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

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

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

printenv | grep TEST_VAR
TEST_VAR=Hello World!

Теперь эта переменная выведена в данном списке. Можно также снова развернуть дочернюю оболочку:

bash
echo $TEST_VAR
Hello World!

Отлично! Дочерняя оболочка получила переменную исходной оболочки. Попробуйте экспортировать еще одну переменную, прежде чем покинуть дочернюю оболочку.

export NEW_VAR="Testing export"

Проверьте, экспортировалась ли переменная:

printenv | grep NEW_VAR
NEW_VAR=Testing export

Теперь вернитесь в исходную оболочку:

Проверьте, можно ли открыть данную переменную:

Результат не возвращается

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

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

Перемещение и сброс переменных

Переменная TEST_VAR все еще является переменной среды. Чтобы снова сделать ее переменной оболочки, наберите:

export -n TEST_VAR

Теперь эта переменная больше не является переменной среды:

printenv | grep TEST_VAR

Это снова переменная оболочки:

set | grep TEST_VAR
TEST_VAR="Hello World!"

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

Убедитесь, что такой переменной больше нет:

Результат не был выведен, поскольку переменная была сброшена.

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

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

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

Типы сессий оболочки

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

Стартовая, или начальная оболочка (login shell) — это сессия оболочки, которая открывается после авторизации пользователя. Если пользователь входит в терминал или проходит авторизацию при помощи SSH, будет открыта стартовая оболочка.

Если новая сессия запускается из авторизованной (стартовой) сессии (как ранее в примерах запускалась новая bash-оболочка), эта сессия будет дочерней (non- login shell). Чтобы открыть эту сессию, не нужно проходить процедуру авторизации.

Также сессии оболочки бывают интерактивными и неинтерактивными.

Интерактивная сессия оболочки (interactive shell) – это сессия, привязанная к терминалу. Неинтерактивная сессия оболочки (non-interactive shell) – это сессия, не привязанная к терминалу.

Итак, сессии оболочки классифицируются по таким аспектам: стартовая-дочерняя, интерактивная-неинтерактивная.

Обычная сессия, открытая с помощью SSH, как правило, является интерактивной стартовой сессией. Скрипт, запущенный через командную строку, обычно работает в неинтерактивной дочерней сессии. Терминальная сессия – это различные комбинации этих двух свойств.

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

Итак, сначала стартовая сессия получает конфигурации из файла /etc/profile. Затем она ищет конфигурационный файл стартовой оболочки в домашнем каталоге пользователя, чтобы получить определенные пользователем конфигурации.

Такая сессия читает файлы ~/.bash_profile, ~/.bash_login и ~/.profile и не читает остальных файлов.

Дочерняя сессия, в свою очередь, читает /etc/baash.bashrc, а затем пользовательский файл ~/.bash.rc для развертывания среды.

Неинтерактивные оболочки читают переменную среды BASH_ENV и указанный файл, чтобы создать новую среду.

Как задать переменные среды

Как видите, конфигурации разбросаны по разным файлам.

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

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

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

Откройте данный файл:

Скорее всего, он уже содержит немного данных. Большинство заданных здесь значений – это параметры bash, не имеющие отношения к переменным среды. Переменные в данном файле задаются точно так же, как и в командной строке:

export VARNAME=value

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

source ~/.bashrc

Чтобы задать общесистемные переменные, внесите их в /etc/profile, /etc/bash.bashrc или /etc/environment.

Итоги

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

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

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

Tags: ,

Типы переменных

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

Глобальные переменные

Глобальные переменные или переменные среды окружения доступны во всех оболочках. Чтобы показать переменные среды окружения, можно использовать команды env или printenv . Эти команды поставляются в составе пакета sh-utils .

Ниже показан типичный результат выдачи:

Franky ~> printenv CC=gcc CDPATH=.:~:/usr/local:/usr:/ CFLAGS=-O2 -fomit-frame-pointer COLORTERM=gnome-terminal CXXFLAGS=-O2 -fomit-frame-pointer DISPLAY=:0 DOMAIN=hq.garrels.be e= TOR=vi FCEDIT=vi FIGNORE=.o:~ G_BROKEN_FILENAMES=1 GDK_USE_XFT=1 GDMSESSION=Default GNOME_DESKTOP_SESSION_ID=Default GTK_RC_FILES=/etc/gtk/gtkrc:/nethome/franky/.gtkrc-1.2-gnome2 GWMCOLOR=darkgreen GWMTERM=xterm HISTFILESIZE=5000 history_control=ignoredups HISTSIZE=2000 HOME=/nethome/franky HOSTNAME=octarine.hq.garrels.be INPUTRC=/etc/inputrc IRCNAME=franky JAVA_HOME=/usr/java/j2sdk1.4.0 LANG=en_US LDFLAGS=-s LD_LIBRARY_PATH=/usr/lib/mozilla:/usr/lib/mozilla/plugins LESSCHARSET=latin1 LESS=-edfMQ LESSOPEN=|/usr/bin/lesspipe.sh %s LEX=flex LOCAL_MACHINE=octarine LOGNAME=franky LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35: MACHINES=octarine MAILCHECK=60 MAIL=/var/mail/franky MANPATH=/usr/man:/usr/share/man/:/usr/local/man:/usr/X11R6/man MEAN_MACHINES=octarine MOZ_DIST_BIN=/usr/lib/mozilla MOZILLA_FIVE_HOME=/usr/lib/mozilla MOZ_PROGRAM=/usr/lib/mozilla/mozilla-bin MTOOLS_FAT_COMPATIBILITY=1 MYMALLOC=0 NNTPPORT=119 NNTPSERVER=news NPX_PLUGIN_PATH=/plugin/ns4plugin/:/usr/lib/netscape/plugins OLDPWD=/nethome/franky OS=Linux PAGER=less PATH=/nethome/franky/bin.Linux:/nethome/franky/bin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin:/usr/bin:/usr/sbin:/bin:/sbin:. PS1=\[\033franky is in \w\[\033 PS2=More input> PWD=/nethome/franky SESSION_MANAGER=local/octarine.hq.garrels.be:/tmp/.ICE-unix/22106 SHELL=/bin/bash SHELL_LOGIN=--login SHLVL=2 SSH_AGENT_PID=22161 SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass SSH_AUTH_SOCK=/tmp/ssh-XXmhQ4fC/agent.22106 START_WM=twm TERM=xterm TYPE=type USERNAME=franky USER=franky _=/usr/bin/printenv VISUAL=vi WINDOWID=20971661 XAPPLRESDIR=/nethome/franky/app-defaults XAUTHORITY=/nethome/franky/.Xauthority XENVIRONMENT=/nethome/franky/.Xdefaults XFILESEARCHPATH=/usr/X11R6/lib/X11/%L/%T/%N%C%S:/usr/X11R6/lib/X11/%l/%T/%N%C%S:/usr/X11R6/lib/X11/%T/%N%C%S:/usr/X11R6/lib/X11/%L/%T/%N%S:/usr/X11R6/lib/X11/%l/%T/%N%S:/usr/X11R6/lib/X11/%T/%N%S XKEYSYMDB=/usr/X11R6/lib/X11/XKeysymDB XMODIFIERS=@im=none XTERMID= XWINHOME=/usr/X11R6 X=X11R6 YACC=bison -y

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

Локальные переменные доступны только в текущей командной оболочке. Если встроенная команда set используется без каких-либо параметров, то она выдаст список всех переменных (в том числе переменные среды исполнения) и функций. Воспользуемся форматированием и выдадим отсортированный результат, учитывающий локальность переменных.

Ниже приведен файл diff, созданный путем сравнения результата работы команд printenv и set , после удаления из списка функций, которые также отображаются командой set :

Franky ~> diff set.sorted printenv.sorted | grep "<" | awk "{ print $2 }" BASE=/nethome/franky/.Shell/hq.garrels.be/octarine.aliases BASH=/bin/bash BASH_VERSINFO=(="2" BASH_VERSION="2.05b.0(1)-release" COLUMNS=80 DIRSTACK=() DO_FORTUNE= EUID=504 GROUPS=() HERE=/home/franky HISTFILE=/nethome/franky/.bash_history HOSTTYPE=i686 IFS=$" LINES=24 MACHTYPE=i686-pc-linux-gnu OPTERR=1 OPTIND=1 OSTYPE=linux-gnu PIPESTATUS=(="0") PPID=10099 PS4="+ PWD_REAL="pwd SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor THERE=/home/franky UID=504

Деление переменных по их содержимому

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

  • Строковые переменные
  • Целочисленные переменные
  • Переменные - константы
  • Переменные - массивы

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

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

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

Prompt> export 1number=1 bash: export: `1number=1": not a valid identifier

Чтобы в командной оболочке задать переменную, используйте следующую команду

VARNAME="value"

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

Некоторые примеры использования верхнего и нижнего регистров, цифр и пробелов (сообщение command not found указывает на наличие проблемы — прим.пер. ):

Franky ~> MYVAR1="2" franky ~> echo $MYVAR1 2 franky ~> first_name="Franky" franky ~> echo $first_name Franky franky ~> full_name="Franky M. Singh" franky ~> echo $full_name Franky M. Singh franky ~> MYVAR-2="2" bash: MYVAR-2=2: command not found franky ~> MYVAR1 ="2" bash: MYVAR1: command not found franky ~> MYVAR1= "2" bash: 2: command not found franky ~> unset MYVAR1 first_name full_name franky ~> echo $MYVAR1 $first_name $full_name <--no output--> franky ~>

Экспорт переменных

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

Export VARNAME="value"

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

Franky ~> full_name="Franky M. Singh" franky ~> bash franky ~> echo $full_name franky ~> exit franky ~> export full_name franky ~> bash franky ~> echo $full_name Franky M. Singh franky ~> export full_name="Charles the Great" franky ~> echo $full_name Charles the Great franky ~> exit franky ~> echo $full_name Franky M. Singh franky ~>

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

Зарезервированные переменные

Зарезервированные переменные командной оболочки Bourne

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

Таблица 3.1. Зарезервированные переменные командной оболочки Bourne

Имя переменной Определение

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

Домашний директорий текущего пользователя; используется по умолчанию во встроенной команде cd . Значение этой переменной используется также вместо символа "тильда".

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

Если в этом параметре задано имя файла, а значение переменной MAILPATH не установлено, Bash проинформирует пользователя о получении письма в указанном файле.

Список имен файлов, разделенных двоеточиями, которые командная оболочка периодически проверяется на наличие новых писем.

Значение последнего аргумента в параметре, обработанного встроенной командой getopts .

Индекс последнего аргумента параметра, обработанного встроенной командой getopts .

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

Первичная строка приглашения. Значение по умолчанию равно ""\s-\v\$ "".

Вторичная строка приглашения. Значение по умолчанию равно ""> "".

Зарезервированные переменные Bash

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

Таблица 3.2. Зарезервированные переменные Bash

Имя переменной Определение

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

Полный путь, используется для запуска текущего экземпляра Bash.

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

Номер версии текущего экземпляра Bash.

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

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

Указатель в ${COMP_WORDS } для слова, в котором хранится текущая позиция курсора.

Текущая командная строка.

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

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

Переменная - массив, из которого Bash считывает возможные варианты завершения строки, сгенерированные функцией командной оболочки, вызванной сервисом, предназначенным для программирования завершений

Переменная — массив, в которой хранится текущее состояние стека директориев.

Числовой действующий идентификатор пользователя ID текущего пользователя.

Редактор, используемый по умолчанию, когда во во встроенной команде fc указывается параметр -e

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

Имя функции командной оболочки, исполняемой в текущий момент.

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

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

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

Номер текущей команды в истории команд или ее указатель в списке истории команд.

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

Имя файла, в котором сохраняется история команд. Значение по умолчанию: ~/.bash_history .

Максимальное количество строк, содержащихся в файле истории команд, по умолчанию - 500.

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

Максимальное количество команд, которое можно запомнить в списке истории команд, по умолчанию - 500.

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

Имя текущего хоста.

Строка, описывающая машину, на которой работает Bash.

Управляет действием командной оболочки при получении ею в качестве завершающего символа входного потока символа EOF (символ конца файла).

Имя файла инициализации программы Readline, которым заменяется файл /etc/inputrc , использумый по умолчанию.

Используется для определения категории локализации (locale) для всех категорий, не заданных явно с помощью переменных, имена которых начинаются с символов LC_ .

Эта переменная переопределяет значение переменной LANG и всех остальных переменных, начинающихся с символов LC_ , задающих категорию локализации.

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

Эта переменная определяет интерпретацию символов и принадлежность символов к определенному классу для подстановки имен файлов и сопоставления с шаблоном.

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

Эта переменная определяет категорию локализации для числового формата.

Номер строки в скрипте или в функции оболочки, которая исполняется в текущий момент.

Используется встроенной командой select для определения длины столбца, в который выводятся выбранные списки.

Строка, которая полностью описывает тип системы, на которой выполняется Bash, используется стандартный формат GNU CPU-COMPANY-SYSTEM.

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

Предыдущий рабочий директорий, установленный с помощью встроенной команды cd .

Если установлено значение 1, то Bash отображает сообщения об ошибках, генерируемые встроенной командой getopts .

Строка, описывающая операционную систему, на которой работает Bash.

Переменная - массив, содержащая список значений состояний выхода из процессов в последнем конвейере (который может состоять из одной команды).

Если эта переменная добавлена в окружающую среду при запуске bash, командная оболочка переходит в режим POSIX.

Если эта переменная установлена, то значение интерпретируется как команда, которая выполняется перед каждой выдачей первичной строки приглашения (PS1).

Значение этой переменной используется для команды select в качестве строки приглашения. По умолчанию - ""#? ""

Значение строки приглашения, которое выдается перед командной строкой, когда установлен параметр -x , включающий эхо-выдачу командной строки; по умолчанию - ""+ "".

Текущий рабочий директорий, установленный встроенной командой cd .

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

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

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

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

Увеличивается на единицу каждый раз, когда запускается новый экземпляр Bash.

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

Если в переменной TMOUT установлено значение больше нуля, то оно рассматривается как время ожидания, используемое по умолчанию во встроенной команде read . Когда командная оболочка запускается в интерактивном режиме, это значение интерпретируется как количество секунд, которое оболочка будет ждать ввод после выдачи первичной строки приглашения. В случае, если входные данные не поступают, то по истечению этого времени Bash завершает свою работу.

Числовое значение, реальный идентификатор пользователя ID для текущего пользователя.

Дополнительную информацию смотрите на страницах man по Bash или в документации. Некоторые переменные доступны только для чтения, значение некоторых устанавливается автоматически, а некоторые теряют свой смысл, когда для них устанавливается значение, отличающееся от значения, задаваемого по умолчанию.

Специальные параметры

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

Таблица 3.3. Специальные переменные bash

Символ Определение

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

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

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

Возвращает код возврата последнего конвейера, выполненном в приоритетном режиме (в режиме foreground — прим.пер.).

С помощью параметра "дефис" возвращаются флаги текущего параметра в том виде, как они были установлены при вызове встроенной команды set , или так, как они были установлены самой командной оболочкой (например, -i).

Возвращает идентификатор процесса командной оболочки.

Возвращает идентификатор процесса последней команды, выполненной в фоновом (асинхронном) режиме.

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

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

Позиционные параметры являются словами, следующими за именем скрипта командной оболочки. Они запоминаются в переменных $1 , $2 , $3 и так далее. Переменные, по мере необходимости, добавляются во внутренний массив. В переменной $# указывается общее число параметров, так как это продемонстрировано в следующем простом скрипте:

# positional.sh # This script reads 3 positional parameters and prints them out. POSPAR1="$1" POSPAR2="$2" POSPAR3="$3" echo "$1 is the first positional parameter, \$1." echo "$2 is the second positional parameter, \$2." echo "$3 is the third positional parameter, \$3." echo echo "The total number of positional parameters is $#."

При запуске скрипта можно указывать любое число аргументов:

Franky ~> positional.sh one two three four five one is the first positional parameter, $1. two is the second positional parameter, $2. three is the third positional parameter, $3. The total number of positional parameters is 5. franky ~> positional.sh one two one is the first positional parameter, $1. two is the second positional parameter, $2. is the third positional parameter, $3. The total number of positional parameters is 2.

Подробнее об использовании этих параметров рассказывается в главе 7 "Условные инструкции" и в разделе "Встроенная команда shift" .

Некоторые примеры других специальных параметров:

Franky ~> grep dictionary /usr/share/dict/words dictionary franky ~> echo $_ /usr/share/dict/words franky ~> echo $$ 10662 franky ~> mozilla & 11064 franky ~> echo $! 11064 franky ~> echo $0 bash franky ~> echo $? 0 franky ~> ls doesnotexist ls: doesnotexist: No such file or directory franky ~> echo $? 1 franky ~>

Пользователь franky начинает с ввода команды grep , в результате чего назначается значение переменной _ . Идентификатор процесса этой оболочки равен 10662. Если выполнение какого-то задания переводится в фоновый режим, в переменной! будет находиться идентификатор процесса фонового задания. Работающей командной оболочкой является bash . Если была допущена ошибка, в переменной? будет находиться код возврата, отличающийся от 0 (нуля).

Расширение сферы применения скриптов, имеющих переменные

Помимо того, что благодаря переменным скрипт становится более удобочитаемым, переменные также помогут вам быстрее применить скрипт в других условиях или для других целей. Рассмотрим следующий пример - очень простой скрипт, который делает на удаленном сервере резервную копию домашнего директория пользователя franky :

#!/bin/bash # This script makes a backup of my home directory. cd /home # This creates the archive tar cf /var/tmp/home_franky.tar franky > /dev/null 2>&1 # First remove the old bzip2 file. Redirect errors because this generates some if the archive # does not exist. Then create a new compressed file. rm /var/tmp/home_franky.tar.bz2 2> /dev/null bzip2 /var/tmp/home_franky.tar # Copy the file to another host - we have ssh keys for making this work without intervention. scp /var/tmp/home_franky.tar.bz2 bordeaux:/opt/backup/franky > /dev/null 2>&1 # Create a timestamp in a logfile. date >> /home/franky/log/home_backup.log echo backup succeeded >> /home/franky/log/home_backup.log

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

#!/bin/bash # This script makes a backup of my home directory. # Change the values of the variables to make the script work for you: BACKUPDIR=/home BACKUPFILES=franky TARFILE=/var/tmp/home_franky.tar BZIPFILE=/var/tmp/home_franky.tar.bz2 SERVER=bordeaux REMOTEDIR=/opt/backup/franky LOGFILE=/home/franky/log/home_backup.log cd $BACKUPDIR # This creates the archive tar cf $TARFILE $BACKUPFILES > /dev/null 2>&1 # First remove the old bzip2 file. Redirect errors because this generates some if the archive # does not exist. Then create a new compressed file. rm $BZIPFILE 2> /dev/null bzip2 $TARFILE # Copy the file to another host - we have ssh keys for making this work without intervention. scp $BZIPFILE $SERVER:$REMOTEDIR > /dev/null 2>&1 # Create a timestamp in a logfile. date >> $LOGFILE echo backup succeeded >> $LOGFILE

Переменные окружения в 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

Понравилась статья? Поделитесь с друзьями!