М.Гаррельс. Посібник з Bash

2.2. Змінні середовища

Операційна система підтримує спеціальний вид ресурсів, які називаються змінні середовища (environment variables). Ці змінні є парою ІМ'Я - ЗНАЧЕННЯ . Ім'я може починатися з літери та складатися з літер, цифр та символів підкреслення.

Для встановлення значення змінної в командний рядок перед ім'ям змінної ставиться знак $:

$ echo $USER guest

Якщо змінна не встановлена, повертається порожній рядок.

Для встановлення значення змінної використовується оператор присвоєння (у разі Bourne-подібних оболонок):

$ TEST = test

або вбудований оператор set (у разі С-подібних):

$set TEST=test

Команда set без аргументів виводить список значень всіх змінних, встановлених серед:

$ set COLUMNS=197 CVS_RSH=ssh DIRSTACK=() EUID=1000 GROUPS=() G_BROKEN_FILENAMES=1 HISTFILE=/home/guest/.bash_history HISTFILESIZE=1000 HISTSIZE=1000 HOME=/home/gues =$" \t\n" INPUTRC=/etc/inputrc KDEDIR=/usr KDEDIRS=/home/guest/.local/ KDE_IS_PRELINKED=1 KDE_NO_IPV6=1 LANG=ua_RU.UTF-8 LESSOPEN="|/usr/bin/ lesspipe.sh %s" LINES=65 LOGNAME=guest ....

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

$ test = test1 sh -c "echo $ test" test1

Оцінити вміст набору змінних для сесії можна, викликавши вбудовану команду інтерпретатора env у разі Bourne-подібних інтерпретаторів (sh, ksh, bash, zsh, pdksh...), і printenv у разі використання інтерпретаторів клону C-Shell (csh, tcsh. ..):

$ env HOSTNAME=myhost TERM=xterm SHELL=/bin/bash HISTSIZE=1000 KDE_NO_IPV6=1 SSH_CLIENT=172.16.0.9 50487 22 QTDIR=/usr/lib/qt-3.3 QTINC=/usr/lib/q/t =/dev/pts/6 USER=guest MOZILLA_CERTIFICATE_FOLDER=/home/guest/.evolution/ KDEDIR=/usr MAIL=/var/spool/mail/guest PATH=/usr/games:/usr/local/bin:/bin :/usr/bin:/home/guest/bin INPUTRC=/etc/inputrc PWD=/home/guest KDE_IS_PRELINKED=1 LANG=ua_RU.UTF-8 KDEDIRS=/home/guest/.local/ SSH_ASKPASS=/usr/libexec /openssh/gnome-ssh-askpass SHLVL=1 HOME=/home/guest LOGNAME=guest QTLIB=/usr/lib/qt-3.3/lib CVS_RSH=ssh SSH_CONNECTION=172.16.0.9 50487 172.12.2.9. /bin/lesspipe.sh %s G_BROKEN_FILENAMES=1 _=/bin/env

Набори команд Shellможуть компонуватися в командні файли, які називаються скриптами, де в першому рядку у спеціальному виді коментарі вказується командний інтерпретатор для виконання цього набору. Наприклад, створимо в текстовому редакторі файл із назвою test , наступного змісту:

#!/bin/sh echo Змінна TEST: echo $TEST

Ця програма буде виводити на стандартний висновоктекстове повідомлення «Змінна TEST: » та значення змінної TEST, якщо воно встановлено. Запустити його з командного рядкаможна, передавши його як параметр командному інтерпретатору:

$ sh test Змінна TEST:

Надати змінній глобальний характер можна за допомогою оператора export (Bourne) або setenv (C-SHell):

$ export TEST = test1 $ sh test Змінна TEST: test1

Задати локальні значення змінних для виконання даної програми можна, випередивши ними виклик команд:

$ TEST=test2 sh test Змінна TEST: test2

Видалення змінних середовища здійснюється за допомогою оператора unset.

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

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

Якщо говорити точніше, то змінне середовище може бути трьох типів:

1. Локальна змінна середовища

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

2. Користувальне змінне середовище

Це змінні, які визначені для конкретного користувача і завантажуються щоразу, коли користувач входить до системи з використанням сеансу локального терміналу або якщо цей користувач реєструється за допомогою віддаленого сеансу входу в систему. Ці змінні зазвичай встановлюються та завантажуються з наступних конфігураційних файлів: .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

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

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

$source

Встановлення або видалення локальних або сеансових змінних середовищ у Linux

Локальні змінні середовища можуть бути створені за допомогою наступних команд:

$var=value OR $export var=value

Ці змінні є сесійними та дійсними лише для поточного сеансу терміналу. Щоб очистити ці змінні оточення, можна використовувати такі команди:

1. Використання env

За замовчуванням команда « env» перераховує всі поточні змінні середовища. Але якщо використовується з ключем « -i», то тоді він тимчасово очищає всі змінні середовища та дозволяє користувачеві виконувати команду в поточному сеансі без всіх змінних середовища.

$ env –i … command args…

Тут var = value відповідає будь-якій локальній змінній оточенню, яку ви хочете використовувати лише з цією командою.

$ env -i bash

Запускаємо оболонку bash, в якій будуть тимчасово очищені всі змінні середовища. Але при виході з оболонки всі змінні буде відновлено.

2. Використання скасування

Інший спосіб очищення локальної змінної оточення - використання команди unset. Щоб тимчасово відключити будь-яке локальне змінне середовище,

$ unset

Де, var-name— це ім'я локальної змінної, яку потрібно видалити або очистити.

3. Вкажіть ім'я змінної за допомогою порожнього значення

Інший менш популярний спосіб - присвоїти імені змінної, яку ви хочете очистити, порожнє значення, тобто. VAR=(після дорівнює нічого немає - натиснути enter). Це дозволить очистити значення локальної змінної для поточного сеансу, для якого вона активна.

ПРИМІТКА. ВИ МОЖЕТЕ ДІЙСНО ЗМІНИВАТИ ЗМІННІ СИСТЕМИ, АЛЕ ЗМІНИ ВІДБИВАЮТЬСЯ ТІЛЬКИ В ПОТОЧНІЙ СЕСІЇ І НЕ БУДУТЬ ПОСТОЯННИМИ.

Дізнайтеся, як створювати, користувацькі та системні змінні середовища в Linux

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

1. Встановлення та видалення локальних змінних у Linux.

а) Тут ми створюємо локальну змінну VAR1та встановлюємо її на будь-яке значення. Потім ми використовуємо unsetі наприкінці цю змінну видаляємо.

$ VAR1 = "TecMint is best Site for Linux Articles" $ echo $VAR1 $ unset VAR1 $ echo $VAR1

б) Інший спосіб створення локальної змінної - використовувати команду export. Створена локальна змінна буде доступною для поточного сеансу. Щоб вимкнути змінну, просто встановіть пусте значення змінної.

$ export VAR="TecMint is best Site for Linux Articles" $ echo $VAR $ VAR= $ echo $VAR

в) Тут ми створили локальну змінну VAR2та встановили її значення. Потім, щоб запустити команду, тимчасово очистивши всі локальні та інші змінні середовища, ми виконали команду env -i». Ця команда тут запустила оболонку bash, очистивши решту змінних середовища. Після введення exit» у оболонці, що викликається bashвсі змінні буде відновлено.

$ VAR2 = "TecMint is best Site for Linux Articles" $ echo $VAR2 $ env -i bash $ echo $VAR2

2. Встановлення та видалення змінних оточення в Linux.

a) Змініть файл .bashrcу своєму домашньому каталозі, щоб експортувати або встановити змінне середовище, яке потрібно додати. Після цього запустіть файл, щоб зміни набули чинності. Тоді ви побачите змінну («CD» у моєму випадку), яка набула чинності. Ця змінна буде доступна щоразу, коли ви відкриваєте новий термінал цього користувача, але не для сеансів віддаленого входу.

$ vi .bashrc

.bashrc.

Export CD="This is TecMint Home"

Тепер запустіть наступну команду, щоб нові зміни набули чинності та протестувати змінну.

$source .bashrc $echo $CD

Щоб видалити цю змінну, просто видаліть рядок у файлі. bashrcі перезайдіть в оболонку.

б) Щоб додати змінну, яка буде доступна для сеансів віддаленого входу, змініть файл .bash_profile.

$vi .bash_profile

Додайте наступний рядок у файл .bash_profile.

Export VAR2="This is TecMint Home"

Змінна буде доступна, коли виконайте віддалений використовуючи sshвхід для цього користувача, але не під час відкриття нового локального терміналу.

$source .bash_profile $echo $VAR2

Тут VAR2спочатку не доступний, але при виконанні віддаленого входу використовуючи sshкористувачеві на localhost,змінна стає доступною.

$ ssh $ echo $ VAR2

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

ПРИМІТКА. Ці змінні будуть доступні для кожного входу до системи для поточного користувача, але не для інших користувачів.

3. Встановлення та видалення системних змінних оточення в Linux.

а) Щоб додати системну змінну без входу (тобто та, яка доступна всім користувачів, коли якийсь із них відкриває новий термінал, але з коли існує віддалений доступбудь-якому користувачеві до машини) додайте цю змінну до файлу /etc/bash.bashrc.

Export VAR="This is system-wide variable"

Після цього перечитайте файл.

$source /etc/bash.bashrc

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

$ echo $ VAR $ sudo su $ echo $ VAR $ su - $ echo $ VAR

Тут змінна доступна як для користувача root, так і для звичайного користувача. Ви можете перевірити це, увійшовши до системи під іншим користувачем.

б) Якщо ви хочете, щоб будь-яке змінне середовище було доступне, коли будь-який з користувачів на вашому комп'ютері виконав віддалений вхід, але не відкривав будь-який новий термінал на локальному комп'ютері, вам необхідно відредагувати файл /etc/profile .

Export VAR1="Ця система має широку функцію для лише remote sessions"

Після додавання змінної просто перечитайте файл. Тоді змінна буде доступною.

$source/etc/profile $echo$VAR1

Щоб видалити цю змінну, видаліть рядок із файлу /etc/profileта перечитайте її.

в) Однак, якщо ви хочете додати змінне в будь-яке середовище, в якому ви хочете бути доступні по всій системі, як для сеансів віддаленого входу, так і для локальних сеансів для всіх користувачів, просто експортуйте змінну до /Etc/environment.

Export VAR12="Я можу скористатися кожним"

Після цього тільки перечитайте файл і зміни набудуть чинності.

$ source /etc/environment $ echo $VAR12 $ sudo su $ echo $VAR12 $ exit $ ssh localhost $ echo $VAR12

Тут ми бачимо, що змінне середовище доступне для звичайного користувача, користувача root, а також для віддаленого сеансу входу.

Щоб очистити цю змінну, просто видаліть запис у файлі /etc/environmentта перечитайте файл.

ПРИМІТКА. Зміни набувають чинності при перечитуванні файлу /etc/environment. Але, якщо ні, вам може знадобитися вийти із системи та знову увійти до системи.

Запитання за статтею ставте в коментарях нижче.

Дякуємо за приділений час на прочитання статті!

Якщо виникли питання, ставте їх у коментарях.

Підписуйтесь на оновлення нашого блогу та залишайтесь в курсі новин світу інфокомунікацій!

Щоб знати більше та виділятися знаннями серед натовпу IT-шників, записуйтесь на курси Cisco від Академії Cisco, курси Linux від Linux Professional Institute

  • Запитаємо у вас про зручний для практик і підлаштуємося: розуміємо, що часу вчитися мало.
  • Якщо хочете індивідуальний графік – обговоримо та здійснимо.
  • Виставимо чіткі дедлайн для самоорганізації. Особистий куратор буде на зв'язку, щоб відповісти на запитання, проконсультувати та мотивувати дотримуватись термінів складання іспитів.
  • А ще допоможемо Вам:

    Змінні оточення в Linux – це спеціальні змінні, визначені оболонкою та використовувані програмами під час виконання. Вони можуть визначатися системою та користувачем. Системні змінні оточення Linuxвизначаються системою та використовуються програмами системного рівня.

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

    Якщо дивитися ширше, змінна оточення може бути трьох типів:

    1. Локальні змінні оточення

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

    2. Користувальницькі змінні оболонки

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

    3. Системні змінні оточення

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

    Конфігураційні файли змінних оточення Linux

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

    .bashrc

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

    .bash_profile

    Ці змінні набувають чинності щоразу, коли користувач підключається віддалено по SSH. Якщо цей файл відсутній система буде шукати .bash_login або .profile.

    /etc/environment

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

    /etc/bash.bashrc

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

    /etc/profile

    Системний файл profile. Всі змінні з цього файлу доступні будь-якому користувачеві в системі тільки якщо він увійшов віддалено. Але вони не будуть доступні при створенні локальної термінальної сесії, тобто, якщо ви просто відкриєте термінал.

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

    source имя_файла

    Додавання користувацьких та системних змінних оточення до Linux

    Тепер, коли ви знаєте небагато теорії, перейдемо до практики. Локальні змінні оточення в Linux можна створювати такими командами:

    var=значення
    $ export var = значення

    Ці змінні будуть доступні лише для поточної термінальної сесії.

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

    1. Використання env

    За промовчанням за допомогою env можна переглянути всі встановлені змінні середовища. Але з опцією -i вона дозволяє тимчасово видалити всі змінні оболонки та виконати команду без змінних.

    env -i команда

    Var – це будь-яка змінна, яку ви хочете передати цій команді.

    Така команда запустить оболонку взагалі без змінних оточення:

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

    2. Використання unset

    Це інший спосіб видалення змінних оточення Linux. Unset видаляє змінну на ім'я до кінця поточної сесії:

    unset ім'я_змінної

    3. Встановити значення змінної в ""

    Це найпростіший спосіб видалення змінних оточення в Linux, встановлюючи порожнє значення змінної ви видаляєте її до кінця поточної сесії.

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

    Створення користувацьких та системних змінних оточення

    У цьому розділі розглянемо як встановити та видалити системні та користувацькі змінні не тільки для поточного сеансу, а так, щоб ефект зберігався після перезавантаження.

    1. Встановлюємо та видаляємо локальні змінні в Linux

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

    VAR1="Losst"
    $ echo $VAR1
    $ unset VAR1
    $ echo $VAR1

    Інший спосіб створити змінну – команда export. Видалимо її надавши порожнє значення:

    export VAR="Losst"
    $ echo $VAR
    $ VAR =
    $ echo $VAR

    Тепер створимо змінну VAR2 також задамо їй значення. А потім тимчасово видалимо всі локальні змінні, виконавши env -i. Вона запустить оболонку без будь-яких змінних. Після введення exit усі змінні будуть відновлені.

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

    Встановлення та видалення змінних користувачів

    Відредагуйте файл.bashrc у вашій домашній директорії, додавши команду export, для експортування потрібної змінної. Потім виконайте команду source, щоб застосувати зміни. Створимо, наприклад, змінну CD:

    Додайте такий рядок (o, потім вставити, потім Esc і: wq):

    export CD="This is Losst Home"

    Тепер залишилося оновити конфігурацію:

    source .bashrc
    $ echo $CD

    Для видалення цієї змінної просто видаліть її.bashrc.

    Тепер додамо змінну оточення за допомогою .bash_profile. Ця змінна, як ви вже знаєте, буде доступна тільки при віддаленому вході:

    vi .bash_profile

    Додати рядок:

    export VAR2="This is Losst Home"

    І виконайте ці команди, щоб застосувати зміни та перевірити додавання змінної:

    source .bash_profile
    $ echo $VAR2

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

    ssh [email protected]
    $ echo $VAR2

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

    Примітка: Ці змінні доступні завжди, але не всім користувачам.

    Встановлення та видалення системних змінних оточення

    Створимо змінну, доступну для всіх користувачів, у всіх термінальних сесіях, крім віддалених, додаванням її до /etc/bash.profile:

    vi /etc/bash.profile

    export VAR="This is system-wide variable"

    Потім оновлюємо:

    source /etc/bash.bashrc

    Тепер ця змінна доступна всім користувачам, у всіх терміналах:

    echo $VAR
    $ sudo su
    $ echo $VAR
    $ su -
    $ echo $VAR

    Якщо ви хочете зробити змінну оточення доступною для всіх користувачів, які підключаються до цієї машини віддалено, відредагуйте файл /etc/profile:

    export VAR1="Ця система має широку функцію для лише 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

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

    Змінні оточення

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

    Тимчасове встановлення змінної оточення

    Встановлення змінної оточення на період сесії:

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

    Значення змінної зберігається до перезавантаження системи.

    Встановлення постійного значення

    Змінні оточення на рівні системи встановлюються через файл /etc/environment:

    ENVIRONMENT="dev"

    Встановлення змінного оточення для конкретного користувача через файл ~/.bashrc або ~/.bash_profile:

    PATH="$(PATH):/home/user/bin:"

    Увага!

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

    Також потрібно пам'ятати, що зміни набудуть чинності лише після перезавантаження сеансу!

    Перегляд значення змінної оточення

    Для перегляду значення змінної оточення є команда printenv:

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

    #shell, #bash, #environment

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

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

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

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

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

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

    Середовище має вигляд рядка, що містить пари виду "ключ-значення". Декілька значень, як правило, поділяються символом двокрапки (:). Кожна пара, загалом, виглядає приблизно так:

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

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

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

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

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

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

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

    Виведення змінних оболонки та середовища

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

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

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

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

    printenv SHELL
    /bin/bash

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

    env VAR1="blahblah" command_to_run command_options

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

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

    Але як переглянути змінні оболонки?

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

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

    Як правило, цей перелік досить довгий. Щоб вивести його у зручнішому форматі, відкрийте його за допомогою програми-пейджера:

    Цей перелік містить безліч додаткової інформації, яка в даний момент не потрібна (наприклад, деякі функції bash).

    Щоб почистити виведений результат, потрібно запустити команду set в режимі POSIX, який пропускає функції оболонки. Це потрібно виконати у субоболочці, щоб не змінити поточне середовище:

    (set-o posix; set)

    Дана дія виведе всі змінні середовища та оболонки.

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

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

    Швидше за все, список міститиме декілька змінних середовища, оскільки команда set виводить значення в лапках, а команди printenv та env – ні.

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

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

    Основні змінні середовища та оболонки

    Деякі особливо корисні змінні середовища та оболонки використовуються дуже часто.

    Нижче наведено список основних змінних середовища:

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

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

    • BASHOPTS: список опцій, використаних під час виконання bash. Це можна використовувати для того, щоб перевірити, чи працює середовище належним чином.
    • BASH_VERSION: запущена версія bash у зручній для читання формі.
    • BASH_VERSINFO: версія bash у форматі машиночитаемого.
    • COLUMNS: визначає ширину виведення у стовпцях
    • DIRSTACK: стек каталогів, доступних команд pushd і popd.
    • HISTFILESIZE: максимальна кількість рядків у файлі історії команд.
    • HISTSIZE: Кількість команд, які потрібно запам'ятовувати у списку історії
    • HOSTNAME: поточне ім'я хоста.
    • IFS:Внутрішній роздільник поля введення в командному рядку. За промовчанням встановлено пробіл.
    • PS1: визначає рядок первинного запрошення – вид командного рядка під час запуску сесії оболонки. Змінна PS2 встановлює рядок вторинного запрошення, якщо команда займає кілька рядків.
    • SHELLOPTS: параметри оболонки, які можна встановити за допомогою set.
    • UID: унікальний ідентифікатор користувача.

    Установка змінних оболонки та середовища

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

    Створення змінних оболонок

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

    TEST_VAR="Hello World!"

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

    Отже, отримана змінна оболонки дійсна у поточній сесії, але з передається її дочірнім процесам.

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

    set | grep TEST_VAR
    TEST_VAR="Hello World!"

    Переконатися, що ця змінна не є змінним середовищем, також можна, запустивши grep на результат команди printenv:

    printenv | grep TEST_VAR

    Ця дія не виведе жодного результату.

    Це можна використовувати, щоб відкрити значення будь-якої змінної оболонки чи середовища.

    echo $TEST_VAR
    Hello World!

    Як можна бачити, щоб звернутися до значення змінної потрібно використовувати символ $.

    Знову ж таки, отримана змінна не повинна бути передана будь-якому дочірньому процесу. Щоб це протестувати, всередині поточної оболонки розгорніть нову bash-оболонку:

    bash
    echo $TEST_VAR

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

    Щоб повернутися до вихідної оболонки, введіть exit:

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

    Тепер спробуйте перетворити змінну оболонки на змінну середовища. Це робиться шляхом експорту змінної. Команда, яка виконує експорт, має відповідну назву.

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

    printenv | grep TEST_VAR
    TEST_VAR=Hello World!

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

    bash
    echo $TEST_VAR
    Hello World!

    Чудово! Дочірня оболонка отримала змінну вихідну оболонку. Спробуйте експортувати ще одну змінну перед тим, як залишити дочірню оболонку.

    export NEW_VAR="Testing export"

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

    printenv | grep NEW_VAR
    NEW_VAR = Testing export

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

    Перевірте, чи можна відкрити цю змінну:

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

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

    Змінна NEW_VAR була встановлена ​​як змінне середовище дочірньої оболонки. Ця змінна дійсна для даної оболонки та її дочірніх оболонок та процесів. Після повернення користувача у вихідну оболонку це середовище було зруйновано.

    Переміщення та скидання змінних

    Змінна TEST_VAR все ще змінного середовища. Щоб знову зробити її змінної оболонки, наберіть:

    export -n TEST_VAR

    Тепер ця змінна більше не є змінним середовищем:

    printenv | grep TEST_VAR

    Це знову змінна оболонка:

    set | grep TEST_VAR
    TEST_VAR="Hello World!"

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

    Переконайтеся, що такої змінної немає:

    Результат не було виведено, оскільки змінну було скинуто.

    Автоматична установка змінних середовища

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

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

    Типи сесій оболонки

    Оболонка bash читає різні конфігураційні файли, залежно від того, як сесія була запущена. Перші два типи сесій, що визначають оболонку, - це стартова та дочірня.

    Стартова або початкова оболонка(login shell) – це сесія оболонки, що відкривається після авторизації користувача. Якщо користувач входить до терміналу або проходить авторизацію за допомогою SSH, буде відкрито стартову оболонку.

    Якщо нова сесія запускається з авторизованої (стартової) сесії (як раніше у прикладах запускалася нова bash-оболонка), ця сесія буде дочірньої (non-login shell). Щоб відкрити цю сесію, не потрібно проходити процедуру авторизації.

    Також сесії оболонки бувають інтерактивними та неінтерактивними.

    Інтерактивна сесіяоболонки (interactive shell) – це сесія, прив'язана до терміналу. Неінтерактивна сесія оболонки (non-interactive shell) – це сесія, яка не прив'язана до терміналу.

    Отже, сесії оболонки класифікуються за такими аспектами: стартова-дочірня, інтерактивна-неінтерактивна.

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

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

    Отже, спочатку стартова сесія отримує конфігурації файлу /etc/profile. Потім вона шукає конфігураційний файл стартової оболонки в домашньому каталозі користувача, щоб отримати певні користувачем конфігурації.

    Така сесія читає файли ~/.bash_profile, ~/.bash_login та ~/.profile і не читає інших файлів.

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

    Неінтерактивні оболонки читають змінне середовище BASH_ENV і вказаний файл для створення нового середовища.

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

    Як бачите, конфігурації розкидані по різних файлах.

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

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

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

    Відкрийте цей файл:

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

    export VARNAME=value

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

    source ~/.bashrc

    Щоб встановити загальносистемні змінні, внесіть їх у /etc/profile, /etc/bash.bashrc або /etc/environment.

    Підсумки

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

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

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

    Tags: ,
    mob_info