Как да зададете променливи на средата в Bash на Linux

Има повече от един тип променлива на средата в Linux. Научете как да ги виждате, да ги създавате за локални и отдалечени влизания и да ги накарате да оцелеят при рестартиране.

Как работят променливите на средата

Когато стартирате терминален прозорец и черупката вътре в него, се позовава на колекция от променливи, за да се гарантира, че обвивката е конфигурирана правилно. Тези променливи също така гарантират, че всяка информация, към която може да се наложи да се позовават прозорецът на терминала и обвивката, е налична. Съвкупно тези променливи съдържат настройки, които определят средата, която намирате в прозореца на терминала, чак до вида на командния ред. Така че, естествено, те се наричат ​​​​променливи на средата.

Някои променливи на средата са общосистемни или глобални. Други са за цялата сесия и могат да бъдат видени само от вас. Други не могат да се позовават на променливите на вашата среда на сесията. Има трети набор от променливи на средата, дефинирани в обвивката. Вашият локал, часова зона и настройки на клавиатурата, наборът от директории, търсени, когато шелът се опитва да намери команда, и вашият редактор по подразбиране, всички се съхраняват в променливи на средата на обвивката.

Ще ви покажем как да видите променливите на средата, които съществуват във вашата система, и ще опишем как да създадете свои собствени. Също така ще ви покажем как да ги направите достъпни за дъщерни процеси и да бъдат постоянни при рестартиране.

Среда и наследство

Когато една обвивка стартира, тя преминава през фаза на инициализация. В този момент той чете променливите на средата, които дефинират средата на обвивката.

Когато програма или команда се стартира от тази обвивка – известна като дъщерен процес – тя наследява средата на родителския процес – но внимавайте! Както ще видим, можете да създавате променливи, които не се добавят към вашата среда, така че няма да бъдат наследени от дъщерен процес.

Ако дъщерният процес е обвивка, тази обвивка ще се инициализира от собствен, свеж набор от променливи. Така че, ако промените командния ред в текущата обвивка и след това стартирате дъщерна обвивка, дъщерната обвивка няма да наследи модифицирания команден ред на родителя.

Глобални променливи на околната среда

По конвенция на променливите на средата се дават имена с главни букви. Ето някои от глобалните променливи на средата и какво представляват стойностите, които съдържат:

SHELL: Името на обвивката, която ще се стартира, когато отворите прозорец на терминал. В повечето дистрибуции на Linux, това ще бъде баш освен ако не сте го променили от по подразбиране.
ТЕРМ: Прозорците на терминала всъщност са емулации на хардуерен терминал. Това съдържа типа хардуерен терминал, който ще бъде емулиран.
ПОТРЕБИТЕЛ: Потребителското име на текущия човек, използващ системата.
PWD: Пътят към текущата работна директория.
OLDPWD: Директорията, в която сте били преди да преминете към текущата работна директория.
LS_COLORS: Списъкът с цветови кодове, използвани от ls маркирайте различните типове файлове.
ПОЩА: Ако пощенската система е настроена на вашия компютър с Linux (по подразбиране не е), това ще задържи път до пощенската кутия на текущия потребител.
ПЪТ: Списък с директории, в които обвивката ще търси, за да намери изпълними файлове на команди.
LANG: Настройките за език, локализация и кодиране на знаци.
HOME: Домашната директория на текущия потребител.
_: Променливата на средата за долно подчертаване (_) съдържа последната въведена команда.

  Как да играете Overlord на Linux

Можем да видим какво са настроени някои от тях, използвайки нищо по-сложно от ехо, което ще бъде запишете стойностите в прозореца на терминала. За да видите стойността, съхранявана от променлива на средата, трябва да добавите знак за долар ($) в началото на името й.

Приятно докосване е, че можете да използвате завършване на раздела за да попълним името на променливата на средата вместо вас. Въведете няколко букви от името и натиснете 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 като цифра.
КОЛОНИ: Текущата ширина на прозореца на терминала.
DIRSTACK: Директориите, които са били добавен към стека на директории чрез командата pushd.
HISTFILESIZE: Максимален брой от разрешени линии в файл с история.
HISTSIZE: Брой разрешени редове в паметта.
HOSTNAME: Името на хоста на компютъра.
IFS: Вътрешен разделител на полета използва се за разделяне на въвеждане в командния ред. По подразбиране това е интервал.
PS1: Променливата на средата PS1 съдържа дефиницията за основния, по подразбиране и командния ред. Набор от токени, наречени escape последователности, може да бъде включен в дефиницията на вашия команден ред. Те представляват такива неща като хост и потребителско име, текущата работна директория и часа.
PS2: Когато команда обхваща повече от един ред и се очаква повече въвеждане, се показва вторичният команден ред. Променливата на средата PS2 съдържа дефиницията на тази вторична подкана, която по подразбиране е знакът по-голямо от (>).
SHELLOPTS: Опции за обвивка, които можете да зададете, като използвате опцията set.
UID: The Потребителски идентификатор на текущия потребител.

  Как да инсталирате Skype на Linux

Нека проверим няколко от тези променливи на обвивката:

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

За пълнота, ето токените, които можете да използвате в дефинициите на командния ред:

t: Текущото време, форматирано като HH:MM:SS.
d: Текущата дата, изразена като ден от седмицата, месец, дата.
n: Знак за нов ред.
s: Името на вашата черупка.
W: Името на текущата ви работна директория.
w: Пътят към текущата ви работна директория.
u: Потребителското име на лицето, което е влязло.
h: Името на хоста на компютъра.
#: Всяка команда в рамките на обвивката е номерирана. Това ви позволява да видите номера на командата във вашия команден ред. Това не е същото като номера, който командата ще има в списъка с история.
$: Задава крайния знак на подкана на знак за долар ($) за обикновен потребител и хеш символ (#) за root потребител. Това работи чрез проверка на UID на потребителя. Ако е нула, потребителят е root.

Ще намерите дефиницията на вашата променлива на средата PS1 във вашия .bashrc файл.

Създаване на променливи на средата на сесията

За да създадете променливи на средата за ваша собствена употреба, добавете ги в долната част на вашия .bashrc файл. Ако искате променливите на средата да са достъпни за отдалечени сесии, като SSH връзки, ще трябва да ги добавите и към вашия .bash_profile файл.

Форматът на дефиницията на променливата на средата е еднакъв и за двата файла. За да добавите дефиниция към вашия .bash_profile файл, въведете това в домашната си директория:

gedit .bashrc

Добавихме променлива на средата, наречена INHERITED_VAR. Обърнете внимание на думата „експорт“ в началото на реда.

Запазете и затворете файла си, след като приключите с редактирането. Можете да излезете и да влезете отново или да накарате обвивката да прочете повторно файла .bash_profile, като използвате командата dot (.) по следния начин:

. .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, въпреки че скриптът се изпълнява в същата обвивка, където е създадена променливата.

  Как да инсталирате Slackware Linux

Ако трябва, можем да експортираме променлива на средата от командния ред. Ще направим това с нашия 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

Контрол на околната среда

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