Як встановити змінні середовища в Bash на Linux

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

Як працюють змінні середовища

Коли ви запускаєте вікно терміналу і оболонка всередині нього, на колекцію змінних посилається, щоб переконатися, що оболонка налаштована правильно. Ці змінні також забезпечують доступність будь-якої інформації, на яку може знадобитися посилатися вікно термінала та оболонка. У сукупності ці змінні містять параметри, які визначають середовище, яке ви знайдете у вікні терміналу, аж до вигляду командного рядка. Тому, природно, вони називаються змінними середовища.

Деякі змінні середовища є загальносистемними або глобальними. Інші доступні для всього сеансу, і їх можете побачити лише ви. Інші не можуть посилатися на змінні середовища сеансу. Існує третій набір змінних середовища, визначених всередині оболонки. Ваша локаль, часовий пояс і налаштування клавіатури, набір каталогів, які шукає, коли оболонка намагається знайти команду, і ваш редактор за замовчуванням — усі зберігаються у змінних середовища оболонки.

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

Середовища та спадковість

Коли оболонка запускається, вона проходить фазу ініціалізації. Саме в цей момент він зчитує змінні середовища, які визначають середовище оболонки.

Коли програма або команда запускається з цієї оболонки, відомої як дочірній процес, вона успадковує середовище батьківського процесу, але обережно! Як ми побачимо, ви можете створювати змінні, які не додаються до вашого середовища, тому вони не будуть успадковані дочірнім процесом.

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

Глобальні змінні середовища

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

SHELL: назва оболонки, яка запускатиметься, коли ви відкриєте вікно терміналу. У більшості дистрибутивів Linux, це буде bash якщо ви не змінили його за замовчуванням.
ТЕРМІН: Вікна терміналу насправді є емуляцією апаратного терміналу. Це містить тип апаратного терміналу, який буде емульовано.
КОРИСТУВАЧ: ім’я користувача, який зараз використовує систему.
PWD: шлях до поточного робочого каталогу.
OLDPWD: Каталог, у якому ви перебували до переходу до поточного робочого каталогу.
LS_COLORS: Список колірних кодів, які використовуються ls виділіть різні типи файлів.
ПОШТА: якщо поштова система була налаштована на вашому комп’ютері з Linux (за замовчуванням це не так), це зберігатиме шлях до поштової скриньки поточного користувача.
ШЛЯХ: список каталогів, у яких оболонка шукатиме виконувані файли команди.
LANG: налаштування мови, локалізації та кодування символів.
HOME: домашній каталог поточного користувача.
_: Змінна середовища підкреслення (_) містить останню введену команду.

Ми бачимо, на що деякі з них налаштовані, використовуючи нічого складнішого, ніж ехо, яке буде записати значення у вікно терміналу. Щоб побачити значення змінної середовища, потрібно додати знак долара ($) на початок її назви.

Приємним дотиком є ​​те, що ви можете використовувати завершення вкладки щоб заповнити назву змінної середовища для вас. Введіть кілька літер імені та натисніть Tab. Ім’я змінної заповнюється оболонкою. Якщо цього не сталося, вам потрібно буде ввести ще кілька літер, щоб відрізнити змінну середовища від інших команд з іменами, які починаються з тих самих літер:

echo $SHELL
echo $LANG
echo $HOME
echo $PWD

Щоб створити власні глобальні змінні середовища, додайте їх до файлу /etc/environment. Вам потрібно буде використовувати sudo, щоб відредагувати цей файл:

sudo gedit /etc/environment

Щоб додати змінну середовища, введіть її ім’я, знак рівності (=) і значення, яке має зберігати змінна середовища. Не ставте пробіл перед або після знака рівності (=). Ім’я змінної середовища може містити літери, символ підкреслення (_) або цифри. Однак першим символом імені не може бути число.

Якщо у значенні є пробіли, не забудьте взяти все значення в лапки (“).

Збережіть файл, а потім вийдіть із системи та знову ввійдіть. Використовуйте echo, щоб перевірити, чи існує нова змінна та містить задане вами значення:

echo $WEBSITE

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

echo $WEBSITE

До переглянути всі змінні середовища відразу введіть printenv. Виводу багато, тому має сенс передати його через сортування, а потім у менше:

printenv | sort | less

Відсортований список змінних середовища відображається для нас у меншій частині.

Ми можемо передати вихід через grep для пошуку змінних середовища пов’язані з певною темою.

printenv | grep GNOME

Змінні середовища оболонки

Це деякі зі змінних середовища оболонки, які використовуються в bash, щоб диктувати або записувати його поведінку та функціональність. Деякі значення оновлюються під час використання терміналу. Наприклад, змінна середовища COLUMNS буде оновлено, щоб відображати зміни, які ви можете внести до ширини вікна терміналу:

BASHOPTS: параметри командного рядка, які використовувалися під час запуску bash.
BASH_VERSION: номер версії bash у вигляді рядка слів і чисел.
BASH_VERSINFO: версія bash у вигляді цифри.
COLUMNS: поточна ширина вікна терміналу.
DIRSTACK: каталоги, які були додано до стеку каталогів за командою pushd.
HISTFILESIZE: максимальна кількість лінії, дозволені в файл історії.
HISTSIZE: кількість рядків історії, дозволена в пам’яті.
HOSTNAME: ім’я хоста комп’ютера.
IFS: Внутрішній роздільник полів використовується для роздільного введення в командному рядку. За замовчуванням це пробіл.
PS1: змінна середовища PS1 містить визначення для основного, за замовчуванням і командного рядка. У визначення командного рядка можна включити набір маркерів, які називаються вихідними послідовностями. Вони представляють такі речі, як ім’я хоста та користувача, поточний робочий каталог і час.
PS2: коли команда охоплює більше ніж один рядок і очікується більше введення, відображається вторинний командний рядок. Змінна середовища PS2 містить визначення цієї вторинної підказки, яка за замовчуванням є знаком «більше» (>).
SHELLOPTS: параметри оболонки, які можна встановити за допомогою параметра set.
UID: Ідентифікатор користувача поточного користувача.

Давайте перевіримо деякі з цих змінних оболонки:

echo $BASH_VERSION
echo $HOSTNAME
echo $COLUMNS
echo $HISTFILESIZE
echo $UID

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

t: поточний час у форматі ГГ:ММ:СС.
d: поточна дата, виражена як день тижня, місяць, число.
n: символ нового рядка.
s: Назва вашої оболонки.
W: назва вашого поточного робочого каталогу.
w: шлях до поточного робочого каталогу.
u: ім’я користувача особи, яка ввійшла в систему.
h: ім’я хоста комп’ютера.
#: Кожна команда в оболонці пронумерована. Це дозволить вам побачити номер команди в командному рядку. Це не те саме число, яке команда матиме в списку історії.
$: встановлює кінцевий символ підказки на знак долара ($) для звичайного користувача та символ хеша (#) для користувача root. Це працює шляхом перевірки UID користувача. Якщо він дорівнює нулю, користувач є root.

Ви знайдете визначення змінної середовища PS1 у файлі .bashrc.

Створення змінних середовища сеансу

Щоб створити змінні середовища для власного використання, додайте їх у нижню частину вашого файлу .bashrc. Якщо ви хочете, щоб змінні середовища були доступні для віддалених сеансів, наприклад, для з’єднань SSH, вам також потрібно буде додати їх до вашого файлу .bash_profile.

Формат визначення змінної середовища однаковий для обох файлів. Щоб додати визначення до вашого файлу .bash_profile, введіть це у своєму домашньому каталозі:

gedit .bashrc

Ми додали змінну середовища під назвою INHERITED_VAR. Зверніть увагу на слово «експорт» на початку рядка.

Збережіть і закрийте файл після завершення редагування. Ви можете вийти з системи та знову ввійти, або ви можете змусити оболонку повторно прочитати файл .bash_profile за допомогою точки (.) так:

. .bashrc

Тепер давайте створимо змінну середовища в командному рядку:

LOCAL_VAR="This session only"

LOCAL_VAL=

Якщо ми використовуємо echo, ми бачимо, що обидві змінні середовища доступні для нас:

echo $LOCAL_VAR
echo $INHERITED_VAR

Ви помітите, що визначення змінної середовища INHERITED_VAR містило слово «експорт» на початку рядка. Це означає, що змінна середовища буде успадкована дочірніми процесами поточної оболонки. Якщо ми запустимо ще одну за допомогою команди bash, ми зможемо знову перевірити дві змінні всередині дочірньої оболонки:

bash
echo $LOCAL_VAR
echo $INHERITED_VAR

Як бачите, INHERITED_VAR доступний у дочірній оболонці, але LOCAL_VAR ні. Ми просто отримуємо порожній рядок.

Хоча «експорт» додає частину змінної середовища до середовища, яке успадковують дочірні процеси, INHERITED_VAR не є глобальною змінною середовища. Наприклад, користувач mary не може посилатися на нього:

echo $INHERITED_VAR

Щоб закрити наш дочірній сеанс bash, ми використовуємо exit:

exit

Успадковане середовище також впливає на сценарії. Ось простий скрипт, який записує значення трьох наших змінних середовища у вікно терміналу:

#!/bin/bash

echo "WEBSITE" $WEBSITE
echo "LOCAL_VAR" $LOCAL_VAR
echo "INHERITED_VAR" $INHERITED_VAR

Це було збережено у файлі під назвою envtest.sh, а потім виконано з наступним:

chmod +x envtest.sh

Коли ми запускаємо сценарій, він може отримати доступ до двох з трьох змінних середовища:

./envtest.sh

Сценарій може бачити глобальну змінну середовища WEBSITE та експортовану змінну середовища INHERITED_VAR. Він не може отримати доступ до LOCAL_VAR, навіть якщо сценарій виконується в тій самій оболонці, де була створена змінна.

Якщо нам потрібно, ми можемо експортувати змінну середовища з командного рядка. Ми зробимо це з нашим LOCAL_VAR, а потім знову запустимо сценарій:

export LOCAL_VAR
./envtest.sh

Змінна середовища була додана до середовища поточної оболонки, і тому вона з’являється в середовищі, яке успадковується сценарієм. Сценарій також може посилатися на цю змінну середовища.

Віддалені підключення

Глобальні змінні середовища доступні для сеансів віддаленого входу, але якщо ви хочете, щоб ваші локально визначені змінні середовища були доступні вам віддалено, ви повинні додати їх до вашого файлу .bash_profile. Ви можете встановити ту саму змінну середовища у файлах .bashrc і .bash_profile з різними значеннями. Це може бути підхоплено сценарієм, скажімо, щоб змінити його поведінку для людей, які використовують систему локально або віддалено.

(З ризиком заплутатися, існує також файл .profile. Він також може містити визначення змінних середовища. Однак файл .profile не читається, якщо є файл .bash_profile. Отже, найбезпечніше, що можна зробити — і спосіб, сумісний із bash — це використання файлу .bash_profile.)

Щоб відредагувати файл .bash_profile, ми знову використаємо gedit:

gedit .bash_profile

Ми збираємося додати ту саму змінну середовища з тим самим значенням, що ми використовували раніше.

Збережіть зміни та закрийте gedit.

На іншому комп’ютері ми створимо SSH підключення до тестового комп’ютера.

ssh [email protected]

Після підключення ми знову запустимо сценарій:

./envtest.sh

Файл .bash_profile був прочитаний як частина ініціалізації віддаленого входу, і змінна середовища INHERITED_VAR доступна нам і сценарію.

Скасування змінної середовища

Щоб скасувати встановлення змінної середовища, використовуйте команда скасування. Якщо ми скасовуємо глобальну змінну середовища WEBSITE та експортовану змінну середовища INHERITED_VAR, вони більше не будуть доступні ні в командному рядку, ні в дочірніх процесах:

unset WEBSITE
unset INHERITED_VAR
./envtest.sh
echo $WEBSITE

Варто зазначити, що це лише змінює доступність глобальних змінних середовища для вас у цьому сеансі. Інша особа, яка одночасно ввійшла в систему, все одно зможе отримати доступ до свого екземпляра цієї глобальної змінної середовища. Його екземпляр був ініціалізований і прочитаний з файлу /etc/environment під час його входу в систему і не залежить від будь-якої іншої копії змінної.

Наприклад, користувач mary все ще може отримати доступ до змінної середовища WEBSITE і прочитати її значення, навіть якщо користувач dave скасував її під час свого сеансу:

echo $WEBSITE

Екологічний контроль

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