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.

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 myprogramSkript 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 bashDockerfile finns .
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.logKĂ€lla: habr.com
