Для одноразовой параметризации выполнения команд служат их индивидуальные ключи, указываемые каждый раз при запуске команды, но иногда требуется установить некий параметр, который бы действовал в течение всего сеанса работы пользователя с системой, или общий параметр, который действовал бы для всех команд, запускаемых в сеансе.
Таким механизмом является окружение environ(7) и переменные окружения, значения которых можно увидеть при помощи команды env(1). Переменные окружения обычно документируются на странице руководства к тем программам, на которые воздействуют, как правило, в разделе ENVIRONMENT.
Например, переменная окружения PATH содержит перечисление разделенных символом : имен каталогов, где любой командный интерпретатор ищет одноименные запускаемым командам программы.
Содержимое
Переменная окружения PATH
john@ubuntu:~$ date
Вт. марта 14 01:23:47 MSK 2018
john@ubuntu:~$ help -d unset
unset — Unset values and attributes of shell variables and functions.
john@ubuntu:~$ unset PATH
john@ubuntu:~$ date
bash: date: Нет такого файла или каталога
Переменная окружения lang содержит идентификатор языка, на котором программы стараются общаться с пользователем, например man(1) ищет перевод страницы руководства.
Переменная окружения LANG
john@ubuntu:~$ LANG=ja_JP.UTF-8
john@ubuntu:~$ date
2018* 8 12 17:25:09 MSK
john@ubuntu:~$ LANG=ka_GE.UTF-8
john@ubuntu:~$ cal
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
john@ubuntu:~$ unset LANG
john@ubuntu:~$ whatis man
man (7) — macros to format man pages
man (1) — an interface to the on-line reference manuals
john@ubuntu:~$ export LANG=ru_RU.UTF-8
john@ubuntu:~$ whatis man
man (1) — доступ к справочным страницам
man (7) — macros to format man pages
Переменная окружения pager указывает имя программы «листателя», использующегося другими программами, вывод которых не умещается на один экран. Так, например, поступает man(1) при отображении отформатированной страницы руководства, mail(1) при просмотре длинного письма, mysql(1) или psql(1) при выводе большого количества результирующих строк ответа за запрос к базе данных. Наиболее распространенным листателем является less(1), используемый как замена менее удобного «классического» more(1).
Переменные окружения EDITOR и VISUAL указывают имя текстового редактора, который будет вызван другими программами при необходимости редактировать текст.
Например, crontab(1) использует указанный таким образом редактор для изменения списка периодических заданий, mail(1) для редактирования отправляемого сообщения, mysql(1) или psql(1) для редактирования длинных запросов к базе данных, а lftp(1) для редактирования списка «закладок». Очень часто в качестве редактора используется «классический» и достаточно непривычный vi(1), который можно таким образом заменить более удобным nano(1).
Переменная browser указывает имя просмотрщика HTML, который будет использован другими программами при необходимости показать HTML-страницу, например, отформатированную таким образом страницу руководства man(1).
Переменная окружения BROWSER
john@ubuntu:~$ man -Н Is
sh: 1: exec: www-browser: not found
man: couldn’t execute any browser from exec www-browser
john@ubuntu:~$ export BROWSER=chromium-browser
finn@ubuntu:~$ man -H Is
В текущем сеансе браузера создано новое окно.
Некоторые программы имеют специальную переменную окружения, которая содержит ключи, применяемые каждый раз при вызове программы, например MANOPT для man(1). Такие переменные для программ XXX чаще всего имеют имя или XXX_OPTIONS или даже XXX, например ZIPOPT для zip(1), TAR_OPTIONS для tar(1), GZIP для gzip(1) и LESS/MORE для less(1) и more(1) соответственно.
Установив, например, MANOPT=-H (BROWSER=chromium-browser, или BROWSER=firefox, или BROWSER=links, или BROWSER=lynx), можно просматривать страницы руководства в (одном из указанных графическом и/или текстовом) Web-браузере, а установив GZIP=-9, можно заставить упаковщик всегда использовать девятую (самую сильную, но самую медленную) степень сжатия.
Переменная окружения PS1 изменяет приглашение командного интерпретатора и может содержать подстановки (документированные в bash(1)), например,
- \u — имя зарегистрированного в системе пользователя,
- \h — короткое собственное имя компьютера,
- \w— имя текущего каталога,
- \$— символ приглашения $ для обычного пользователя и # для Суперпользователя root,
- \t — время в 24-часовом формате,
- \e— управляющий символ ESC и пр.
Используя подстановки PS1 и управляющие ESC-последовательности console_codes(7) или воспользовавшись базой данных управляющих ESC-последовательностей terminfo(5) и командой tput(1), можно модифицировать приглашение по своему предпочтению.
Переменная окружения РS1
john@ubuntu:~$ man 5 terminfo
. . . . . . . . .
enter_reverse_mode rev mr turn on reverse
video mode
. . . . . . . . .
enter_dim_node dim mh turn on half-bright
mode
. . . . . . . . .
exit_attribute_mode sgr0 me turn off all
attributes
. . . . . . . . .
john@ubuntu:~$ tput rev | od -a
0000000 esc [ 7 m
0000004
john@ubuntu:~$ tput dim | od -a
0000000 esc [ 2 m
0000004
john@ubuntu:~$ tput sgr0 | od -a
0000000 esc [ В esc [ m
0000006
john@ubuntu: ~$ PS1=’ \e[2n\t\n\e(B\e[n\u@\h \e[7n\w\e(B\e[n \$ ‘
12:14:45
john@ubuntu | $ cd /etc
12:14:45
john@ubuntu /etc $
Или даже можно воспользоваться поддержкой символов unicode(7) в UTF-8(7) представлении на терминале. В этом примере эмулятор терминала в графическом интерфейсе по умолчанию имеет нужные шрифты, а на консоли необходимо загрузить подходящий Unicode-шрифт, например, командой setfont Uni2-Ternimus16.
Переменная окружения РS1 (вариант 2)
john@ubuntu:~$ stty
speed 38400 baud; line = 0;
eol = M-^?; eol2 = M-^?; swtch = M-^?;
ixany iutf8
john@ubuntu:~$ PS1=’ \u\342\230\273 \h:\w\$ ‘
john@ubuntu:~$
Переменная окружения term устанавливает Имя терминала, по которому программы, использующие управляющие ESC-последовательности (например, файловый менеджер mc(1)), берут их значения из базы данных terminfo(5).
Для эмуляторов терминала в графическом интерфейсе ее значение обычно TERM=xterm или TERM=xterm-color, для консоли Linux TERM=linux, а для настоящего аппаратного терминала W: [VT100] TERM=vt1oo. При неправильном значении переменной, например, могут «перестать работать» функциональные клавиши, просто потому что программа будет ожидать поступление определенной ESC-последовательности, соответствующей функциональной клавише, а в реальности будет поступать другая.
Переменная окружения TERM
john@ubuntu:~$ env
. . .
TERM=xterm
john@ubuntu:~$ TERM=linux
john@ubuntu:~$ infocmp
. . . . . .
kf18=\E[32~, kf19=\E[33~, kf2=\E[[B, kf20=\E[34~,
. . . . . .
john@ubuntu:~$ od -a
F2↵
^D
0000000 esc О Q nl
0000004
Стоит отметить, что переменные окружения сохраняют свои установленные значения в оперативной памяти командного интерпретатора и теряют их при завершении сеанса. Для установки постоянных значений параметров программ логично поместить их в какое-либо долгосрочное хранилище, например в файлы на диске.
Специальные файлы и каталоги, сохраняющие конфигурационные параметры, по соглашению имеют имена, начинающиеся с точки (dot— точка), располагаются в домашнем каталоге пользователя и носят название dot-файлов.
Конфигурационные dot-файлы
john@ubuntu:~$ ls -A
. . .
.bash_history
.bash_logout
.bashrc
. . .
.profile
.lftp
.ssh
john@ubuntu:~$ file .profile .bashrc .lftp .ssh
.profile: ASCII English text
.bashrc: ASCII English text
.lftp: directory
.ssh: directory
Некоторые программы, например lftp(1), ssh(1) или ssh(1), имеют собственные конфигурационные файлы и/или каталоги, тогда как простейшие less(1), tar(1) и zip(1) предполагают, что «постоянные» параметры по-прежнему задаются при помощи переменных окружения less, tar_options и zipopt.
В таких случаях «постоянные» значения переменных сохраняются в каком-либо конфигурационном файле командного интерпретатора bash, например, считываемом в начале сеанса— .profile или при каждом запуске— .bashrc.
Конфигурационные dot-файлы интерпретатора bash
john@ubuntu:~$ less ~/.bashrc
. . .
GZIP=-9v
PSl=’\e[2m\t\e(B\e[m \u@\h \e[7m\w\e(B\e[m \$ ‘
. . .
Конфигурационные dot-файлы представляют собой текст на некотором языке, понятном конфигурируемой программе, например, язык командного интерпретатора bash(1) используется в .profile и .bashrc.
В большинстве случаев имена dot-файлов и их язык документируются в страницах руководства к «их» программам, обычно в разделе FILES. Нередко конфигурационному файлу посвящается отдельная страница в пятой секции, например, nanorc(5) для dot-файла .nanorc текстового редактора nano(1) или netrc(5) для файла .netrc FTP-клиентов ftp(1) и lftp(1), или ssh_config(5) для .ssh/config SSH-клиента ssh(1).
В отдельных случаях, когда конфигурируется не конкретная программа, а общая для многих программ библиотека, например readline(3), название переменных окружения, имя и язык конфигурационного файла можно получить (INPUTRC и .inputrc для readline(3), соответственно) из страницы руководства самой библиотеки.