Как изменить переменную окружения linux

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

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

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

Виды переменных окружения

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

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

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

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

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

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

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

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

.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 — это любая переменная, которую вы хотите передать этой команде.

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

env -i bash

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

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

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

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

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

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

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

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

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

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

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

VAR1='Losst'
echo $VAR1
unset VAR1
echo $VAR1

env2

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

export VAR='Losst'
echo $VAR
VAR=
echo $VAR

env1

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

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

env4

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

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

vi .bashrc

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

export CD='This is Losst Home'

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

source .bashrc
echo $CD

env5

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

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

vi .bash_profile

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

export VAR2='This is Losst Home'

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

source .bash_profile
echo $VAR2

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

ssh user@localhost
echo $VAR2

env7

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

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

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

Создадим переменную, доступную для всех пользователей, во всех терминальных сессиях, кроме удаленных, добавлением ее в /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

env8

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

vi /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

env9

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

Выводы

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

Creative Commons License

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

Contents

  1. Manipulating environment variables and values

    1. Setting values to environment variables
    2. Examining values of environment variables

      1. Desktop environment specifics
    3. Erasing environment variables
  2. Working principles of environment variables

    1. Process locality
    2. Inheritance
    3. Case sensitivity
  3. Bash’s quick assignment and inheritance trick
  4. Persistent environment variables

    1. Session-wide environment variables

      1. ~/.pam_environment
      2. ~/.profile
      3. Other files
    2. System-wide environment variables

      1. /etc/environment
      2. /etc/profile.d/*.sh
      3. Other files
    3. sudo caveat
    4. Launching desktop application with an environment variable
  5. List of common environment variables

    1. File-location related variables
    2. Locale setting variables

      1. The LANGUAGE priority list
    3. Preferred application variables
    4. Graphical desktop-related variables

      1. Gnome-specific variables
    5. Program execution variables
    6. Compilation and software development related variables
    7. Other environment variables

Environment variables provide a way to influence the behaviour of software on the system. For example, the «LANG» environment variable determines the language in which software programs communicate with the user.

Environment variables consist of names that have values assigned to them. For example, on a typical system in the US we would have the value «en_US.UTF-8» assigned to the «LANG» variable.

The meaning of an environment variable and the format of its value are determined by the application using it. There are quite a few well-known environment variables for which the meaning and the format have been agreed upon and they are used by many applications.

Manipulating environment variables and values

While quite a few graphical system configuration applications actually manipulate environment variables in the background, the command-line allows for maximum flexibility when manipulating environment variables.

Note: The shell techniques explained in the following sections apply to the Bourne Shell family of command line shells, which includes sh, ksh, and bash, which is the default shell shipped with Ubuntu. The commands may be different on other shells such as csh.

Setting values to environment variables

In order to set a value to an existing environment variable, we use an assignment expression. For instance, to set the value of the «LANG» variable to «he_IL.UTF-8», we use the following command:

LANG=he_IL.UTF-8

If we use an assignment expression for a variable that doesn’t exist, the shell will create a shell variable, which is similar to an environment variable but does not influence the behaviour of other applications.

A shell variable can be exported to become an environment variable with the export command. To create the «EDITOR» environment variable and assign the value «nano» to it, you can do:

EDITOR=nano
export EDITOR

The bash shell (the default command-line shell in Ubuntu) provides a shortcut for creating environment variables. The previous example could be performed with the following single command:

export EDITOR=nano

Examining values of environment variables

The printenv command prints the names and values of all currently defined environment variables:

printenv 

To examine the value of a particular variable, we can specify its name to the printenv command:

printenv TERM

Another way to achieve that is to use the dollar sign ($), as used in the following example:

echo $TERM

There is a command for doing temporary, short-term changes to the environment. It can also be used to display the current environment. This command is env.

env

The dollar sign can actually be used to combine the values of environment variables in many shell commands. For example, the following command can be used to list the contents of the «Desktop» directory within the current user’s home directory.

ls $HOME/Desktop

For the sake of completeness: If you want to print the names and values also of the non-exported shell variables, i.e. not only the environment variables, this is one way:

( set -o posix ; set ) | less

Desktop environment specifics

If you use a terminal window to examine environment variables, you actually study the environment variables of the shell that is running in the terminal. Those variables are not necessarily available in the graphical environment of the desktop. To examine the environment variables that are effective when you for instance start an application from the launcher, you can follow the guidance in this Ask Ubuntu answer.

Erasing environment variables

While simply setting an empty value to an environment variable, as shown in the example below, may nullify its effect in most cases, there are a few variables such as «POSIXLY_CORRECT» whose mere existence, even with an empty value, influences the behavior of programs.

export LC_ALL=

The unset command can be used in order to completely erase the existence of an environment variable:

unset LC_ALL

It is also possible to use the «-n» switch to the export command in order to un-export an environment variable and therefore demote it to become a shell variable while preserving its value.

export -n LC_ALL

Working principles of environment variables

A few simple principles govern how environment variables work and achieve their effect.

Process locality

The values of environment variables are local, which means they are specific to the running process in or for which they were set. This means that if we open two terminal windows (which means we have two separate bash processes running), and change a value of an environment variable in one of the windows, that change will not be seen by the shell in the other window or any other program currently on the desktop.

Inheritance

When a parent process creates a child process, for example when we run the «gedit» command from the terminal and «bash» (the parent process) creates «gedit» (the child process), the child process inherits all the environment variables and values the parent process had.

This means that if we set a new value to the «LANG» environment variable in the terminal, and then run «gedit» from that same terminal, «gedit» will inherit the new value of «LANG», and therefore may display in a different language than the rest of the processes on the desktop. (See The LANGUAGE priority list, though.)

Note that because of the Process Locality principle explained above, once we run Gedit, changes to environment variables of the parent process will not be seen by the child process and vice-versa.

Note: in the Gnome graphical desktop environment, gnome-session is the parent process of all the processes running on the desktop. This fact (along with the Inheritance principle) is the key to our ability to powerfully influence the operation of our desktop with environment variables. The equivalent process in KDE is kde-session.

Case sensitivity

The names of environment variables are case sensitive. This means that lang is not the same variable as LANG, Lang, or laNg.

It is a common practice to name all environment variables with only English capital letters and underscore (_) signs.

Bash’s quick assignment and inheritance trick

The bash shell has a trick to allow us to set one or more environment variables and run a child process with single command. For example, in order to set the «LANGUAGE» and «FOO» environment variables and then run «gedit», we would use the following command:

LANGUAGE=he FOO=bar gedit

Note: When using this command, the new values are only assigned to the environment variables of the child process (in this case gedit). The variables of the shell retain their original values. For instance, in the example above, the value of «LANGUAGE» will not change from its original value, as far as subsequent commands to the shell are concerned.

A similar behaviour can be achieved with other shells by using the env command.

Persistent environment variables

So far we’ve only discussed ways set an environment variable value temporarily until the shell session in which it was set is closed. One may wonder if there is a way to somehow permanently set an environment variable to a certain value.

Session-wide environment variables

Suitable files for environment variable settings that should affect just a particular user (rather than the system as a whole) are ~/.pam_environment and ~/.profile. After having edited one of those files, you should re-login in order to initialize the variables.

~/.pam_environment

This file is specifically meant for setting a user’s environment. It is not a script file, but rather consists of assignment expressions, one per line. This example sets the variable FOO to a literal string and modifies the PATH variable:

FOO=bar
PATH DEFAULT=${PATH}:/home/@{PAM_USER}/MyPrograms

Note:

  • When doing a simple variable assignment like the FOO=bar example, quotes have not special meaning. This means that values cannot contain spaces.

  • The syntax used for modifying PATH, which differs from the syntax of shell script files, is required for variable expansion to work. Some variables, like HOME, might not be set at the time ~/.pam_environment is parsed. See /etc/security/pam_env.conf for more details.

  • ~/.pam_environment is written to when you use various GUIs to set the language or regional formats. Consequently, if you for instance set LC_TIME by editing ~/.pam_environment manually, your entry will be overwritten if you afterwards use the Language Support GUI to change the regional formats setting.

~/.profile

In this file you can also place environment variable assignments, since it gets executed automatically by the DisplayManager during the start-up process desktop session as well as by the login shell when one logs in from the textual console. This is a ~/.profile equivalent of the above example:

export FOO=bar
export PATH="$PATH:$HOME/MyPrograms"

Note: The code in ~/.profile is run after ~/.pam_environment has been read. That makes ~/.profile suitable to use if you want to override a locale related variable that was set in ~/.pam_environment via e.g. Language Support.

Other files

If you are using KDE, see also the KDE User-base page on this topic.

Shell config files such as ~/.bashrc, ~/.bash_profile, and ~/.bash_login are often suggested for setting environment variables. While this may work on Bash shells for programs started from the shell, variables set in those files are not available by default to programs started from the graphical environment in a desktop session.

System-wide environment variables

A suitable file for environment variable settings that affect the system as a whole (rather than just a particular user) is /etc/environment. An alternative is to create a file for the purpose in the /etc/profile.d directory.

/etc/environment

This file is specifically meant for system-wide environment variable settings. It is not a script file, but rather consists of assignment expressions, one per line.

FOO=bar

Note: Variable expansion does not work in /etc/environment.

/etc/profile.d/*.sh

Files with the .sh extension in the /etc/profile.d directory get executed whenever a bash login shell is entered (e.g. when logging in from the console or over ssh), as well as by the DisplayManager when the desktop session loads.

You can for instance create the file /etc/profile.d/myenvvars.sh and set variables like this:

export JAVA_HOME=/usr/lib/jvm/jdk1.7.0
export PATH=$PATH:$JAVA_HOME/bin

Other files

While /etc/profile is often suggested for setting environment variables system-wide, it is a configuration file of the base-files package, so it’s not appropriate to edit that file directly. Use a file in /etc/profile.d instead as shown above. (Files in /etc/profile.d are sourced by /etc/profile.)

/etc/default/locale is specifically meant for system-wide locale environment variable settings. It’s written to by the installer and when you use Language Support to set the language or regional formats system-wide. On a desktop system there is normally no reason to edit this file manually.

The shell config file /etc/bash.bashrc is sometimes suggested for setting environment variables system-wide. While this may work on Bash shells for programs started from the shell, variables set in that file are not available by default to programs started from the graphical environment in a desktop session.

sudo caveat

Any variables added to these locations will not be reflected when invoking them with a sudo command, as sudo has a default policy of resetting the Environment and setting a secure path (this behavior is defined in /etc/sudoers). As a workaround, you can use sudo su that will provide a shell with root privileges but retaining any modified PATH variables. Alternatively you can setup sudo not to reset certain environment variables by adding some explicit environment settings to keep in /etc/sudoers:

  • Run sudo visudo

  • Add the following to the bottom:
Defaults env_keep += "http_proxy SOMEOTHERVARIABLES ANOTHERVARIABLE ETC"

Launching desktop application with an environment variable

You can add an environment variable to an application by editing its .desktop file. For example, to run «digiKam» with the environment variable APPMENU_DISPLAY_BOTH=1, find the corresponding digikam.desktop file and add the setting of the variable, via the env command, to the entry «Exec»:

Exec=env APPMENU_DISPLAY_BOTH=1 digikam -caption "%c" %i

List of common environment variables

Each application is free to define and use its own environment variables. Many manual pages include long lists of environment variables that can affect the behaviour of the application they describe. However, the most useful variables are common to many applications.

The following variables determine how the system locates various files in order to operate.

Variable

Value Examples

What it’s for

PATH

/usr/sbin:/usr/bin:/sbin:/bin

When you type a command to run, the system looks for it in the directories specified by PATH in the order specified

MANPATH

/usr/share/man:/usr/local/man

List of directories for the system to search manual pages in

LD_LIBRARY_PATH

/opt/app/oracle/lib

List of directories where the system searches for runtime libraries in addition to those hard-defined by ld and in /etc/ld.so.conf.d/*.conf files. Note: You can only set this environment variable inside an interactive shell. Since Ubuntu 9.04 Jaunty Jackalope, LD_LIBRARY_PATH cannot be set in $HOME/.profile, /etc/profile, nor /etc/environment files. You must use /etc/ld.so.conf.d/*.conf configuration files. See Launchpad bug #366728 for more information.

TMPDIR

/var/tmp

The directory used for temporary file creation by several programs

Locale setting variables

The following environment variables determine the locale-related behaviour of the systems such as the language of displayed messages and the way times and dates are presented.

The values that can be assigned to the locale environment variables are names of locales generated on the system. To see which locales have been generated, one can use the locale -a command.

When you install a language in Ubuntu using Language Support, locales for that language are generated automatically. Otherwise locales can be generated with the locale-gen command.

Variable

What it’s for

LANG

The basic language setting used by applications on the system, unless overridden by one of the other locale environment variables

LC_CTYPE

The character set used to display and input text

LC_NUMERIC

How non-monetary numeric values are formatted on screen

LC_TIME

How date and time values are formatted

LC_COLLATE

How to sort various information items (e.g. defines the order of the alphabet so items can be ordered alphabetically by the sort command)

LC_MONETARY

How monetary numeric values are formatted

LC_MESSAGES

Which language is to display messages to the end user

LC_PAPER

Definitions of paper formats and standards

LC_NAME

How names are formatted

LC_ADDRESS

How to display address information

LC_TELEPHONE

How telephone numbers are structured

LC_MEASUREMENT

What units of measurement are used

LC_IDENTIFICATION

Metadata about the locale information

LC_ALL

This variable serves as a powerful override over all the other locale environment variables. When its value is set, applications use that value to determine which locale settings to use regardless of the values of the other variables.
Note: Do not set this variable persistently on a desktop system. If you do, you effectively disable the GUIs for controlling language and locales.

By utilizing various combinations of settings for the locale variables, you can make interesting tweaks to the behaviour of your system. For example, you can make your system display message in US-English while using number, date, and measurement formats that are more common to European countries. The Language Support GUI makes that distinction by design.

The locale variables can effectively override each other’s value in some combinations. Therefore examining the values of the variables themselves may not always provide clear indication of how the system will behave. The locale command can be used to examine what the effective values are to the applications.

The LANGUAGE priority list

The «LANGUAGE» environment variable, which is set by the GUIs more often than not on Ubuntu desktops, controls language for message and menu display for GNU compatible applications. For such applications it overrides whatever locale names are set in «LANG» and «LC_MESSAGES».

Unlike «LANG» and «LC_*», «LANGUAGE» should not be assigned a complete locale name including the encoding part (e.g. «.UTF-8»). Instead «LANGUAGE» should contain a colon separated priority list of language codes, for instance «es:de:en». A single language code is also correct.

Preferred application variables

These environment variables indicate to various programs what the user’s preferred applications are for performing certain tasks.

These variables are typically not respected by GUI applications that tend to include their own built-in text display windows and editors. Most desktop environments also contain their own preferred application selection system.

Variable

Value Examples

What it’s for

PAGER

/usr/bin/less

The name of the utility used to display long text by commands such as man.

EDITOR

/usr/bin/nano

The name of the user’s preferred text editor. Used by programs such as the mutt mail client and sudoedit.

VISUAL

/usr/bin/gedit

Similar to the «EDITOR» environment variable, applications typically try the value in this variable first before falling back to «EDITOR» if it isn’t set.

BROWSER

/usr/bin/lynx

The name of the user’s preferred web browser. This variable is arguably less common than the rest

Variable

Value Examples

What it’s for

DISPLAY

:0.0
localhost:10.0
terminal01:0.0

This variable is used to indicate to graphical applications where to display the actual graphical user interface, the value consists of 3 parts: A host-name followed by a colon (:), a display number followed by a dot (.) and a screen number. The host-name part can be used to have the graphical output sent to a remote machine over the network. It can be omitted when the output is meant for an X server running on the local machine. The display number allows selecting among multiple X servers running on the same machine (Ubuntu uses multiple X servers to enable multiple graphical desktop sessions). Although the screen number is used to select among multiple physical screen that are managed by the same X server, it is rarely set to anything other than «0» nowadays. Manually setting the «DISPLAY» environment variable’s value is rarely needed nowadays since it can be automatically and intelligently adjusted by many applications such as «GDM» and «SSH» when needed.

XDG_DATA_HOME

~/.local/share

Indicates to applications that conform to the freedesktop.org specifications, where to place the user’s private data. This variable is typically unset since a sensible default fall-back value was defined by the specifications.

XDG_CONFIG_HOME

~/.config

Indicates to applications that conform to the freedesktop.org specifications, where to place the user’s configuration information. This variable is typically unset since a sensible default fall-back value was defined by the specifications.

XDG_DATA_DIRS

/usr/local/share:/usr/share

A colon-separated list (similar to «PATH») of directories where data is searched for by applications that conform to the freedesktop.org specifications. This variable is typically unset since a sensible default fall-back value was defined by the specifications.

XDG_CONFIG_DIRS

/etc/xdg

A colon-separated list (similar to «PATH») of directories where configuration information is searched for by applications that conform to the freedesktop.org specifications. This variable is typically unset since a sensible default fall-back value was defined by the specifications.

XDG_CACHE_HOME

~/.cache

A location used by applications that conform to the freedesktop.org specifications to cache temporary data. This variable is typically unset since a sensible default fall-back value was defined by the specifications.

Gnome-specific variables

Variable

Value Examples

What it’s for

NAUTILUS_SCRIPT_SELECTED_FILE_PATHS

/home/ifireball/about.html

This environment variable is set by Nautilus, the Gnome file manager, to a newline-delimited list of the currently selected files, when a script is invoked from the right-click menu. This variable is only set if the files are local, e.g. not from a network share or an SSH connection

NAUTILUS_SCRIPT_SELECTED_URIS

file:///home/ifireball/about.html

This environment variable is set by Nautilus to a newline-delimited list of the URI addresses of the currently selected files, when a script is invoked from the right-click menu.

NAUTILUS_SCRIPT_CURRENT_URI

file:///home/ifireball

This environment variable is set to the URI address of the location currently displayed by the Nautilus window, when a script is invoked from the right-click menu.

NAUTILUS_SCRIPT_WINDOW_GEOMETRY

828×511+251+342

This environment variable is set to the on-screen position of the Nautilus window, when a script is invoked from the right-click menu.

Program execution variables

Arguably the most powerful (but dangerous) environment variables, the following allow tweaking the basic way software actually runs.

Variable

Value Examples

What it’s for

LD_PRELOAD

/usr/lib/valgrind.so

This variable can be used to inject a custom dynamic library into an application’s memory when it loads. It can be used to do things like replacing the application’s built-in memory allocation library with a debugging version in order to detect memory leaks. It can also be used to override the way it does various things like play sounds.

Variable

Value Examples

What it’s for

CC

gcc

The name of the C compiler to use

CXX

g++

The name of the C++ compiler to use

CFLAGS

-o out.o

A list of debugging/optimization flags to pass to the C compiler

CXXFLAGS

-Wall

A list of debugging/optimization flags to pass to the C++ compiler

CPPFLAGS

-DDEBUG

A list of flags to pass to the C/C++ pre-processor/compiler

LIBRARY_PATH

/usr/lib/firefox

A list of directories (separated by colons) in which library files should be searched for

INCLUDE

/opt/app/src/include

A colon-separated list of directories in which header files should be searched for

CPATH

..:$HOME/include:/usr/local/include

A colon-separated list of directories in which header files should be searched for

Other environment variables

Variable

Value Examples

What it’s for

USER

myuser1

The name of the currently logged-in user. This variable is set by the system. You probably shouldn’t change its value manually.

LOGNAME

myuser1

Similar to «USER», some programs prefer to read this variable rather than USER.

HOME

/home/myuser1

The location of the currently logged-in user’s home directory.

PWD

/home/myuser1/Desktop

The current working directory of the shell.

SHELL

/bin/bash

The user’s preferred command-line shell as it is set in the /etc/passwd file.

POSIXLY_CORRECT

N/A

If this environment variable exists, regardless of its value, it causes the behaviour of quite a few utilities to more closely match the behaviour defined by the POSIX standard. This typically makes various GNU extensions that make life easier not work, but it may just be what’s needed to make an old UNIX script execute successfully.

HOSTALIASES

/etc/host.aliases

The name of a file containing host-name aliases for use with various network programs.

TZDIR

/usr/share/zoneinfo

The path of the directory containing time-zone information files. This typically does not need to be set manually, as the system searches for such files in /usr/share/zoneinfo by default.

TZ

IST-2
:Japan

This variable was used by older UNIX systems to specify the system’s time-zone. However, Ubuntu and most other modern systems use the /etc/localtime file for that purpose. This variable can, however, be used to make one user’s particular session display times in a different time-zone than the rest of the system.
The value of this variable can either be the name and offset of a time-zone (as seen in the first example) or the name of a zone-info file in /usr/share/zoneinfo (as seen in the second example).

TERM

xterm

The name of a terminal information file from /lib/terminfo, this file instructs terminal programs how to achieve things such as displaying color. It may help to fiddle with this variable if you’re trying use an odd terminal emulator program or trying to connect a hardware serial-port terminal emulator and getting undesired results.

TERMCAP

This variable can be used instead of «TERM» to manually specify terminal information rather than point to a file.

COLUMNS

80

The number of text columns in the terminal window. Try adjusting this variable if lines don’t seem to wrap properly in the console.

LINES

25

The number of text lines on the console window. Try adjusting this variable if you’re getting strange results when scrolling text.

SDL_VIDEO_FULLSCREEN_DISPLAY

0

In multiple monitor setups, such as Xinerama or TwinView, this sets which screen to use for full-screen mode for SDL applications/games. If unset all screens are used.


CategoryX CategoryCommandLine

Содержание

  • Работа с переменными окружения в Linux
    • Конфигурационные файлы для пользовательских и системных переменных
    • Просмотр списка системных переменных окружения
    • Список основных системных и пользовательских переменных окружения
    • Запуск команд с указанием нового значения переменной окружения
    • Установка и удаление локальных переменных окружения
    • Добавление и удаление пользовательских переменных
    • Создание и удаление системных переменных окружения
  • Вопросы и ответы

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

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

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

  1. Системные переменные. Эти опции загружаются сразу же при старте операционной системы, хранятся в определенных конфигурационных файлах (речь о них будет идти ниже), а также доступны для всех пользователей и всей ОС в целом. Обычно такие параметры считаются самыми главными и часто используемыми во время старта самых различных приложений.
  2. Пользовательские переменные. Каждый пользователь имеет свою домашнюю директорию, где хранятся все важные объекты, к их числу относятся и конфигурационные файлы пользовательских переменных. Из их названия уже понятно, что применяются они под конкретного юзера в то время, когда он авторизован через локальный «Терминал». Действуют они и при удаленном соединении.
  3. Локальные переменные. Существуют параметры, применяемые только в рамках одной сессии. При ее завершении они будут навсегда удалены и для повторного старта все придется создавать вручную. Они не сохраняются в отдельных файлах, а создаются, редактируются и удаляются при помощи соответствующих консольных команд.

Конфигурационные файлы для пользовательских и системных переменных

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

  • /ETC/PROFILE — один из системных файлов. Доступен для всех пользователей и всей системы даже при удаленном входе. Единственное ограничение для него — параметры не принимаются при открытии стандартного «Терминала», то есть в этом расположении никакие значения из этой конфигурации работать не будут.
  • /ETC/ENVIRONMENT — более широкий аналог предыдущей конфигурации. Он функционирует на системном уровне, имеет те же опции, что и предыдущий файл, но теперь без каких-либо ограничений даже при удаленном подключении.
  • /ETC/BASH.BASHRC — файл только для локального использования, при удаленной сессии или соединении через интернет функционировать он не будет. Выполняется для каждого юзера отдельно при создании новой терминальной сессии.
  • .BASHRC— относится к конкретному юзеру, хранится в его домашней директории и выполняется каждый раз при новом запуске терминала.
  • .BASH_PROFILE — то же, что .BASHRC, только для удаленного взаимодействия, например, при использовании SSH.

Читайте также: Установка SSH-server в Ubuntu

Просмотр списка системных переменных окружения

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

  1. Запустите «Терминал» через меню или зажатием горячей клавиши Ctrl + Alt + T.
  2. Запуск терминала для работы с переменными окружения в Linux

  3. Пропишите команду sudo apt-get install coreutils, чтобы проверить наличие данной утилиты у вас в системе и сразу же установить ее при надобности.
  4. Установка утилиты для работы с переменными окружения в Linux

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

  7. Вы будете уведомлены о добавлении новых файлов или их наличии в библиотеках.
  8. Завершение установки утилиты для переменной окружения в Linux

  9. Теперь воспользуйтесь одной из команд установленной утилиты Coreutils, чтобы раскрыть список всех переменных окружения. Напишите printenv и нажмите на клавишу Enter.
  10. Просмотр всех переменных окружения в Linux

  11. Ознакомьтесь со всеми параметрами. Выражение до знака = — название переменной, а после — ее значение.
  12. Ознакомление с параметрами и их значениями через просмотр переменных в Linux

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

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

  • DE. Полное название — Desktop Environment. Содержит имя текущего окружения рабочего стола. В операционных системах на ядре Linux используются различные графические оболочки, поэтому приложениям важно понимать, какая сейчас активна. В этом и помогает переменная DE. Пример ее значений — gnome, mint, kde и так далее.
  • PATH — определяет список директорий, в которых происходит поиск различных исполняемых файлов. Например, при действии одной из команд по поиску и доступу к объектам они обращаются к этим папкам для быстрого поиска и передачи исполняемых файлов с указанными аргументами.
  • SHELL — хранит в себе опцию активной командной оболочки. Такие оболочки позволяют пользователю самостоятельно прописывать определенные скрипты и запускать различные процессы с помощью синтаксисов. Самой популярной оболочкой считается bash. Список остальных распространенных команд для ознакомления вы найдете в другой нашей статье по следующей ссылке.
  • Читайте также: Часто используемые команды в «Терминале» Linux

  • HOME — здесь все достаточно просто. Данный параметр указывает путь к домашней папке активного юзера. У каждого юзера он разный и имеет вид: /home/user. Объяснение этому значению тоже легкое — эта переменная, например, используется программами для установления стандартного места расположения их файлов. Конечно, примеров существует еще огромное количество, но для ознакомления этого достаточно.
  • BROWSER — содержит в себе команду для открытия веб-обозревателя. Именно эта переменная чаще всего и определяет браузер по умолчанию, а все остальные утилиты и ПО обращаются к указанной информации для открытия новых вкладок.
  • PWD и OLDPWD. Все действия из консоли или графической оболочки происходят из определенного расположения в системе. Первый параметр отвечает за текущее нахождение, а второй показывает предыдущее. Соответственно, их значения меняются достаточно часто и хранятся как в пользовательских конфигурациях, так и в системных.
  • TERM. Программ-терминалов для Linux существует большое количество. Упомянутая переменная хранит в себе информацию о названии активной консоли.
  • RANDOM — содержит в себе скрипт, генерирующий каждый раз случайное число от 0 до 32767 при обращении к этой переменной. Такая опция позволяет другому софту обходиться без собственного генератора случайных чисел.
  • EDITOR — отвечает за открытие редактора текстовых файлов. Например, по умолчанию вы можете встретить там путь /usr/bin/nano, но ничего вам не мешает изменить его на любой другой. За более сложные действия с тестом отвечает VISUAL и запускает, например, редактор vi.
  • HOSTNAME — имя компьютера, а USER — имя текущей учетной записи.

Запуск команд с указанием нового значения переменной окружения

Можете самостоятельно на время изменить опцию любого параметра, чтобы запустить с ним определенную программу или выполнить любые другие действия. В таком случае в консоли вам будет достаточно прописать env VAR=VALUE, где VAR — название переменной, а VALUE — ее значение, например, путь к папке /home/user/Download.

Lumpics.ru

Запустить команду с присвоением нового значения переменной окружения в Linux

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

Временное значение переменной окружения в Linux

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

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

  1. Запустите «Терминал» и напишите команду VAR=VALUE, после чего нажмите на клавишу Enter. Как обычно, VAR — любое удобное название переменной одним словом, а VALUE — значение.
  2. Записать новую локальную переменную окружения в Linux

  3. Проверьте действенность произведенных действий, введя echo $VAR. Строчкой ниже вы должны получить опцию переменной.
  4. Проверить работу локальной переменной окружения в Linux

  5. Удаляется любой параметр командой unset VAR. Проверить удаление можно также через echo (следующая строка должна быть пустой).
  6. Удалить локальную переменную окружения в Linux

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

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

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

  1. Откройте пользовательскую конфигурацию через sudo gedit .bashrc. Мы предлагаем использовать графический редактор с обозначением синтаксиса, например, gedit. Однако указать можно любой другой, например, vi либо nano.
  2. Запустить пользовательский конфигурационный файл переменных окружения в Linux

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

  5. В конце файла добавьте строку export VAR=VALUE. Количество таких параметров ничем не ограничивается. Кроме всего, вы можете изменить значение уже присутствующих переменных.
  6. Добавить переменную в конфигурационный файл пользователя в Linux

  7. После внесения изменений сохраните их и закройте файл.
  8. Сохранить изменения конфигурационного файла пользователя в Linux

  9. Обновление конфигурации произойдет после повторного старта файла, а делается это через source .bashrc.
  10. Перезапустить конфигурационный файл пользователя Linux

  11. Проверить активность переменной можно через ту же опцию echo $VAR.
  12. Проверить значение переменной файла пользователя в Linux

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

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

Осталось только затронуть третий класс переменных — системные. Редактироваться для этого будет файл /ETC/PROFILE, который остается активным даже при удаленном подключении, например, через известный многим менеджер SSH. Открытие конфигурационного элемента осуществляется примерно так же, как и в предыдущем варианте:

  1. В консоли введите sudo gedit /etc/profile.
  2. Запустить системный конфигурационный файл переменных в Linux

  3. Внесите все необходимые изменения и сохраните их, нажав на соответствующую кнопку.
  4. Редактировать системную конфигурацию переменных в Linux

  5. Перезапустите объект через source /etc/profile.
  6. Перезапустить системную конфигурацию переменных в Linux

  7. По окончании проверьте работоспособность через echo $VAR.
  8. Проверить работу системной переменной окружения в Linux

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

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

Статья написана студентом Хекслета. Мнение автора может не совпадать с позицией редакции

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

  • Введение
  • Как работает окружение и его переменные
  • Вывод переменных оболочки и окружения
    • Общие переменные окружения и консольной оболочки
  • Установка переменных окружения и оболочки
    • Создание переменной оболочки
    • Создание переменной окружения
  • Отвязка переменный
  • Установка переменных окружения по логину
    • Различие между логин, не-логин, интерактивной и не-интерактивной сессией оболочки
    • Реализация переменных окружения
  • Заключение

Введение

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

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

Как работает окружение и его переменные

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

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

KEY=value1:value2:...

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

KEY="value with spaces"

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

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

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

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

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

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

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

printenv
XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/rgt
USER=rgt
DESKTOP_SESSION=cinnamon
GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/782e62a7_614a_44c6_a444_cecbdf372225
DEFAULTS_PATH=/usr/share/gconf/cinnamon.default.path
QT_QPA_PLATFORMTHEME=qt5ct
PWD=/home/rgt
HOME=/home/rgt
SSH_AGENT_PID=1365
QT_ACCESSIBILITY=1
XDG_SESSION_TYPE=x11
XDG_DATA_DIRS=/usr/share/cinnamon:/usr/share/gnome:/home/rgt/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
NVM_IOJS_ORG_MIRROR=https://iojs.org/dist
XDG_SESSION_DESKTOP=cinnamon
LC_ADDRESS=ru_RU.UTF-8
LC_NUMERIC=ru_RU.UTF-8
GTK_MODULES=gail:atk-bridge
PAPERSIZE=a4
TERM=xterm-256color
SHELL=/bin/bash
VTE_VERSION=5202
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
XDG_CURRENT_DESKTOP=X-Cinnamon
GPG_AGENT_INFO=/run/user/1000/gnupg/S.gpg-agent:0:1
GNOME_TERMINAL_SERVICE=:1.124
NVM_NODEJS_ORG_MIRROR=https://nodejs.org/dist
XDG_SEAT=seat0
SHLVL=1
LANGUAGE=en_US
LC_TELEPHONE=ru_RU.UTF-8
GDMSESSION=cinnamon
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
LOGNAME=rgt
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
XDG_RUNTIME_DIR=/run/user/1000
XAUTHORITY=/home/rgt/.Xauthority
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0
XDG_CONFIG_DIRS=/etc/xdg/xdg-cinnamon:/etc/xdg
PATH=/home/rgt/.gems/bin:/home/rgt/.npm-global-modules/bin:/home/rgt/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/elixir/bin:/home/rgt/.racket/bin
LC_IDENTIFICATION=ru_RU.UTF-8
PS1=$ 
SESSION_MANAGER=local/rgt-laptop:@/tmp/.ICE-unix/1301,unix/rgt-laptop:/tmp/.ICE-unix/1301
LESSOPEN=| /usr/bin/lesspipe %s
LC_TIME=en_US.UTF-8
_=/usr/bin/printenv

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

$ printenv SHELL
/bin/bash
$ printenv USER
rgt

С другой стороны env позволяет изменять окружение, указывая определение переменной. Например:

env VAR1="value VAR1" command_to_run command_option

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

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

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

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

$ set | head
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_VERSINFO=([0]="2" [1]="8")
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="4" [2]="19" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")

Вывод этой команды довольно огромен. Для удобства работы с этими переменными можно использовать пейджеры more или less.

В принципе, отсутствует особая необходимость знать все функции, определенные для 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!'
$ bash                # создание новой дочерней сессии
$ set | grep TEST_VAR # делаем поиск переменной
$                     # вывод пуст

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

$ printenv | grep TEST_VAR
$ # вывод пуст

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

$ echo $TEST_VAR
Hello World!

Команда echo делает вывод введенной строки как аргумента. Но, в данном случае применяется знак $, в совокупности с ключом переменной, который возвращает ее значение.

Создание переменной окружения

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

$ export TEST_VAR
$ 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"
$ exit # делаем выход из текущего процесса и возвращаемся в родительский
$ echo $NEW_VAR
$ # ничего

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

Отвязка переменный

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

$ export -n TEST_VAR

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

$ printenv | grep TEST_VAR

При этом она до сих пор существует в переменной оболочки:

$ set | grep TEST_VAR
TEST_VAR='Hello World!'

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

$ unset TEST_VAR

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

$ echo $TEST_VAR

Отсутствует какое-либо возвращаемое значение, потому что переменная была отвязана.

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

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

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

Различие между логин, не-логин, интерактивной и не-интерактивной сессией оболочки

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

Логин-сессия оболочки запускается по аутентификации пользователя. Если пользователь входит в сессию терминала или через SSH и аутентифицируется, тогда эта сессия оболочки будет определена как логин-оболочка.

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

Помимо этих типов сессий, существуют интерактивный и не-интерактивный подход. Первый прикрепляется к терминалу, второй же — наоборот.

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

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

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

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

Читаются исключительно файлы, которые располагаются в ~/.bash_profile, ~/.bash_login и ~/.profile.

В не-логин сессии оболочка читает файл /etc/bash.bashrc и пользовательский ~/.bashrc файл для построения своего окружения.

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

Реализация переменных окружения

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

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

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

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

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

export VARNAME=value

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

$ source ~/.bashrc

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

Заключение

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

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

Статья была переведена отсюда.

Состояние перевода: На этой странице представлен перевод статьи Environment variables. Дата последней синхронизации: 26 октября 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Переменная окружения — именованный объект, содержащий текстовую информацию, которую могут использовать запускаемые программы. Проще говоря, это переменная с именем и значением. Значением такой переменной может быть, например, место размещения исполняемых файлов в системе, имя предпочитаемого текстового редактора или настройки системной локали. Новые в Linux пользователи часто находят такой способ хранения настроек неудобным. Однако переменные окружения позволяют простым и надёжным способом передавать настройки сразу для множества приложений.

Утилиты

Пакет coreutils содержит программы printenv и env. Программа printenv позволяет отобразить список текущих переменных окружения:

$ printenv

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

Программа env может быть использована для запуска команд с указанием нового значения переменной окружения. В следующем примере будет запущен xterm, для которого переменная окружения EDITOR имеет значение vim. Такой вызов не затронет переменную окружения EDITOR в текущем сеансе терминала.

$ env EDITOR=vim xterm

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

Чтобы увидеть переменные окружения конкретных процессов, откройте файл /proc/pid/environ, где pid — числовой идентификатор интересующего процесса. Записи в этом файле отделены друг от друга нулевым байтом (x0), который обычно не виден в терминале. Вы можете использовать, например, sed для отображения переменных окружения процесса в более читабельном формате, заменив нулевые байты на переносы строки: sed 's:x0:n:g' /proc/$PID/environ

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

На системном уровне

Большинство дистрибутивов Linux советуют изменять или добавлять переменные окружения в /etc/profile или других местах. Имейте в виду, что сразу множество файлов могут содержать переменные окружения и переопределять их, вроде /etc/locale.conf. По сути, любой скрипт может быть использован для этого, однако по принятым в UNIX соглашениям следует использовать для этого только определённые файлы.

Для установки переменных окружения на уровне всей системы можно использовать следующие файлы (каждый со своими ограничениями):

  • /etc/environment используется модулем pam_env. Он не привязан к командным оболочкам, поэтому скрипты или glob-выражения использовать здесь нельзя. Здесь можно указывать только пары имя=значение.
  • /etc/profile устанавливает переменные только в оболочках входа (когда пользователь выполняет вход в систему). В нём можно запускать скрипты и он может использоваться в оболочках, совместимых с Bourne shell.
  • Файлы настроек, специфичные для конкретных командных оболочек — глобальные файлы для вашей командной оболочки, инициализирует переменные и запускает скрипты. Например, Bash (Русский)#Файлы настроек или Zsh (Русский)#Файлы Запуска/Завершения.

Ниже приведён пример скрипта, который создаёт функцию для добавления нескольких каталогов (например, ~/bin и ~/scripts) в PATH. Чтобы это сделать, просто поместите код в один из системных файлов инициализации окружения (/etc/profile или /etc/bash.bashrc):

set_path(){

    # Проверяем, что id пользователя 1000 или больше
    [ "$(id -u)" -ge 1000 ] || return

    for i in "$@";
    do
        # Проверяем существование каталога
        [ -d "$i" ] || continue

        # Проверяем, что его ещё нет в $PATH.
        echo "$PATH" | grep -Eq "(^|:)$i(:|$)" && continue

        # Затем добавляем в $PATH и экспортируем переменную
        export PATH="${PATH}:$i"
    done
}

set_path ~/bin ~/scripts

На уровне пользователя

Не всегда требуется устанавливать переменные окружения на уровне системы. Например, вы можете добавить ваш каталог /home/пользователь/bin в PATH, однако не хотите, чтобы это затрагивало других пользователей системы. Переменные окружения пользователя можно устанавливать во многих других файлах:

  • Файлы инициализации командной оболочки, например Bash (Русский)#Файлы настроек или Zsh (Русский)#Файлы Запуска/Завершения.
  • Пользовательские переменные окружения systemd считываются из файлов ~/.config/environment.d/*.conf.

Например, чтобы добавить каталог в PATH, поместите следующее в ~/.bash_profile:

export PATH="${PATH}:/home/пользователь/bin"

Для применения изменений перезайдите в командную оболочку или используйте команду source: $ source ~/.bash_profile.

Примечание: Демон dbus и пользовательский экземпляр systemd не наследуют никакие переменные окружения из мест вроде ~/.bashrc. Это означает, что, например, активируемые через dbus программы вроде Gnome Files не будут использовать их по умолчанию. Смотрите systemd/Пользователь#Переменные окружения.

Графические приложения

Если переменная окружения влияет только на графические приложения, можно ограничить область её применения, установив её только в рамках графического сеанса.

Чтобы установить переменные окружения только для определённого приложения вместо целого сеанса, измените .desktop файл этого приложения. Смотрите Ярлыки приложений#Изменение переменных окружения.

Использование скрипта запуска

Некоторые графические окружения (например, KDE Plasma), поддерживают запуск скриптов при входе: можно использовать их для установки переменных окружения. Пример есть в статье KDE (Русский)#Автозапуск приложений.

Окружение Xorg

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

  • Большинство экранных менеджеров выполняют source файла xprofile.
  • startx и SLiM выполняют xinitrc.
  • XDM выполняет ~/.xsession; смотрите XDM (Русский)#Определение сеанса.
  • SDDM дополнительно выполняет source скриптов оболочек входа, вроде ~/.bash_profile для bash или ~/.zprofile и ~/.zlogin для zsh. [1]

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

~/.xprofile, ~/.xinitrc или ~/.xsession
...
export ПЕРЕМЕННАЯ=значение
...
Окружение Wayland

Так как Wayland не использует Xorg-специфичные файлы, GDM и KDE Plasma вместо них загружают пользовательские переменные окружения systemd.

~/.config/environment.d/envvars.conf
ПЕРЕМЕННАЯ=значение

Другие экранные менеджеры (например, SDDM) пока что не поддерживают это. Однако SDDM выполняет source скриптов оболочек входа и для сеансов Wayland тоже.

На уровне сеанса

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

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

$ export PATH="${PATH}:/home/my_user/tmp/usr/bin"

С помощью pam_env

PAM-модуль pam_env(8) загружает переменные для прописывания в окружение из этих файлов в указанном порядке: /etc/security/pam_env.conf и /etc/environment.

Примечание:

  • Эти файлы считываются перед другими файлами, в частности перед ~/.profile, ~/.bash_profile и ~/.zshenv.
  • Устаревший файл ~/.pam_environment больше не считывается. Смотрите FS#68945.

/etc/environment должен содержать только простые пары вида ПЕРЕМЕННАЯ=значение на отдельных строках, например:

EDITOR=nano

/etc/security/pam_env.conf имеет формат:

ПЕРЕМЕННАЯ [DEFAULT=значение] [OVERRIDE=значение]

@{HOME} и @{SHELL} являются специальными переменными, значение которых берётся из /etc/passwd. Следующий пример показывает, как использовать переменную HOME внутри другой переменной:

XDG_CONFIG_HOME   DEFAULT=@{HOME}/.config

Примечание: Переменные ${HOME} и ${SHELL} не связаны с переменными окружения HOME и SHELL, по умолчанию они не задаются.

Формат также позволяет расширить уже определённые переменные значениями из других переменных с помощью ${ПЕРЕМЕННАЯ} , например:

GOPATH DEFAULT=${XDG_DATA_HOME}/go

Пары ПЕРЕМЕННАЯ=значение тоже допускаются, но расширение переменных здесь не поддерживается. Подробнее смотрите pam_env.conf(5).

Примеры

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

  • XDG_CURRENT_DESKTOP — это переменная freedesktop.org, содержащая список разделённых двоеточиями строк, которыми идентифицируется среда рабочего стола [2]. Стандартные значения — GNOME, GNOME-Flashback, KDE, LXDE, LXQt, MATE, TDE, Unity, XFCE, EDE, Cinnamon и Pantheon [3].
    • Cinnamon был зарегистрирован позже других сред. В итоге некоторые приложения по-прежнему ожидают старое нестандартное значение X-CINNAMON, например Qt [4].
  • XDG_SESSION_DESKTOP похожа на XDG_CURRENT_DESKTOP, но допускает использование только одной строки. Несмотря на название, переменная не входит в стандарт freedesktop.org.
  • DE — более старая переменная для обозначения текущей среды рабочего стола (Desktop Environment). Её значения не стандартизированы, но можно ориентироваться на xdg-utils как на справочник типовых значений для многих сред рабочего стола.
  • DESKTOP_SESSION — ещё одна старая переменная, но используется реже, чем DE. Значение также может быть путём к файлу .desktop сеанса в каталоге /usr/share/xsessions/ [5].
  • WINDOW_MANAGER — переменная, иногда используемая для выбора оконного менеджера, который будет использоваться в среде рабочего стола. Это отличает её от других упомянутых здесь переменных, которые устанавливаются уже выбранным экранным менеджером или средой рабочего стола и используется для чтения другими программами.
  • PATH содержит список каталогов, разделённых двоеточиями, в которых система ищет исполняемые файлы. Когда обычная команда (например, ls, systemctl или pacman) интерпретируется командной оболочкой (например, bash или zsh), оболочка ищет исполняемый файл с указанным именем в каталогах из этого списка и, если находит, запускает файл, передав ему указанные аргументы командной строки. Чтобы запускать исполняемые файлы, пути к которым не находятся в PATH, необходимо указывать относительный или абсолютный путь к файлу, например ./a.out или /bin/ls.

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

  • HOME содержит путь к домашнему каталогу текущего пользователя. Эта переменная может использоваться приложениями для определения расположения файлов настроек пользователя, который их запускает.
  • PWD содержит путь к текущему рабочему каталогу.
  • OLDPWD содержит путь к предыдущему рабочему каталогу, то есть, значение PWD перед последним вызовом cd.
  • TERM содержит тип запущенного терминала, например xterm-256color. Это используется некоторыми программами, которые хотят знать возможности текущего терминала.
  • MAIL содержит путь к каталогу, где сохраняется входящая почта. Обычно имеет значение /var/spool/mail/$LOGNAME.
  • ftp_proxy и http_proxy содержат адреса прокси-серверов для протоколов FTP и HTTP соответственно:
ftp_proxy="ftp://192.168.0.1:21"
http_proxy="http://192.168.0.1:80"
  • MANPATH содержит разделённый двоеточиями список каталогов, которые использует man для поиска man-страниц.

Примечание: В /etc/profile есть комментарий «Man is much better than us at figuring this out», так что эту переменную обычно стоит не задавать. Смотрите manpath(5).

  • INFODIR содержит разделённый двоеточиями список каталогов, которые использует info для поиска info-страниц, например /usr/share/info:/usr/local/share/info.
  • TZ может использоваться для установки временной зоны. Можно ссылаться на файл из /usr/share/zoneinfo/, например TZ=":/usr/share/zoneinfo/Europe/Moscow", тогда перед путём к файлу должно стоять двоеточие (смотрите документацию GNU).

Программы по умолчанию

  • SHELL содержит путь к предпочитаемой командной оболочке текущего пользователя. Имейте в виду, что это не обязательно совпадает с текущей работающей оболочкой. Если значение не указано, Bash автоматически устанавливает в качестве её значения оболочку входа, прописанную в файле /etc/passwd, или /bin/sh, если это не удаётся определить.
  • PAGER указывает команду для запуска программы постраничного просмотра содержимого текстовых файлов, например, /bin/less.
  • EDITOR содержит команду для запуска программы для редактирования текстовых файлов, например /usr/bin/nano. Также можно задать специальную команду, которая будет выбирать редактор в зависимости от окружения, например, gedit в X или nano в терминале, как в этом примере:
[ -n "$DISPLAY" ] && export EDITOR=gedit || export EDITOR=nano
  • VISUAL позволяет указать имя продвинутого текстового редактора для более сложных задач, например, редактирования почты. Это могут быть vi, vim, emacs и т. д.
  • BROWSER содержит команду для запуска веб-браузера. Может быть полезно устанавливать это значение в зависимости от наличия графического окружения:
[ -n "$DISPLAY" ] && export BROWSER=firefox || export BROWSER=links

Совет: При прописывании программ по умолчанию также можно ориентироваться на переменную WAYLAND_DISPLAY, наличие которой указывает на то, что запущен Wayland-композитор.

Смотрите также

  • Gentoo:Handbook:X86/Working/EnvVar
  • Ubuntu Community Wiki — Environment Variables

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

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

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

Переменные имеют следующий формат:

KEY=value
KEY="Some other value"
KEY=value1:value2
 

  • Имена переменных чувствительны к регистру. По соглашению переменные среды должны иметь имена UPPER CASE.
  • При назначении нескольких значений переменной они должны быть разделены : символом двоеточия .
  • Вокруг = символа равенства нет места .

Переменные можно классифицировать на две основные категории: переменные среды и переменные оболочки.

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

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

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

  • env — Команда позволяет запускать другую программу в пользовательской среде без изменения текущей. При использовании без аргумента он напечатает список текущих переменных среды.
  • printenv — Команда печатает все или указанные переменные среды.
  • set — Команда устанавливает или отменяет переменные оболочки. При использовании без аргумента он напечатает список всех переменных, включая переменные окружения и оболочки, а также функции оболочки.
  • unset — Команда удаляет переменные оболочки и среды.
  • export — Команда устанавливает переменные среды.

Переменные среды списка 

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

Например, чтобы отобразить значение HOME переменной среды, вы должны выполнить:

printenv HOME 

Вывод выведет путь текущего пользователя, вошедшего в систему:

/home/linuxize
 

Вы также можете передать в printenv команду более одного аргумента:

printenv LANG PWD 
en_US
/home/linuxize
 

Если вы запустите команду printenv or env без аргументов, она покажет список всех переменных среды:

printenv 

Вывод будет выглядеть примерно так:

LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35;...
LESSCLOSE=/usr/bin/lesspipe %s %s
LANG=en_US
S_COLORS=auto
XDG_SESSION_ID=5
USER=linuxize
PWD=/home/linuxize
HOME=/home/linuxize
SSH_CLIENT=192.168.121.1 34422 22
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
SSH_TTY=/dev/pts/0
MAIL=/var/mail/linuxize
TERM=xterm-256color
SHELL=/bin/bash
SHLVL=1
LANGUAGE=en_US:
LOGNAME=linuxize
XDG_RUNTIME_DIR=/run/user/1000
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
LESSOPEN=| /usr/bin/lesspipe %s
_=/usr/bin/printenv
 

Ниже приведены некоторые из наиболее распространенных переменных среды:

  • USER — текущий вошедший в систему пользователь.
  • HOME — Домашний каталог текущего пользователя.
  • EDITOR — Используемый по умолчанию редактор файлов. Это редактор, который будет использоваться при вводе edit в вашем терминале.
  • SHELL — Путь к оболочке текущего пользователя, например, bash или zsh.
  • LOGNAME — имя текущего пользователя.
  • PATH — Список каталогов для поиска при выполнении команд. Когда вы запускаете команду, система будет искать эти каталоги в указанном порядке и использовать первый найденный исполняемый файл.
  • LANG — текущие настройки локалей.
  • TERM — Текущая эмуляция терминала.
  • MAIL — Место хранения почты текущего пользователя.

printenv И env команды печатают только переменные окружения. Если вы хотите получить список всех переменных, включая окружение, оболочку и переменные, а также функции оболочки, вы можете использовать set команду:

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

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

set | less 

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

echo $BASH_VERSION 
4.4.19(1)-release
 

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

Чтобы лучше проиллюстрировать разницу между переменными Shell и Environment, мы начнем с установки переменных Shell, а затем перейдем к переменным Environment.

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

MY_VAR='Linuxize' 

Вы можете проверить, что переменная установлена, используя любой echo $MY_VAR из фильтров вывода команды set с помощью grep set | grep MY_VAR :

echo $MY_VAR 
Linuxize
 

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

printenv MY_VAR 

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

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

bash -c 'echo $MY_VAR' 

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

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

export MY_VAR 

Вы можете проверить это, запустив:

printenv MY_VAR 
Linuxize
 

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

bash -c 'echo $MY_VAR' 
Linuxize
 

Вы также можете установить переменные среды в одну строку:

export MY_NEW_VAR="My New Var" 

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

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

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

  • /etc/environment — Используйте этот файл для настройки общесистемных переменных среды. Переменные в этом файле задаются в следующем формате:

    FOO=bar VAR_TEST="Test Var" 
    
    
  • /etc/profile — Переменные, установленные в этом файле, загружаются при каждом входе в оболочку bash. При объявлении переменных окружения в этом файле вам нужно использовать export команду:

    export JAVA_HOME="/path/to/java/home" export PATH=$PATH:$JAVA_HOME/bin 
    
    
  • Конфигурационные файлы для конкретных пользовательских оболочек. Например, если вы используете Bash, вы можете объявить переменные в ~/.bashrc :

    export PATH="$HOME/bin:$PATH" 
    
    

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

source ~/.bashrc 

Вывод

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

16 февраля, 2015 12:07 пп
19 161 views
| 1 комментарий

Linux, VPS

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

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

Данное руководство рассказывает, как взаимодействовать со средой и читать или устанавливать переменные среды и оболочки в интерактивном режиме и с помощью конфигурационных файлов. Все действия выполняются на 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=()
. . .

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

set | less

Этот список содержит огромное количество дополнительной информации, которая в данный момент не нужна (к примеру, некоторые функции 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:

exit

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

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

export TEST_VAR

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

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

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

exit

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

echo $NEW_VAR

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

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

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

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

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

export -n TEST_VAR

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

printenv | grep TEST_VAR

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

set | grep TEST_VAR
TEST_VAR='Hello World!'

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

unset TEST_VAR

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

echo $TEST_VAR

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

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

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

Это немного сложнее, чем кажется сначала, поскольку 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.

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

nano ~/.bashrc

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

export VARNAME=value

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

source ~/.bashrc

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

Итоги

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

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

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

Tags: Cloud Server, Linux, Ubuntu 12.04

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

Содержание

  1. Зачем нужны переменные окружения?
  2. Получение информации о переменных окружения
  3. Виды переменных окружения
  4. Системные переменные
  5. Пользовательские переменные
  6. Временные или переменные сеанса
  7. Установка переменных окружения

Зачем нужны переменные окружения?

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

Но как программы «узнают», где можно найти те или иные ресурсы? Из переменных окружения. Таким же образом происходит запуск и исполнение команд в командной консоли, т. к. благодаря переменной окружения PATH интерпретатор bash (или любая другая командная оболочка) находит программу (исполняемый файл или библиотеку) по указанному в PATH пути. И таким же образом, к примеру, команда man «знает», что запрашиваемые страницы справочных руководств нужно искать согласно значению переменной окружения MANPATH.

Получение информации о переменных окружения

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

$ printenv
GS_LIB=/home/john/.fonts
KDE_FULL_SESSION=true
LANG=ru_RU.UTF-8
DISPLAY=:0
OLDPWD=/home/john/builds/wxwidgets
PWD=/home/john
HOME=/home/john
. . .
SHELL=/bin/bash
PATH=/opt/wxwidgets/bin:/home/john/.config/composer/vendor/bin:/usr/bin

В данном выводе представлен сильно сокращённый список переменных окружения для Kubuntu 18.04. Также следует заметить, что представленный список относится к пользовательскому набору, доступному текущему пользователю. Если выполнить команду printenv от имени суперпользователя (root), то набор переменных будет несколько отличаться.

Как следует из вышеприведённого вывода, для пользователя john используется русская локализация для сеанса (LANG), в качестве командного интерпретатора по-умолчанию используется bash (SHELL), текущим активным каталогом является /home/john (PWD), а переменная PATH модифицирована и содержит в себе (кроме дефолтного /usr/bin) значения /opt/wxwidgets/bin и /home/john/.config/composer/vendor/bin. Значение каждой переменной окружения представляет собой, как можно видеть, набор параметров, разделённых двоеточиями.

Тот же список можно вывести, если дать команду env. Также можно использовать команду export с ключом -p:

$ export -p

Для вывода значения конкретной переменной:

$ echo $PATH

или:

$ printenv | grep PATH

В последнем случае будет выведены все переменные, содержащие фразу «PATH».

Виды переменных окружения

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

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

Имя Описание
HOME Определяет путь к домашнему каталогу текущего пользователя
PWD Определяет текущий активный каталог
OLDPWD Предыдущий активный каталог
SHELL Определяет программу-командную оболочку
TERM Содержит имя текущей запущенной программы-терминала
PAGER Определяет программу для постраничного вывода страниц справочных руководств
EDITOR Определяет программу для редактирования текстовых файлов
VISUAL Определяет программу для редактирования текстовых файлов с расширенными возможностями (vim, emacs)
MAIL Определяет путь к каталогу, в котором должны храниться файлы входящей электронной почты.
BROWSER Определяет веб-браузер, запускаемый по-умолчанию
ftp_proxy

http_proxy

Определяют, соответственно адреса для прокси-серверов по FTP и HTTP протоколам
MANPATH Определяет каталог, в котором содержатся подкаталоги, содержащие man-страницы справочных руководств системной справки для команды man
INFODIR Определяет список каталогов для поиска info-страниц для команды info
TZ Определяет временную зону. Доступные временные зоны хранятся в /usr/share/zoneinfo

Системные переменные

Согласно стандартам Linux переменные окружения для организации системной среды хранятся в нескольких файлах:

  • /etc/bash.bashrc – хранение переменных для командных оболочек;
  • /etc/profile – хранение переменных для интерактивных оболочек;
  • /etc/environment – переменные из этого файла используются модулем

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

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

Для систем, ориентированных на многопользовательский доступ, например на хостинговых площадках, конкретному пользователю полезно иметь возможность гибко настраивать своё собственное рабочее окружение, создавая новые переменные или дополняя их новыми значениями. К примеру, владельцу сайта, для его виртуального хоста, обслуживающего сайт на CMS Drupal, захотелось установить утилиту drush, которая облегчает и ускоряет обслуживание CMS. В этом случае достаточно после локальной установки (в каком-нибудь подкаталоге домашнего каталога) drush, дополнить переменную PATH значением, содержащим путь к утилите drush в файле ~/.bashrc. В результате командная оболочка сможет запускать команду drush для данного пользователя.

По стандартам соглашений для Linux-систем конфигурация для пользовательского окружения должна храниться в следующих файлах:

  • ~/.bashrc – для хранения параметров инициализации выбранной командной оболочки для пользователя;
  • ~/.profile – для инициализации доступных пользователю командных оболочек;
  • ~/.pam_environment – для использования модулем

Временные или переменные сеанса

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

$ source файл_скрипта

Или же устанавливать их вручную командой export.

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

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

ИМЯ=’значение’

Например:

$ SOMEVAR=’somevalue’
$ echo $SOMEVAR
somevalue

Если нужно временно модифицировать переменную PATH, то можно выполнить export:

$ export PATH="${PATH}:/home/john/tmp/usr/bin"

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

$ unset SOMEVAR

Для установки системных или пользовательских переменных окружения следует помещать код с нужными переменными в соответствующие файлы инициализации окружения. Например, чтобы добавить на системном уровне какой-либо пользовательский каталог (пусть это будет ~/bin), нужно один из файлов (/etc/profile  или /etc/bash.bashrc) дополнить следующим кодом:

export PATH=”$HOME/bin:$PATH”

В случае, если нужно выполнить то же самое для пользовательского уровня переменных окружения, то редактировать нужно файл (для локального входа) ~/.bashrc (для удалённого входа, например по SSH –  ~/.bash_profile):

export PATH=”$HOME/.config/composer/vendor/bin:$PATH”

Этот код включит использование командным интерпретатором вышеупомянутой команды drush (предварительно установленной по указанному пути, конечно) для CMS Drupal.

Чтобы можно было видеть сделанные изменения, нужно их зафиксировать:

$ source ~/.bashrc

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

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

Читайте также:

  • Как изменить переменную класса python
  • Как изменить переменную внутри функции python
  • Как изменить переменную вне функции python
  • Как изменить переменную php через js
  • Как изменить пароль электронной почты на телефоне айфон

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии