
Когато започнете да се занимавате с Linux, една от най-объркващите концепции е известната променлива на средата. PATHВсички ти казват неща като „добави го към твоя PATH“, „провери си PATH“ или „не работи, защото не е във твоя PATH“, но рядко обясняват спокойно какво точно е, за какво е и как да го управляваш, без да объркаш нещата в системата.
В тази статия ще разгледаме подробно какви са те. променливи на средата в Linuxкаква роля играе PATHТова обяснява как да го преглеждате и променяте временно или постоянно, кои файлове са включени, какви типични проблеми причинява и как да ги решите. Целта е, когато приключите с четенето, да разберете ясно какво правите и защо, без да се налага да се задълбочавате в неразбираем жаргон.
Какво е променлива на средата в Linux?
Когато говорим за изчисления, променлив Това е просто име, свързано със стойност, съхранена в паметта, която може да се променя с течение на времето. В контекста на операционната система, Променливи на средата Това са именувани стойности, които се намират в средата за изпълнение на обвивката и процеса и се използват за съхранение настройки, маршрути, идентификационни данни и предпочитания че програмите трябва да функционират.
В Linux (и други Unix-подобни системи) тези променливи образуват един вид глобален речник с двойки NAME=VALUE, които автоматично се предават на дъщерните процеси, когато команди или скриптове се изпълняват от shell-а. По този начин, програмата може да заявява стойности като домашната директория на потребителя, системния език, използваната shell или, както ще видим скоро, директориите, където да търси изпълними файлове.
Променливите на средата могат да бъдат локално или глобалноЛокалната променлива съществува само в рамките на обвивката (shell), където е дефинирана, докато експортираната променлива се наследява от всички нишки (скриптове, програми и др.), стартирани от тази обвивка. Освен това, те могат да бъдат дефинирани за един потребител или за цялата система, засягайки всички влезли в системата потребители.
Често срещани променливи на средата в Linux
Системата дефинира по подразбиране редица променливи, които е добре да се знаят, защото се използват постоянно. Някои от най-често срещаните са: НАЧАЛО, ПОТРЕБИТЕЛ, ОБВИВКА, ЕЗИК, ПАРОЛА и ПЪТсред много други. Всички те обикновено се пишат с главни букви, за да се различават от другите нормални променливи в скриптовете или в shell-а.
Например, променливата HOME сочи към домашната директория на текущия потребител (нещо подобно /home/juan), ПОТРЕБИТЕЛЯ Съдържа името на потребителя, който е влязъл в системата, SHELL показва пътя на обвивката по подразбиране (като /bin/bash o /bin/zsh) Y Хората с увреждания Запазете текущата работна директория, същата, която е показана от командата. pwd.
Важни са и променливите, свързани с езика и регионалните настройки, като например ЕЗИК или тези, които започват с LC_които определят набора от символи, формата на датата, формата на валутата и т.н. Друг класически метод е РЕДАКТОР o VISUALкойто много инструменти използват, за да знаят кой текстов редактор да отворят, когато трябва да редактирате нещо, както е в случая с crontab -e.
Какво точно представлява променливата на средата PATH?
Звездата на тази статия е променливата на средата PATHТази променлива съдържа подреден списък с директории разделени с две двоеточия (:Това е мястото, където системата ще търси изпълними файлове, когато въведете команда в терминала, без да посочите пълен път. Това буквално е „пътят“, който вашата обвивка следва, за да намери програми.
Когато въведете команда като ls o дървоВсъщност вие искате от системата да изпълни двоичен файл, разположен някъде на вашия диск. Благодарение на променливата PATHОбвивката преминава през всяка директория в този списък, по ред, докато не намери изпълним файл със същото име като въведената от вас команда. Ако го намери, го изпълнява; ако не, връща класическото съобщение на командата не е намерена.
В много дистрибуции е често срещано, че PATH включват маршрути от стила /usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbinВсеки път, който се появява там, е директория, където се намират изпълними файлове, които можете да извикате, без да посочвате абсолютния път, което прави работата в терминала много по-удобна.
Редът на директориите в PATH Това е от решаващо значение, защото определя предимствоАко изпълним файл със същото име съществува в два различни пътя, ще се използва този, който се появява първи в списъка. Това ви позволява например да имате алтернативна версия на програма в /usr/local/bin което презаписва системната версия в /usr/bin просто чрез промяна на реда на маршрутите.
Как да видите променливите на средата и текущата стойност на PATH
За да проверите активните променливи на средата във вашата shell сесия, имате на разположение няколко команди. Една от най-директните е Околна среда, показва всички дефинирани променливи с неговия формат NAME=VALUE. Ако изпълните env Ще видите низ от редове, между които ще се появи HOME, USER, SHELL, PATHИ др
Друга често използвана команда е printenvкоето също изброява променливите на средата, но е особено полезно за търсене на една конкретна променлива. Ако въведете printenv PATHИзходът ще бъде само текущата стойност на променливата PATHТова ви позволява да видите с един поглед какви директории съдържа и в какъв ред са разположени.
Освен това, можете да използвате командата ехо до знака за долар, за да се покаже съдържанието на която и да е променлива. Например, echo $USER Ще се покаже потребителското ви име и echo $PATH Ще ви покаже пълния списък с директории, където системата ще търси изпълними файлове, разделени от две точкиТози синтаксис с $NOMBRE Това е този, който често се използва и в скриптовете.
Как да разбера къде се намира дадена команда в системата
Знаейки, че командата е в PATH Това е чудесно, но понякога е необходимо да откриете точния му път във файловата система. За целта имате команди като който y къде е, които ви казват къде се намира физически двоичният файл, който се изпълнява, когато извикате команда.
Ако бягате, например, which treeТипичният изход ще бъде нещо подобно /usr/bin/treeТова показва, че изпълнимият файл се намира в тази директория, която от своя страна е включена във вашата променлива. PATHОт своя страна, командата къде е Той е малко по-пълен и може да покаже пътя до двоичния файл, както и местоположението на неговите man страници и други свързани файлове.
Тази информация е много полезна, когато подозирате, че се изпълнява различна версия на програмата от тази, която сте предполагали, или когато отстранявате грешки, свързани с маршрути и приоритет в PATHВиждането точно кой двоичен файл се извиква избягва много главоболия.
Как да изпълняваме shell скриптове и тяхната връзка с PATH
Shell скриптовете обикновено запазват кода си във файлове с разширение . .shВъпреки че не е задължително. Можете да ги стартирате по два начина: посочващ явния маршрут или разчитайки на това скриптът да е в директория, включена в PATHАко скриптът е във вашата текуща директория, класическият начин е да го използвате ./mishcript.sh.
Ако искате да извикате скрипта, без да посочвате пълния път, най-добре е да го запишете в директория в PATHКато ~/bin (ако го добавите), /usr/local/bin или друга директория с двоични файлове. Можете също така създаване на .desktop файлове За да стартирате приложения без да променяте PATH. По този начин е необходимо само да въведете името на скрипта, при условие че има разрешения за изпълнение и правилния интерпретатор, посочен в първия ред (известният шебанг, като #!/bin/bash).
Нещо важно е разликата между изпълнението на скрипт с ./script.sh и изходен код script.shВ първия случай се създава подпроцес, който наследява променливите на средата ви, но не връща никакви промени, направени в тях; във втория скриптът се изпълнява в текущата ви обвивка, така че може директно да променя променливи като PATH и тези промени ще останат активни във вашата сесия.
Как да създавате и променяте променливи на средата в Linux
Основният начин за създаване или коригиране на променлива на средата в Bash е чрез използване на командата износТипичният синтаксис е export NOMBRE="valor"където дефинирате стойността и я маркирате като експортируема към дъщерни процеси. Например, бихте могли да направите export MI_VARIABLE="HolaMundo" и след това го проверете с echo $MI_VARIABLE.
Ако дефинирате променлива без износ (например MI_VAR=algoТова ще съществува във вашата обвивка, но няма да се разпространи към програмите или скриптовете, които изпълнявате. Вместо това, използвайте износ Вие гарантирате, че всеки дъщерен процес може да чете тази променлива, което е ключово, когато искате вашите приложения да имат достъп до настройки като идентификационни данни, пътища на проекти или параметри на часовата зона.
За да се върне или изтрие променлива на средата, се използва командата неустановено, с unset VAR Премахвате променливата VAR от текущата среда, което означава, че тя вече няма да бъде достъпна за нови нишки. Например, ако го направите unset TZ след като е докоснал променливата TZСистемата ще се върне към поведението си по подразбиране за часовата зона, когато проверите времето отново с date.
Как да промените променливата PATH (временни промени)
Променете променливата PATH Временно, тоест само за текущата терминална сесия, е толкова просто, колкото да създадете нова стойност от съществуващата. Често срещана практика е да се добави нова директория в края или началото на списъка с пътища, в зависимост от приоритета, който искате да дадете на тези изпълними файлове.
за добавете маршрут в края de PATH Можеш да направиш нещо подобно export PATH="$PATH:/home/usuario/scripts"По този начин не губите съществуващото съдържание; просто добавяте новата си директория в края на списъка. От този момент нататък можете да изпълнявате всеки скрипт или двоичен файл в нея. /home/usuario/scripts без да се пише пълният маршрут.
Ако, от друга страна, искате този нов маршрут да има приоритет пред останалите, можете вмъкнете го в началото haciendo export PATH="/home/usuario/scripts:$PATH"Така че, ако има изпълним файл със същото име във вашата папка със скриптове и в /usr/binВашата лична папка ще бъде използвана, тъй като пътят към нея е посочен напред.
Възможно е също напълно заменете стойността на PATH дефинирането му от нулата, например export PATH="/usr/local/bin:/usr/bin:/bin"Това е сложно, защото ако пропуснете критични пътища, можете да попречите на системата да намери основни команди. Освен това, всички тези промени, направени в терминала, са временни: веднага щом затворите сесията на shell, те ще бъдат загубени и когато отворите отново терминала, ще се зареди конфигурацията по подразбиране.
Как да конфигурирате PATH и други променливи на средата за постоянно
Ако искате промяна в PATH (или във всяка друга променлива на средата), която да се поддържа всеки път, когато отваряте терминал, трябва да я дефинирате в файлове за стартиране на shellВ Bash най-често използваното нещо е ~/.bashrc за интерактивни черупки и ~/.bash_profile o ~/.profile за входни обвивки. В Zsh най-често срещаният еквивалент е ~/.zshrc.
Типичният подход е да редактирате конфигурационния си файл с текстов редактор и да добавите ред, където да коригирате променливата. Например, можете да отворите вашия ~/.bashrc с Нано o Vim и добавете нещо подобно накрая export PATH="$PATH:/opt/tacata"Запазвате файла, изпълнявате го source ~/.bashrc за да презаредите конфигурацията и от този момент нататък директорията /opt/tacata Винаги ще бъде включен във вашия PATH.
В допълнение към личните файлове, има и конфигурационни файлове цялостен които засягат всички потребители на системата. Сред най-често срещаните са /etc/profile, директорията /etc/profile.d/, /etc/bashrc o /etc/bash.bashrc, а в някои случаи и архивът /etc/environmentПромяната на тези файлове изисква администраторски права и трябва да се извършва внимателно, защото една грешка може да наруши работната среда на всички потребители.
Важно е също да се разбере, реда, в който са заредени Тези файлове. В зависимост от това дали е login shell или не, Bash може първо да прочете глобалните файлове, след това ~/.bash_profile o ~/.profile, и накрая ~/.bashrcАко поставите експорт във файл, който текущата ви сесия не зарежда, промяната няма да влезе в сила. Ето защо е обичайно да се дефинират PATH персонализации в ~/.bashrc в настолни среди.
Локални променливи, глобални променливи и наследяване към подпроцеси
Когато работите с черупката, е полезно да правите разлика между локални и екологични променливиЛокална променлива е тази, която дефинирате в обвивката, без да я експортирате, например local_var=edwardТази променлива е видима само в рамките на този екземпляр на обвивката и не се предава на процесите, които изпълнявате.
когато използвате износВие преобразувате променливата в глобална променлива на средата в рамките на вашата сесия. Например, ако го направите export GLOBAL_VAR="Hola" и след това изпълняваш echo $GLOBAL_VARЩе видите стойността и всеки скрипт или програма, стартирани от тази обвивка, също ще имат достъп до нея. GLOBAL_VARИменно това наследяване кара конфигурацията на средата да се разпространи към вашите приложения.
Наследяването обаче е еднопосочно: подпроцесът получава копие от средата на родителя си, но промените, които прави в променливите си, не се предават обратно на родителския процес. Следователно, ако искате скрипт да променя вашата PATH За да го изпълнявате постоянно във вашата сесия, трябва да го изпълните с източник (o .) вместо да го стартирате като самостоятелна команда.
Използване на .env файлове и конфигурация на средата
В много проекти за разработка, особено в уеб приложения и микросървиси, използването на .env файлове за централизиране на конфигурацията. Тези файлове обикновено съдържат редове във формат NOMBRE=VALOR, например DB_HOST=localhost o API_KEY=xxxxxxxx, а след това някакъв инструмент или библиотека се грижи за зареждането им в променливите на средата на приложението.
Този подход позволява ясно разграничаване на изходен код де ла чувствителна конфигурациякато например идентификационни данни за база данни или API ключове, предотвратявайки попадането им в публични хранилища. Всяка среда (разработка, тестване, производство) може да има свой собствен файл .env с различни стойности, което осигурява голяма гъвкавост при внедряването на едно и също приложение в различни контексти.
Важно е обаче да се контролират разрешенията и местоположението на тези файлове, тъй като те съдържат чувствителна информация. Обичайната практика е да се добавят към .gitignore за да се предотврати качването им в контрола на версиите и да се ограничи четенето им на сървъра, така че само потребителят, изпълняващ приложението, да има достъп до тях.
Най-добри практики при работа с PATH и други променливи на средата
Боравене Променливи на средата Изглежда тривиално, но лошото управление може да доведе до проблеми, които са трудни за разрешаване. Добър навик е да се използват описателни имена когато създавате свои собствени променливи, като например DB_USER, REDIS_PORT o PROJECT_ROOTизбягвайки загадъчни акроними или общи имена, които никой не си спомня след известно време.
Con PATH По-специално, лесно е да попаднете в капана на безразборно добавяне на пътища, докато променливата се превърне в безкраен низ. Това не само затруднява четенето, но може да причини и конфликти, ако има дублирани изпълними файлове в различни пътища. Поддържането на сравнително кратък и добре организиран PATH намалява грешките и опростява отстраняването на неизправности, когато нещо се обърка.
Друга ключова препоръка е водете запис Какви променливи на средата използва един проект и какво означава всяка от тях? Включете примерен файл в хранилището (като например .env.exampleРаздел в README файла със списъка с очакваните променливи помага на други разработчици (или на вас самите в бъдеще) бързо да разберат как да настроят правилната среда.
Често срещани проблеми, свързани с PATH, и как да ги отстраните
Една от най-често срещаните грешки в Linux е типичната „командата не е намерена„Когато се опитвате да стартирате програма, за която знаете, че е инсталирана. В много случаи проблемът е, че директорията, където се намира изпълнимият файл...“ Не е включено в PATH.Или е зададена стара стойност, или просто сте презаписали променливата по погрешка.
За да разрешите подобни ситуации, можете да започнете с echo $PATH за да проверите кои маршрути се използват. След това използвайте whereis comando o which comando Ще ви каже дали изпълнимият файл съществува и къде се намира. Ако пътят, върнат от тези команди, не се появява във вашия PATH, значи сте идентифицирали проблема: ще трябва да добавите тази директория към променливата, или временно с износ или постоянно във вашите конфигурационни файлове.
Друга класика са печатни грешки При промяна на променливата. Напишете PAT вместо PATH Или пропускането на двоеточие между пътищата може да доведе до това системата да спре да намира основни команди. Всеки път, когато осъществявате достъп до PATH, е добра идея да го покажете отново с `pth`. echo $PATH и проверете дали нищо не липсва и дали маршрутите изглеждат правилно разделени.
Накрая, заслужава да се споменат конфликтите, които могат да възникнат при редактиране на файлове, като например /etc/environment o /etc/profileПрезаписването на PATH на системно ниво, без да се вземат предвид дефинициите на пакети и услуги, може да наруши средата за всички потребители. Архивирането на тези файлове преди модифицирането им е почти задължително, за да можете да отмените промените, ако нещо се обърка.
Променливи на околната среда и сигурността
на Променливи на средата Те често се използват за съхраняване на идентификационни данни и чувствителни данни, именно за да се предотврати директното им появяване в кода. Това обаче не означава, че са напълно сигурно място: всеки потребител или процес с достъп до средата може да ги види, използвайки команди като Околна среда o printenvили чрез инструменти за отстраняване на грешки.
За да се намалят рисковете, е препоръчително ограничаване на разрешенията четене на файловете, където са дефинирани тези променливи, като например .bashrc или файловете .envтака че само оторизираният потребител да има достъп до тях. Команди като chmod 600 archivo Те помагат да се гарантира, че неупълномощени трети страни не могат да прочетат чувствителни настройки.
Също така трябва да внимавате приложенията да не преобърнат обкръжението си в лог файловете, когато възникне грешка. Ако дадена услуга отпечата цялата си среда при повреда, тя може да остави API ключове или пароли разкрити в системните лог файлове. Прегледът на поведението по подразбиране на вашите инструменти и филтрирането на информацията преди регистрирането ѝ е добър допълнителен слой защита.
Ролята на PATH и променливите на средата в CI/CD и контейнери
В съвременните среди за непрекъсната интеграция (CI) и непрекъснато внедряване (CD), както и в системи, базирани на контейнери, почти цялата конфигурация се извършва чрез Променливи на средатаОбичайна практика е при стартиране на контейнер, стойности като URL адреса на базата данни, потребители, пароли или режими на изпълнение да се предават чрез опциите на инструмента за управление на контейнери.
В тези сценарии, променливата PATH Това е ключово и за осигуряване на безпроблемна работа на необходимите инструменти и двоични файлове в контейнера. Образите обикновено определят свой собствен вътрешен PATH и в някои случаи това трябва да се коригира при инсталиране на допълнителни компоненти, които трябва да са достъпни отвсякъде.
CI/CD платформите ви позволяват също да дефинирате променливи на средата по проект, задача или среда (подготовка, производство и др.). Това се вписва идеално във философията за разделяне на кода и конфигурацията. Улеснява повторното използване на един и същ артефакт от компилацията променяйки само променливите, които се инжектират по време на изпълнение.
Овладяване на боравенето с PATH и останалите променливи на средата в Linux Това ви позволява да разберете какво всъщност се случва, когато изпълнявате команда, как е конфигурирана работната ви среда, къде са дефинирани системните предпочитания и как да направите скриптовете и приложенията си по-преносими, сигурни и по-лесни за поддръжка; оттам нататък, настройването на пътища, добавянето на изпълними файлове или диагностицирането на причината, поради която нещо „не може да бъде намерено“, престава да бъде черна магия и се превръща в преглед на това, което е дефинирано във вашата среда и как се наследява.