Bash in detail uitvoeren

Als je deze pagina tijdens een zoekopdracht hebt gevonden, probeer je waarschijnlijk een probleem met het uitvoeren van bash op te lossen.

Misschien stelt je bash-omgeving geen omgevingsvariabele in en begrijp je niet waarom. Het kan zijn dat je iets in verschillende bash-opstartbestanden of -profielen of in alle bestanden willekeurig hebt geplakt totdat het werkte.

In ieder geval is het doel van deze notitie om de procedure voor het starten van bash zo eenvoudig mogelijk uit te leggen, zodat je met problemen om kunt gaan.

Диаграмма

Dit stroomdiagram vat alle processen samen bij het uitvoeren van bash.

Bash in detail uitvoeren

Laten we nu elk onderdeel eens nader bekijken.

Inloggen Shell?

Eerst moet u kiezen of u zich in de login-shell bevindt of niet.

De login-shell is de eerste shell die u invoert wanneer u inlogt voor een interactieve sessie. Voor de login-shell zijn geen gebruikersnaam en wachtwoord vereist. U kunt de login-shell forceren om te starten door een vlag toe te voegen --login wanneer gebeld bash, bijvoorbeeld:

bash --inloggen

De login-shell stelt de basisomgeving in wanneer u de bash-shell voor het eerst start.

Interactief?

Vervolgens bepaal je of de shell interactief is of niet.

Dit kan worden gecontroleerd door de aanwezigheid van de variabele PS1 (het installeert de opdrachtinvoerfunctie):

if [ "${PS1-}" ]; dan echo interactief anders echo niet-interactief fi

Of kijk of de optie is ingesteld -i, met behulp van een speciale koppeltekenvariabele - in bash, bijvoorbeeld:

$echo$-

Als er een symbool in de uitvoer staat i, dan is de shell interactief.

In de login-shell?

Als je in een login-shell zit, zoekt bash naar het bestand /etc/profile en wordt uitgevoerd als deze bestaat.

Zoek vervolgens naar een van deze drie bestanden in de volgende volgorde:

~/.bash_profile ~/.bash_login ~/.profile

Wanneer het er een vindt, start het het en slaat het de andere over.

In een interactieve schil?

Als u zich in een niet-inlogshell bevindt, wordt aangenomen dat u zich al in een login-shell bevindt; de omgeving is geconfigureerd en wordt overgenomen.

In dit geval worden de volgende twee bestanden in volgorde uitgevoerd, als ze bestaan:

/etc/bash.bashrc ~/.bashrc

Geen optie?

Als u zich niet in een login-shell of een interactieve shell bevindt, zal uw omgeving inderdaad leeg zijn. Dit zorgt voor veel verwarring (zie hieronder over cronjobs).

In dit geval kijkt bash naar de variabele BASH_ENV uw omgeving en maakt het bijbehorende bestand aan dat daar is opgegeven.

Veelvoorkomende problemen en vuistregels

cron-banen

95% van de tijd debug ik het opstarten van bash, omdat de cronjob niet werkt zoals verwacht.

Deze verdomde taak werkt prima als ik het op de opdrachtregel uitvoer, maar mislukt als ik het in crontab uitvoer.

Hier twee redenen:

  • Cronjobs zijn niet interactief.
  • In tegenstelling tot opdrachtregelscripts nemen cron-taken de shell-omgeving niet over.

Normaal gesproken merkt u niet dat een shellscript niet interactief is, omdat de omgeving overerft van de interactieve shell. Dit betekent dat alles PATH и alias geconfigureerd zoals je zou verwachten.

Daarom is het vaak nodig om iets specifieks in te stellen PATH voor een cron-taak zoals hier:

* * * * * PATH=${PATH}:/pad/naar/mijn/programma/map mijnprogramma

Scripts die elkaar bellen

Een ander veelvoorkomend probleem is wanneer scripts per ongeluk zijn geconfigureerd om elkaar aan te roepen. Bijvoorbeeld, /etc/profile doet een beroep op ~/.bashrc.

Dit gebeurt meestal wanneer iemand een fout probeert op te lossen en alles lijkt te werken. Wanneer je deze verschillende soorten sessies moet scheiden, ontstaan ​​er helaas nieuwe problemen.

Sandbox Docker-image

Om te experimenteren met het uitvoeren van een shell, heb ik een Docker-image gemaakt die kan worden gebruikt voor het debuggen van het uitvoeren van een shell in een beveiligde omgeving.

Launch:

$ docker run -n bs -d imiell/bash_startup
$ docker exec -ti bs bash

Dockerbestand bevindt zich hier.

Om inloggen te forceren en een login-shell te simuleren:

$ bash --login

Om een ​​reeks variabelen te testen BASH_ENV:

$ env | grep BASH_ENV

Voor foutopsporing crontab elke minuut wordt een eenvoudig script uitgevoerd (in /root/ascript):

$ crontab -l
$ cat /var/log/script.log

Bron: www.habr.com

Voeg een reactie