Lafen Bash am Detail

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.

Lafen Bash am Detail

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 hei.

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

Setzt e Commentaire