Starta Bash i detalj

Om du har hittat denna sida via sökningen, försöker du antagligen lösa ett problem med att starta bash.

Kanske sÀtts inte miljövariabeln i din bash-miljö och du förstÄr inte varför. Kanske har du tryckt in nÄgot i olika bash-startfiler eller profiler, eller i alla filer slumpmÀssigt, tills det fungerade.

Oavsett vilket Àr syftet med denna anteckning att sÄ enkelt som möjligt beskriva proceduren för att starta bash, sÄ att du kan hantera problemen.

Diagram

Detta flödesschema sammanfattar alla processer vid start av bash.

Starta Bash i detalj

LÄt oss nu titta nÀrmare pÄ varje del.

Inloggningsshell?

Först mÄste du avgöra om du befinner dig i en inloggningsshell eller inte.

En inloggningsshell Àr den första shell du hamnar i nÀr du loggar in pÄ systemet för en interaktiv session. Inloggningsshellen krÀver inget anvÀndarnamn eller lösenord. Du kan tvinga att starta inloggningsshellen genom att lÀgga till flaggan --login vid anropet bash, till exempel:

bash --login

Inloggningsshellen stÀller in den grundlÀggande miljön vid den första starten av bash-shellet.

Interaktiv?

DÀrefter bestÀmmer du om shellen Àr interaktiv eller inte.

Detta kan kontrolleras genom att titta pÄ om variabeln PS1 (den stÀller in kommandoinmatningsfunktionaliteten):

if [ "${PS1-}" ]; then
  echo interactive
else
  echo non-interactive
fi

Eller genom att se om parametern -i, med speciell variabel med ett bindestreck - i bash, till exempel:

$ echo $-

Om det finns en symbol i, Àr shellen interaktiv.

I inloggningsshell?

Om du befinner dig i en inloggningsshell, letar bash efter filen /etc/profile och kör den om den finns.

Sedan söker den efter nÄgon av dessa tre filer i följande ordning:

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

NÀr den hittar en kör den den och hoppar över de andra.

I interaktiv shell?

Om du Àr i en interaktiv shell utan inloggning (non-login shell) antas det att du redan har varit i en inloggningsshell, miljön har stÀllts in och kommer att Àrvas.

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

/etc/bash.bashrc
~/.bashrc

Ingen av alternativen?

Om du varken Àr i en inloggningsshell eller en interaktiv shell, kommer din miljö verkligen att vara tom. Detta orsakar stor förvirring (se nedan angÄende cron-jobb).

I detta fall tittar bash pÄ variabeln BASH_ENV i din miljö och skapar den angivna filen dÀr.

Typiska svÄrigheter och tumregler

Cron-jobbar

I 95% av fallen Àr felsökning av bash-körningar kopplad till att cron-jobbet inte fungerar som förvÀntat.

Det hÀr hemska jobbet fungerar fint nÀr jag kör det frÄn kommandoraden, men misslyckas nÀr det körs i crontab..

HÀr TvÄ orsaker:

  • Cron-jobb Ă€r inte interaktiva.
  • Till skillnad frĂ„n skript som körs i kommandoraden Ă€r cron-jobb intevervingar miljön frĂ„n skalet.

Ofta mÀrker eller bryr du dig inte om att skriptet inte Àr interaktivt, eftersom miljön Àrvs frÄn det interaktiva skalet. Det betyder att allt PATH och alias Àr instÀllt som du förvÀntar dig.

Det Àr dÀrför man ofta behöver stÀlla in en specifik PATH för cron-jobbet, som hÀr:

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

Skript som kallar pÄ varandra

En annan vanlig problematik Àr nÀr skript felaktigt konfigureras för att anropa varandra. Till exempel, /etc/profile ansluter till ~/.bashrc.

Detta hÀnder ofta nÀr nÄgon försökt fixa ett fel och det verkar ha fungerat. TyvÀrr, nÀr man behöver separera dessa olika typer av sessioner, uppstÄr nya problem.

Docker-image i sandlÄdan

För att experimentera med att köra skalet, har jag skapat en Docker-image som kan anvÀndas för att felsöka körning av skalet i en sÀker miljö.

Starta:

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

Dockerfile finns hÀr.

För att tvinga inloggning och simulera inloggningsskal:

$ bash --login

För att kontrollera uppsÀttningen av variabler BASH_ENV:

$ env | grep BASH_ENV

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

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

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster