Sådan indstilles miljøvariabler i Bash på Linux

Der er mere end én type miljøvariabel på Linux. Lær, hvordan du kan se dem, oprette dem til lokale og eksterne logins, og få dem til at overleve genstarter.

Sådan fungerer miljøvariabler

Når du starter et terminalvindue og skallen inde i den, refereres til en samling af variabler for at sikre, at skallen er konfigureret korrekt. Disse variabler sikrer også, at enhver information, som terminalvinduet og -skallen måtte henvise til, er tilgængelig. Tilsammen indeholder disse variable indstillinger, der definerer det miljø, du finder inde i dit terminalvindue, helt ned til udseendet af kommandoprompten. Så de omtales naturligvis som miljøvariabler.

Nogle miljøvariabler er systemdækkende eller globale. Andre er session-dækkende og kan kun ses af dig. Andre kan ikke referere til dine sessionsmiljøvariabler. Der er et tredje sæt miljøvariabler defineret i skallen. Dine landestandard, tidszone og tastaturindstillinger, det sæt af mapper, der søges i, når shellen forsøger at finde en kommando, og din standardeditor, er alle gemt i shell-miljøvariabler.

Vi vil vise dig, hvordan du kan se de miljøvariabler, der findes på dit system, og vi vil beskrive, hvordan du opretter dine egne. Vi viser dig også, hvordan du gør dem tilgængelige for underordnede processer og er vedholdende på tværs af genstarter.

Miljøer og arv

Når en shell starter, gennemgår den en initialiseringsfase. Det er på dette tidspunkt, at den læser de miljøvariabler, der definerer miljøet for skallen.

Når et program eller en kommando startes fra denne shell – kendt som en underordnet proces – arver det miljøet fra forældreprocessen – men pas på! Som vi vil se, kan du oprette variabler, der ikke bliver tilføjet til dit miljø, så de ikke vil blive nedarvet af en underordnet proces.

Hvis den underordnede proces er en shell, initialiseres denne shell fra sit eget, friske sæt af variabler. Så hvis du ændrer kommandoprompten i den aktuelle shell og derefter starter en underordnet shell, vil den underordnede shell ikke arve den modificerede kommandoprompt fra forælderen.

Globale miljøvariabler

Efter konvention gives miljøvariable navne med store bogstaver. Her er nogle af de globale miljøvariabler, og hvad værdierne de indeholder repræsenterer:

SHELL: Navnet på den shell, der starter, når du åbner et terminalvindue. På de fleste Linux-distributioner, dette vil være bash medmindre du har ændret det fra standarden.
TERM: Terminalvinduer er faktisk emuleringer af en hardwareterminal. Dette holder den type hardwareterminal, der vil blive emuleret.
BRUGER: Brugernavnet på den aktuelle person, der bruger systemet.
PWD: Stien til den aktuelle arbejdsmappe.
OLDPWD: Den mappe du var i før du flyttede til den aktuelle arbejdsmappe.
LS_COLORS: Listen over farvekoder, der bruges af ls fremhæve forskellige filtyper.
MAIL: Hvis mailsystemet er blevet sat op på din Linux-computer (som standard er det ikke), vil dette holde stien til den aktuelle brugers postkasse.
PATH: En liste over mapper, som skallen vil søge igennem for at finde kommandoeksekverbare.
LANG: Indstillingerne for sprog, lokalisering og tegnkodning.
HJEM: Hjemmebiblioteket for den aktuelle bruger.
_: Understregningen (_) miljøvariablen indeholder den sidste kommando, der blev indtastet.

  Sådan installeres nye Linux-kerneversioner på OpenSUSE Leap

Vi kan se, hvad nogle af disse er indstillet til ved hjælp af intet mere sofistikeret end ekko, hvilket vil skriv værdierne til terminalvinduet. For at se værdien af ​​en miljøvariabel skal du tilføje et dollartegn ($) til starten af ​​dens navn.

En fin detalje er, at du kan bruge faneafslutning for at udfylde miljøvariabelnavnet for dig. Indtast et par bogstaver i navnet og tryk på Tab. Navnet på variablen udfyldes af skallen. Hvis det ikke sker, skal du skrive et par bogstaver mere for at skelne miljøvariablen fra andre kommandoer med navne, der starter med de samme bogstaver:

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

For at oprette dine egne globale miljøvariabler skal du tilføje dem til filen /etc/environment. Du skal bruge sudo for at redigere denne fil:

sudo gedit /etc/environment

For at tilføje en miljøvariabel skal du skrive dens navn, et lighedstegn (=) og den værdi, du ønsker, at miljøvariablen skal indeholde. Sæt ikke mellemrum før eller efter lighedstegnet (=). Navnet på miljøvariablen kan indeholde bogstaver, en understregning (_) eller tal. Det første tegn i et navn kan dog ikke være et tal.

Hvis der er mellemrum i værdien, skal du sørge for at sætte hele værdien i anførselstegn (“).

Gem filen, og log derefter ud og ind igen. Brug ekko til at teste, at en ny variabel eksisterer og holder den værdi, du har indstillet:

echo $WEBSITE

Fordi det er en global miljøvariabel og tilgængelig for alle, kan brugeren Mary referere til miljøvariablen, næste gang hun logger på:

echo $WEBSITE

Til se alle miljøvariabler med det samme, skriv printenv. Der er meget output, så det giver mening at røre det gennem sorteringen og derefter til mindre:

printenv | sort | less

Den sorterede liste over miljøvariabler vises for os på mindre.

Vi kan sende output gennem grep for at lede efter miljøvariabler relateret til et bestemt emne.

printenv | grep GNOME

Shell miljøvariabler

Dette er nogle af shell-miljøvariablerne, der bruges i bash til at diktere eller registrere dens adfærd og funktionalitet. Nogle af værdierne opdateres, mens du bruger terminalen. For eksempel vil COLUMNS-miljøvariablen blive opdateret, så den afspejler ændringer, du kan foretage i bredden af ​​terminalvinduet:

BASHOPTS: Kommandolinjeindstillingerne, der blev brugt, da bash blev lanceret.
BASH_VERSION: Bash-versionsnummeret som en streng af ord og tal.
BASH_VERSINFO: Bash-versionen som et ciffer.
KOLONNER: Den aktuelle bredde af terminalvinduet.
DIRSTACK: De mapper, der har været tilføjet til biblioteksstakken ved pushd-kommandoen.
HISTFILESIZE: Maksimalt antal linjer tilladt i historie fil.
HISTSTØRRELSE: Antal linjer med historie tilladt i hukommelsen.
HOSTNAVN: Computerens værtsnavn.
IFS: Den Intern feltseparator bruges til at adskille input på kommandolinjen. Som standard er dette et mellemrum.
PS1: PS1-miljøvariablen indeholder definitionen for den primære, standard- og kommandoprompt. Et sæt tokens kaldet escape-sekvenser kan inkluderes i definitionen af ​​din kommandoprompt. De repræsenterer sådanne ting som værts- og brugernavnet, den aktuelle arbejdsmappe og tiden.
PS2: Når en kommando strækker sig over mere end én linje, og der forventes mere input, vises den sekundære kommandoprompt. PS2-miljøvariablen har definitionen af ​​denne sekundære prompt, som som standard er større end-tegnet (>).
SHELLOPTS: Shell-indstillinger, du kan indstille ved hjælp af indstillingen.
UID: Den Bruger-id af den nuværende bruger.

  Sådan planlægger du nedlukning på Linux

Lad os tjekke et par af disse skalvariabler:

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

For fuldstændighedens skyld er her de tokens, du kan bruge i kommandopromptdefinitionerne:

t: Det aktuelle tidspunkt, formateret som TT:MM:SS.
d: Den aktuelle dato, udtrykt som ugedag, måned, dato.
n: Et tegn på ny linje.
s: Navnet på din skal.
W: Navnet på din nuværende arbejdsmappe.
w: Stien til din nuværende arbejdsmappe.
u: Brugernavnet på den person, der er logget ind.
h: Computerens værtsnavn.
#: Hver kommando i en shell er nummereret. Dette giver dig mulighed for at se nummeret på kommandoen i din kommandoprompt. Dette er ikke det samme som det nummer, kommandoen vil have i historiklisten.
$: Indstiller det sidste tegn i prompten til et dollartegn ($) for en almindelig bruger og et hash-symbol (#) for root-brugeren. Dette virker ved at kontrollere brugerens UID. Hvis det er nul, er brugeren root.

Du finder definitionen af ​​din PS1-miljøvariabel i din .bashrc-fil.

Oprettelse af sessionsmiljøvariabler

For at oprette miljøvariabler til eget brug skal du tilføje dem til bunden af ​​din .bashrc-fil. Hvis du vil have miljøvariablerne tilgængelige for fjernsessioner, såsom SSH-forbindelser, skal du også tilføje dem til din .bash_profile-fil.

Formatet for definitionen af ​​miljøvariablen er det samme for begge filer. For at tilføje en definition til din .bash_profile-fil skal du skrive denne i din hjemmemappe:

gedit .bashrc

Vi har tilføjet en miljøvariabel kaldet INHERITED_VAR. Bemærk ordet “eksport” i starten af ​​linjen.

Gem og luk din fil, når du er færdig med at redigere. Du kan logge ud og ind igen, eller du kan få shellen til at genlæse .bash_profile-filen ved at bruge dot-kommandoen (.) sådan her:

. .bashrc

Lad os nu oprette en miljøvariabel på kommandolinjen:

LOCAL_VAR="This session only"

LOCAL_VAL=

Hvis vi bruger ekko, kan vi se, at begge miljøvariabler er tilgængelige for os:

echo $LOCAL_VAR
echo $INHERITED_VAR

Du vil bemærke, at definitionen af ​​miljøvariablen INHERITED_VAR havde ordet “eksport” i starten af ​​linjen. Dette betyder, at miljøvariablen vil blive nedarvet af underordnede processer i den aktuelle shell. Hvis vi starter en anden ved at bruge bash-kommandoen, kan vi kontrollere de to variabler igen, inde fra underordnet shell:

bash
echo $LOCAL_VAR
echo $INHERITED_VAR

Som du kan se, er INHERITED_VAR tilgængelig i den underordnede shell, men LOCAL_VAR er det ikke. Vi får simpelthen en blank linje.

Selvom “eksport” tilføjer miljøvariabeldelen til det miljø, som underordnede processer arver, er INHERITED_VAR ikke en global miljøvariabel. For eksempel kan brugeren Mary ikke referere til det:

echo $INHERITED_VAR

For at lukke vores børnebash-session bruger vi exit:

exit

Nedarvede miljøer påvirker også scripts. Her er et simpelt script, der skriver værdierne af vores tre miljøvariabler til terminalvinduet:

#!/bin/bash

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

Dette blev gemt i en fil kaldet envtest.sh, og derefter gjort eksekverbart med følgende:

chmod +x envtest.sh

Når vi kører scriptet, kan det få adgang til to ud af tre miljøvariabler:

./envtest.sh

Scriptet kan se den globale miljøvariabel for WEBSITE og den eksporterede miljøvariabel INHERITED_VAR. Den kan ikke få adgang til LOCAL_VAR, selvom scriptet kører i den samme shell, hvor variablen blev oprettet.

  De 4 bedste Github-klienter til Linux

Hvis vi har brug for det, kan vi eksportere en miljøvariabel fra kommandolinjen. Vi gør det til vores LOCAL_VAR og kører derefter scriptet igen:

export LOCAL_VAR
./envtest.sh

Miljøvariablen er blevet tilføjet til miljøet i den aktuelle shell, og den vises således i det miljø, der er nedarvet af scriptet. Scriptet kan også referere til den miljøvariabel.

Fjernforbindelser

Globale miljøvariabler er tilgængelige for fjernlogin-sessioner, men hvis du vil have dine lokalt definerede miljøvariabler tilgængelige for dig eksternt, skal du tilføje dem til din .bash_profile-fil. Du kan indstille den samme miljøvariabel i filerne .bashrc og .bash_profile med forskellige værdier. Dette kunne opfanges af et script, for eksempel for at ændre dets adfærd for folk, der bruger systemet lokalt eller eksternt.

(Med risiko for at forvirre sager, er der også en .profile-fil. Den kan også indeholde miljøvariabledefinitioner. .profile-filen læses dog ikke, hvis .bash_profile-filen er til stede. Så det sikreste at gøre – og den bash-kompatible måde – er at bruge .bash_profile-filen.)

For at redigere .bash_profile-filen bruger vi gedit igen:

gedit .bash_profile

Vi vil tilføje den samme miljøvariabel med den samme værdi, som vi brugte før.

Gem dine ændringer og luk gedit.

På en anden computer laver vi en SSH forbindelse til testcomputeren.

ssh [email protected]

Når vi er forbundet, kører vi scriptet igen:

./envtest.sh

.bash_profile-filen er blevet læst som en del af initialiseringen af ​​fjernlogin, og miljøvariablen INHERITED_VAR er tilgængelig for os og scriptet.

Frakobling af en miljøvariabel

For at frakoble en miljøvariabel skal du bruge frakoble kommando. Hvis vi frakobler den globale miljøvariabel, WEBSITE, og den eksporterede miljøvariabel, INHERITED_VAR, vil de ikke længere være tilgængelige på kommandolinjen eller i underordnede processer:

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

Et punkt at bemærke er, at dette kun ændrer tilgængeligheden af ​​globale miljøvariabler for dig i denne session. En anden person, der er logget på samtidigt, vil stadig være i stand til at få adgang til sin forekomst af den globale miljøvariabel. Hans instans blev initialiseret og læst fra filen /etc/environment under hans login-proces og er uafhængig af andres kopi af variablen.

Som et eksempel kan brugeren mary stadig få adgang til WEBSITE-miljøvariablen og læse dens værdi, selvom brugeren dave har deaktiveret den i sin session:

echo $WEBSITE

Miljøkontrol

Miljøvariabler kan bruges til at lade scripts og applikationer vide, hvordan de skal opføre sig. De kan bruges til at gemme indstillinger eller små mængder data. For eksempel kan et script udfylde et miljø med en værdi, der kan refereres til af andre scripts uden at skulle skrive dem til en fil.