Kör Bash i detalj

Om du hittade den här sidan i en sökning försöker du förmodligen lösa något problem med att köra bash.

Din bash-miljö kanske inte ställer in en miljövariabel och du förstår inte varför. Du kan ha fastnat något i olika bash boot-filer eller profiler eller alla filer på måfå tills det fungerade.

I vilket fall som helst är poängen med denna anteckning att lägga ut proceduren för att starta bash så enkelt som möjligt så att du kan hantera problem.

Диаграмма

Detta flödesschema sammanfattar alla processer när du kör bash.

Kör Bash i detalj

Låt oss nu titta närmare på varje del.

Logga in Shell?

Först måste du välja om du är i inloggningsskalet eller inte.

Inloggningsskalet är det första skalet du anger när du loggar in för en interaktiv session. Inloggningsskalet kräver inget användarnamn och lösenord. Du kan tvinga inloggningsskalet att starta genom att lägga till en flagga --login när man ringer bash, till exempel:

bash --logga in

Inloggningsskalet ställer in basmiljön när du först startar bash-skalet.

Interaktiv?

Sedan avgör du om skalet är interaktivt eller inte.

Detta kan kontrolleras genom närvaron av variabeln PS1 (den installerar kommandoinmatningsfunktionen):

if [ "${PS1-}" ]; sedan echo interactive annars eko icke-interaktiv fi

Eller se om alternativet är inställt -i, med hjälp av en speciell bindestrecksvariabel - i bash, till exempel:

$echo$-

Om det finns en symbol i utgången i, då är skalet interaktivt.

I inloggningsskalet?

Om du är i ett inloggningsskal letar bash efter filen /etc/profile och körs om det finns.

Söker sedan efter någon av dessa tre filer i följande ordning:

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

När den hittar en startar den den och hoppar över de andra.

I ett interaktivt skal?

Om du är i ett icke-inloggningsskal, antas det att du redan har varit i ett inloggningsskal, miljön är konfigurerad och kommer att ärvas.

I det här fallet körs följande två filer i ordning, om de finns:

/etc/bash.bashrc ~/.bashrc

Inget alternativ?

Om du inte är i antingen ett inloggningsskal eller ett interaktivt skal, kommer din miljö verkligen att vara tom. Detta orsakar mycket förvirring (se nedan om cron-jobb).

I det här fallet tittar bash på variabeln BASH_ENV din miljö och skapar motsvarande fil som anges där.

Vanliga svårigheter och tumregler

cron jobb

95% av tiden jag felsöker bash-start beror det på att cron-jobbet inte körs som förväntat.

Denna jäkla uppgift fungerar bra när jag kör det på kommandoraden, men misslyckas när jag kör det i crontab.

Här två skäl:

  • Cron-jobb är inte interaktiva.
  • Till skillnad från kommandoradsskript, ärver inte cron-jobb skalmiljön.

Vanligtvis kommer du inte att märka eller bry dig om att ett skalskript inte är interaktivt eftersom miljön ärver från det interaktiva skalet. Det betyder att allt PATH и alias konfigurerad som du kan förvänta dig.

Det är därför det ofta är nödvändigt att ställa in en specifik PATH för en cron-uppgift som här:

* * * * * PATH=${PATH}:/path/to/my/program/folder myprogram

Manus som ringer varandra

Ett annat vanligt problem är när skript av misstag konfigureras för att anropa varandra. Till exempel, /etc/profile tilltalar ~/.bashrc.

Detta händer vanligtvis när någon försökte fixa något fel och allt verkade fungera. Tyvärr, när du behöver separera dessa olika typer av sessioner, uppstår nya problem.

Sandboxed Docker-bild

För att experimentera med att köra ett skal skapade jag en Docker-avbildning som kan användas för att felsöka att köra ett skal i en säker miljö.

Lansera:

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

Dockerfile finns här.

Så här tvingar du inloggning och simulerar ett inloggningsskal:

$ bash --login

För att testa en uppsättning variabler BASH_ENV:

$ env | grep BASH_ENV

För felsökning crontab ett enkelt skript kommer att köras varje minut (i /root/ascript):

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

Källa: will.com

Lägg en kommentar