Terug naar blog

Hoe omgevings- en shellvariabelen te lezen en in te stellen op een Linux VPS

Hoe omgevings- en shellvariabelen te lezen en in te stellen op een Linux VPS

De meerderheid van de tech-community vindt het prettig om met systemen te communiceren via de command-line interface (CMD) of shell. Over het algemeen maakt het hun werk gemakkelijker. Je kunt bijvoorbeeld een shell-opdracht maken die automatisch verschillende taken kan uitvoeren, in tegenstelling tot het moeten klikken door verschillende knoppen van een GUI.

Wanneer je een shell- of CMD-programma start, verzamelt het verschillende stukken informatie. Deze informatie bepaalt hoe het programma toegang krijgt tot de onderliggende systeembronnen en het algemene gedrag. Je kunt dit opslaan op een plek die de omgeving wordt genoemd. De omgeving bestaat uit strings die sleutel-waarde-paren vertegenwoordigen. In deze handleiding gebruiken we Ubuntu 20.04 VPS als voorbeeld om je te begeleiden bij het instellen van omgevings- of shell-variabelen. De gids zou ook van toepassing moeten zijn op andere Linux-distributies.

Wat is het verschil tussen omgevingsvariabelen en shell-variabelen?

Wanneer je een sessie start, wordt er informatie verzameld uit de instellingen en configuratiebestanden van het systeem. Vervolgens is deze beschikbaar voor het shell-proces en de bijbehorende subprocessen. Deze informatie is een set sleutel-waarde-paren in dit formaat:

De namen van de variabelen, d.w.z. sleutels, zijn hoofdlettergevoelig. Het is echter conventioneel geaccepteerd om ze in HOOFDLETTERS te schrijven. Dit helpt je om ze te onderscheiden binnen andere contexten. Met het dubbelpunt-teken ‘:’ kun je meerdere waarden aan dezelfde variabele toewijzen. Het is ook belangrijk om ervoor te zorgen dat er geen spatie rond de = staat. De sleutels zijn de variabelen en worden in tweeën ingedeeld: omgevingsvariabelen en shell-variabelen. Omgevingsvariabelen bevatten alle variabelen die systeembreed zijn gedefinieerd en beschikbaar zijn voor alle sub-shells of -processen. Ze helpen informatie door te geven aan de processen die je start via de shell-opdrachten. Shell-variabelen bevatten alleen variabelen die zijn gedefinieerd in de specifieke shell-sessie. Bovendien bevatten ze alleen variabelen die exclusief beschikbaar zijn binnen hun shell-instantie.

Omgevings- en shell-variabelen weergeven

Standaard biedt de terminal twee opdrachten om de omgevings- en shell-variabelen op te sommen: env of printenv. Ze tonen dezelfde informatie in hun standaardstatus. Hier is een voorbeeld van de uitvoer van deze opdrachten:

Met env:

environment variables Environmental and Shell Variables

Met printenv:

printenv

Zoals je kunt zien, is de uitvoer hetzelfde. Het verschil ontstaat wanneer je de waarde van een specifieke sleutel wilt hebben. Dat is wanneer je printenv gebruikt met de naam van de variabele:

printenv shell

Om meerdere waarden te zien, kun je meer dan één argument doorgeven aan de printenv-opdracht. De waarden verschijnen in de volgorde waarin je de argumenten hebt ingevoerd:

printenv multiple commands

Je kunt ook de echo-opdracht gebruiken met de variabelenaam om de waarde van een variabele weer te geven:

echo variable

Met de env-opdracht kun je de omgeving waarin programma's worden uitgevoerd aanpassen door variabelendefinities door te geven in een syntaxis zoals:

Hierdoor kun je waarden overschrijven of nieuwe waarden instellen die door het subproces kunnen worden gebruikt. De opdrachten printenv en env tonen omgevingsvariabelen zoals hierboven te zien is. Deze waren al gedefinieerd voor de systeemprocessen. Als je een lijst met shell-variabelen wilt zien, kun je de set-opdracht gebruiken. Het typen van set zonder variabelen retourneert een lijst met alle omgevingsvariabelen, shell-variabelen, lokale variabelen en shell-functies:

set command Environmental and Shell Variables

De variabelen kunnen te talrijk zijn. Indien nodig kun je ze pagineren met de opdracht:

Je kunt de uitvoer verder opschonen door op te geven dat de set-opdracht in POSIX moet worden uitgevoerd, waardoor de shell-functies niet worden afgedrukt. Hier voeren we dit uit in een subshell (een aparte instantie van de opdrachtprocessor) om te voorkomen dat de opdracht de huidige omgeving wijzigt:

Het bovenstaande toont alle omgevings- en shell-opdrachten die beschikbaar zijn op het systeem. Je kunt de uitvoer verkleinen met de volgende opdracht om te proberen alleen shell-variabelen te krijgen:

Een voorbeelduitvoer van de bovenstaande opdracht is:

lists all environmental and shell commands Environmental and Shell Variables

Hoewel de opdracht een paar omgevingsvariabelen kan bevatten, helpt het u om onderscheid te maken tussen shell- en omgevingsvariabelen. Dat komt omdat de set-opdracht de waarden van de variabelen tussen aanhalingstekens plaatst, terwijl de opdrachten printenv en env de waarden niet tussen aanhalingstekens plaatsen. Shell-variabelen zijn handig voor het instellen van persistente waarden voor sessies, zonder wijzigingen permanent naar bestanden te schrijven.

Gemeenschappelijke omgevingsvariabelen

USER – De momenteel ingelogde gebruiker.
SHELL – De shell die de opdrachten die u invoert zal interpreteren. De standaard is bash, maar u kunt dat wijzigen.
HOME – Home-directory van de huidige gebruiker.
TERM – Specificeert het type terminal dat moet worden geëmuleerd. Toont de huidige geëmuleerde terminal.
PWD – De huidige werkmap.
OLDPWD – De vorige werkmap. Dit helpt de shell om naar de vorige map te schakelen wanneer u de opdracht voor het wijzigen van de map invoert als cd.

EDITOR – De standaard bestandseditor wanneer u edit typt in uw terminal.
LS_COLORS – Definieert kleurcodes die worden gebruikt om gekleurde uitvoer toe te voegen wanneer u de opdracht ls invoert. Het helpt bestandstypen te onderscheiden en informatie aan gebruikers te verstrekken.
LOGNAME – De naam van de huidige gebruiker.
MAIL – Definieert het pad naar de mailbox van de huidige gebruiker.
LANG – Definieert de huidige locale-instelling.
PATH – Specificeert een lijst met mappen waarin moet worden gezocht bij het uitvoeren van de opdrachten. Tijdens de uitvoering van een opdracht zoekt het systeem door deze mappen en gebruikt het de eerste gevonden executable.
_ – De laatst uitgevoerde opdracht.

Gemeenschappelijke shell-variabelen:

BASH_VERSION – De versie van bash, in voor mensen leesbare uitvoer.
BASH_VERSINFO – De versie van bash, in machineleesbare uitvoer.
BASHOPTS – De lijst met opties die zijn gebruikt toen bash werd uitgevoerd. Handig om te bepalen of de shell-omgeving zal werken zoals u verwacht.

COLUMNS – Het aantal kolommen breed dat wordt gebruikt om uitvoer op het scherm te tekenen.
DIRSTACK – De stapel mappen die beschikbaar zijn met de opdrachten pushd en popd.
HOSTNAME – De hostnaam van de computer op dit moment.
HISTFILESIZE – Aantal regels met opdrachtgeschiedenis opgeslagen in een bestand.
HISTSIZE – Aantal regels met opdrachtgeschiedenis toegestaan in het geheugen.
IFS – De interne veldscheider om invoer op de opdrachtregel te scheiden. Dit is standaard een spatie.
SHELLOPTS-Gebruikt om shell-opties in te stellen.
UID-De UID van de huidige gebruiker.
PS1– De primaire definitie van de opdrachtprompt. Dit wordt gebruikt om te bepalen hoe uw prompt eruitziet wanneer u een shell-sessie start.
PS2 – Declareert secundaire prompts voor wanneer een opdracht over meerdere regels is verdeeld.

Setting Environmental and Shell Commands

Eerst zullen we, zoals eerder uitgelegd, de variabelenamen volledig in hoofdletters houden. Vervolgens doorlopen we het maken van shell-variabelen. Ten slotte zullen we omgevingsvariabelen maken.

Creating Shell Variables

Laten we beginnen met de gebruikelijke hello world. Voer het volgende in uw terminal in:

De aanhalingstekens worden gebruikt omdat de variabele een spatie bevat. Merk op dat we een enkel aanhalingsteken hebben gebruikt omdat het uitroepteken een speciaal teken is en moet worden geëscaped of tussen enkele aanhalingstekens moet worden geplaatst. Nu hebt u uw eerste shell-variabele gemaakt. Deze is alleen beschikbaar in de huidige shell-sessie. Shell-variabelen zijn niet beschikbaar voor onderliggende shells en processen. U kunt deze naar de terminal afdrukken door de opdracht set met grep te gebruiken:

print variable

Of geef de waarde weer met echo, waarbij u ernaar verwijst met het $-teken en de variabelenaam:

echo variable

Als u probeert af te drukken met printenv, wordt er geen uitvoer weergegeven. Dit helpt u te adviseren dat dit geen omgevingsvariabele is:

printenv variable

Creating Environmental Variables

De eerder gemaakte shell-variabele kan worden omgezet in een omgevingsvariabele met behulp van de export-opdracht. Eerst maakt u een shell-variabele. Om vervolgens een omgevingsvariabele te maken, moet u de export-opdracht gebruiken. Na het uitvoeren van deze opdracht is de variabele beschikbaar voor onderliggende shells en processen:

Als u nu test met de printenv-opdracht, zou u de variabele en waarde moeten zien:

printenv variable value

U kunt ook in één stap een omgevingsvariabele maken met de syntaxis:

Omgevingsvariabelen worden alleen doorgegeven aan de subshells en niet aan de oudershell. Dit helpt voorkomen dat subprocessen de omgeving beïnvloeden van het programma dat ze heeft aangeroepen.

Variabelen degraderen en wissen

Als u de handleiding tot nu toe hebt gevolgd, is MY_FIRST_VAR nog steeds gedefinieerd als een omgevingsvariabele. U kunt deze weer veranderen in een shell-opdracht door de echo-opdracht met de –n-vlag te typen:

Als u test met printenv, is er geen uitvoer. De echo-opdracht zal deze echter wel weergeven omdat het nog steeds een shell-opdracht is:

echo vs prinenv command

U kunt zowel een shell- als een omgevingsvariabele wissen met de opdracht unset. En u kunt bevestigen dat deze niet meer bestaat door echo te gebruiken. Zoals u kunt zien, toont dit geen uitvoer:

unset variable Environmental and Shell Variables

Omgevingsvariabelen instellen bij het inloggen

Veel programma's zijn voor hun uitvoering afhankelijk van omgevingsvariabelen. Omdat het niet efficiënt is om de variabelen telkens in te stellen wanneer u een programma wilt uitvoeren, biedt Linux een manier om ze te definiëren en in een bestand op te slaan. Op deze manier kunnen ze automatisch worden ingesteld bij het inloggen. De shell leest verschillende configuratiebestanden, afhankelijk van hoe de sessie is gestart. Deze worden hieronder besproken:

Typen shell-sessies en hun verschillen

  • Login shell-sessie – begint met het verifiëren van de gebruiker. De sessie wordt ingesteld wanneer u zich aanmeldt via SSH of een terminal-sessie.
  • Non-login shell-sessie – begint wanneer u een nieuwe shell start vanuit uw geverifieerde shell. U kunt een nieuwe shell starten met de opdracht bash. Er zijn geen verificatiegegevens vereist.
  • Interactieve shell-sessie – een shell-sessie die is gekoppeld aan een terminal-sessie.
  • Niet-interactieve shell-sessie – een shell-sessie die niet is gekoppeld aan een terminal-sessie – draait op de achtergrond.

Een sessie wordt geclassificeerd als login of non-login, en als interactief of niet-interactief. Wanneer u inlogt en een shell-sessie start via SSH, is dat een login- en interactieve shell-sessie. Wanneer u een script uitvoert in de terminal, draait dit meestal in een non-login, niet-interactieve sessie. Een shell-sessie kan ook een combinatie van beide zijn. Dus, welk configuratiebestand wordt er gekozen?

Een login-sessie leest eerst configuratiebestanden uit de map /etc/profile. Ten tweede controleert deze de gebruikersspecifieke configuratiebestanden uit de thuismap van de gebruiker. Alleen het eerste gevonden bestand van ~/.bash_profile, ~/.bash_login en ~/.profile wordt gelezen en alle andere bestanden worden genegeerd. Een non-login-sessie leest eerst uit /etc/bash.bashrc, gevolgd door ~/.bashrc. Niet-interactieve sessies lezen de omgevingsvariabele genaamd BASH_ENV om de naam te krijgen van het bestand dat moet worden gebruikt om de nieuwe omgeving te definiëren.

Omgevingsvariabelen implementeren

Wanneer u uw variabelen instelt, let er dan op in welk bestand u ze plaatst op basis van onze discussie hierboven. Dit biedt flexibiliteit door ervoor te zorgen dat bepaalde variabelen alleen in bepaalde sessies beschikbaar zijn. U wilt niet dat een cruciale variabele in een sessie ontbreekt.

In sommige gevallen willen we dat de variabele bestaat in login- en non-login-sessies. Gelukkig hebben de meeste Linux-distributies standaard de login-configuraties zo geconfigureerd dat ze de non-login-configuraties lezen en deze beschikbaar maken voor uw processen. Daarom kunt u uw variabelen eenvoudig definiëren in de non-login-configuratiebestanden. Meestal stellen we gebruikersspecifieke omgevingsvariabelen in en willen we dat onze instellingen beschikbaar zijn in zowel login- als non-login-shell-sessies. Om deze reden gebruiken we het bestand ~/.bashrc. We gebruiken nano om het bestand te bewerken. Voer het volgende in uw terminal in om het bestand te openen:

In het geopende configuratiebestand zie je al verschillende variabelen. Je kunt omgevingsvariabelen op dezelfde manier toevoegen als wanneer je de opdrachtregel gebruikt. Typ gewoon de opdracht:

Je kunt ze overal in het bestand toevoegen - op een nieuwe regel, en niet binnen een loop-functie. Sla het bestand vervolgens op en sluit het. Elke volgende shell-sessie die je start, leest uit het bestand. Als je wilt dat de huidige shell de instellingen leest die je zojuist hebt toegevoegd zonder deze opnieuw te hoeven opstarten, kun je de opdracht gebruiken:

Je moet systeembrede omgevingsvariabelen toevoegen in een van de volgende bestanden: /etc/profile, /etc/bash.bashrc of /etc/environment.

Samengevat

Tot slot kun je nu shell- en omgevingsvariabelen instellen en genieten van de geweldige kracht die deze tools naar je VPS brengen! Het heeft veel voordelen, zoals het automatiseren van het uitvoeren van bepaalde processen, of automatische implementatieconfiguratie die authenticatie-informatie vereist, het doorgeven van variabelen aan subprocessen en meer. Omgevingsvariabelen helpen je om gevoelige gegevens, zoals authenticatie-informatie, te verbergen voor openbare repositories, naast andere gegevens. Met deze basis kun je complexe scripts maken die je automatisch kunt uitvoeren via de opdrachtregel zonder dat er constante gebruikersinvoer vereist is.

Veel plezier met computeren!

author

Akshay Nagpal

Auteur · CloudSigma

Preslav Dobrev is een creatief ontwerper bij CloudSigma, met de nadruk op een consistente bedrijfsidentiteit door middel van traditionele en innovatieve marketingkanalen. Hij is bedreven in het samenvoegen van artistieke visie met strategische marketing om impactvolle merkverhalen te creëren.

Reacties

Nog geen reacties. Wees de eerste.