Wann Dir dës Säit an enger Sich fonnt hutt, probéiert Dir wahrscheinlech e Problem mam Bash ze léisen.
Vläicht setzt Äert Bash Ëmfeld keng Ëmfeldvariabel an Dir verstitt net firwat. Dir hutt vläicht eppes a verschiddene Bash Bootdateien oder Profiler oder all Dateien zoufälleg festgehalen bis et geschafft huet.
Op alle Fall ass de Punkt vun dëser Notiz d'Prozedur fir de Bash ze starten sou einfach wéi méiglech ze leeën fir datt Dir mat Probleemer këmmert.
Diagramm
Dëse Flowchart resüméiert all Prozesser wann Dir Bash leeft.
Loosst eis elo all Deel méi genau kucken.
Login Shell?
Als éischt musst Dir wielen ob Dir an der Login Shell sidd oder net.
D'Login Shell ass déi éischt Shell déi Dir gitt wann Dir Iech fir eng interaktiv Sessioun aloggen. D'Login Shell erfuerdert kee Benotzernumm a Passwuert. Dir kënnt d'Login Shell forcéieren fir unzefänken andeems Dir e Fändel bäidréit --login
wann genannt bash
, zum Beispill:
bash --login
D'Login Shell setzt d'Basisëmfeld op wann Dir d'Bash Shell fir d'éischt ufänkt.
Interaktiv?
Da bestëmmt Dir ob d'Schuel interaktiv ass oder net.
Dëst kann duerch d'Präsenz vun der Variabel gepréift ginn PS1
(et installéiert d'Kommando-Input Funktioun):
wann ["${PS1-}"]; dann Echo interaktiv soss Echo Net-interaktiven fi
Oder kuckt ob d'Optioun agestallt ass -i
, mat enger spezieller Bindestrich Variabel -
am Bash, zum Beispill:
$echo$-
Wann et e Symbol an der Ausgab ass i
, dann ass d'Schuel interaktiv.
An der Login Shell?
Wann Dir an enger Login Shell sidd, da sicht Bash no der Datei /etc/profile
a leeft wann et existéiert.
Da sicht no enger vun dësen dräi Dateien an der folgender Uerdnung:
~/.bash_profile ~/.bash_login ~/.profile
Wann et een fënnt, fänkt et un a spréngt déi aner.
An enger interaktiver Schuel?
Wann Dir an engem Net-Login-Shell sidd, gëtt ugeholl datt Dir schonn an enger Login-Shell war, d'Ëmfeld ass konfiguréiert a gëtt ierflecher.
An dësem Fall ginn déi folgend zwee Dateien an Uerdnung ausgefouert, wa se existéieren:
/etc/bash.bashrc ~/.bashrc
Keng Optioun?
Wann Dir weder an enger Login Shell oder an enger interaktiver Shell sidd, da wäert Äert Ëmfeld wierklech eidel sinn. Dëst verursaacht vill Duercherneen (kuckt hei ënnen iwwer Cron Jobs).
An dësem Fall kuckt de Bash op d'Variabel BASH_ENV
Är Ëmwelt a kreéiert déi entspriechend Datei déi do spezifizéiert ass.
Gemeinsam Schwieregkeeten a Regele vum Daumen
cron Aarbechtsplazen
95% vun der Zäit debuggen ech Bash Startup et ass well d'Cron Job net leeft wéi erwaart.
Dës verdammt Aufgab funktionnéiert gutt wann ech et op der Kommandozeil lafen, awer klappt wann ech et an crontab lafen.
et ass zwee Grënn:
- Cron Aarbechtsplaze sinn net interaktiv.
- Am Géigesaz zu Kommandozeil Scripten, ierwen Cron Jobs net d'Shell Ëmfeld.
Typesch wäert Dir net bemierken oder egal datt e Shellskript net interaktiv ass well d'Ëmfeld vun der interaktiver Shell ierft. Dat heescht, datt alles PATH
и alias
konfiguréiert wéi Dir Iech erwaart.
Dofir ass et dacks néideg eng spezifesch ze setzen PATH
fir eng Cron Task wéi hei:
* * * * * PATH=${PATH}:/path/to/my/program/folder myprogram
Scripten ruffen all aner
En anere gemeinsame Problem ass wann Skripte falsch konfiguréiert sinn fir sech géigesäiteg ze ruffen. Zum Beispill, /etc/profile
appelléiert un ~/.bashrc
.
Dëst geschitt normalerweis wann een probéiert e Feeler ze fixéieren an alles schéngt ze schaffen. Leider, wann Dir dës verschidden Aarte vu Sessiounen trennen musst, entstinn nei Probleemer.
Sandboxed Docker Bild
Fir ze experimentéieren mat enger Shell ze lafen, hunn ech en Docker-Bild erstallt dat ka benotzt ginn fir eng Shell an engem sécheren Ëmfeld ze debuggen.
Start:
$ docker run -n bs -d imiell/bash_startup
$ docker exec -ti bs bash
Dockerfile läit
Fir Login ze zwéngen an eng Login Shell ze simuléieren:
$ bash --login
Fir eng Rei vu Variabelen ze testen BASH_ENV
:
$ env | grep BASH_ENV
Fir Debugging crontab
en einfache Skript gëtt all Minutt ausgefouert (an /root/ascript
):
$ crontab -l
$ cat /var/log/script.log
Source: will.com