Red Hat System Administration I 8.2

Изменение среды командной оболочки

Задачи

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

Использование переменных оболочки

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

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

Присвоение значений переменным

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

VARIABLENAME=value

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

[user@host ~]$ COUNT=40
[user@host ~]$ first_name=John
[user@host ~]$ file1=/tmp/abc
[user@host ~]$ _ID=RH123

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

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

[user@host ~]$ set | less
BASH=/usr/bin/bash
BASHOPTS=checkwinsize:​cmdhist:​complete_fullquote:​expand_aliases:​extglob:​extquote:​force_fignore:​histappend:​interactive_comments:​progcomp:​promptvars:​sourcepath
BASHRCSOURCED=Y
...output omitted...

Получение значений с помощью развертывания переменной

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

Например, следующая команда задает для переменной COUNT значение 40.

[user@host ~]$ COUNT=40

Если вы введете команду echo COUNT, она распечатает строку COUNT.

[user@host ~]$ echo COUNT
COUNT

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

[user@host ~]$ echo $COUNT
40

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

[user@host ~]$ file1=/tmp/tmp.z9pXW0HqcC
[user@host ~]$ ls -l $file1
-rw-------. 1 student student 1452 Jan 22 14:39 /tmp/tmp.z9pXW0HqcC
[user@host ~]$ rm $file1
[user@host ~]$ ls -l $file1
total 0

Важно

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

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

[user@host ~]$ echo Repeat $COUNTx
Repeat
[user@host ~]$ echo Repeat ${COUNT}x
Repeat 40x

Настройка Bash с помощью переменных оболочки

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

Например, переменные оболочки HISTFILE и HISTFILESIZE влияют на историю оболочки и команду history. Если переменная HISTFILE задана, она указывает расположение файла для сохранения истории оболочки при выходе. По умолчанию это пользовательский файл ~/.bash_history. Переменная HISTFILESIZE указывает, сколько команд необходимо сохранить в этом файле из истории.

Еще один пример — переменная оболочки PS1, которая управляет внешним видом приглашения оболочки. Если изменить это значение, изменится внешний вид приглашения оболочки. Некоторые специальные символы развертывания, поддерживаемые в командной строке, указаны в разделе PROMPTING man-страницы bash(1).

[user@host ~]$ PS1="bash\$ "
bash$ PS1="[\u@\h \W]\$ "
[user@host ~]$ 

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

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

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

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

Примечание

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

Любую переменную, определенную в оболочке, можно превратить в переменную среды, пометив ее для экспорта с помощью команды export.

[user@host ~]$ EDITOR=vim
[user@host ~]$ export EDITOR

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

[user@host ~]$ export EDITOR=vim

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

Еще один пример — переменная LANG, которая задает языковой стандарт. Она настраивает предпочтительный язык для вывода программы, кодировку, формат дат, чисел и валюты, а также порядок сортировки программ. Если установлено значение en_US.UTF-8, будет использоваться английский язык (США) с кодировкой UTF-8. Если установлено значение fr_FR.UTF-8, будет использоваться французский язык с кодировкой UTF-8.

[user@host ~]$ date
Tue Jan 22 16:37:45 CST 2019
[user@host ~]$ export LANG=fr_FR.UTF-8
[user@host ~]$ date
mar. janv. 22 16:38:14 CST 2019

Еще одна важная переменная среды — PATH. Переменная PATH содержит список каталогов, в которых есть программы, с двоеточием в качестве разделителя.

[user@host ~]$ echo $PATH
/home/user/.local/bin:/home/user/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

Когда вы выполняете команду, например ls, оболочка ищет исполняемый файл ls по очереди в каждом из этих каталогов и запускает первый найденный файл. (В обычной системе это /usr/bin/ls.)

Вы можете легко добавить дополнительные каталоги в конец переменной PATH. Например, у вас могут быть исполняемые программы или сценарии, которые необходимо запускать как обычные команды в /home/user/sbin. Можно добавить /home/user/sbin в конец переменной PATH в текущем сеансе следующим образом:

[user@host ~]$ export PATH=${PATH}:/home/user/sbin

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

[user@host ~]$ env
...output omitted...
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
HOSTNAME=host.example.com
XDG_SESSION_ID=4
...output omitted...

Настройка текстового редактора по умолчанию

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

[user@host ~]$ export EDITOR=nano

Важно

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

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

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

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

Предположим, что у вас по умолчанию есть файлы /etc/profile, /etc/bashrc и ~/.bash_profile. Если вы хотите внести изменения в свою учетную запись пользователя, которые повлияют на все интерактивные приглашения оболочки при запуске, отредактируйте файл ~/.bashrc. Например, вы можете задать nano в качестве редактора по умолчанию для этой учетной записи, изменив файл следующим образом:

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
	. /etc/bashrc
fi

# User specific environment
PATH="$HOME/.local/bin:$HOME/bin:$PATH"
export PATH

# User specific aliases and functions
export EDITOR=nano

Примечание

Лучший способ настроить параметры, влияющие на все пользовательские учетные записи, — добавить в каталог /etc/profile.d файл с именем, оканчивающимся на .sh, содержащий необходимые изменения. Для этого необходимо войти в систему как пользователь root.

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

Для удаления и отмены экспорта переменной используйте команду unset.

[user@host ~]$ echo $file1
/tmp/tmp.z9pXW0HqcC
[user@host ~]$ unset file1
[user@host ~]$ echo $file1

[user@host ~]$ 

Чтобы отменить экспорт переменной, не удаляя ее, используйте команду export -n.

[user@host ~]$ export -n PS1

Ссылки

Man-страницы bash(1), env(1) и builtins(1)