Podrobno izvajanje Bash-a

Če ste med iskanjem našli to stran, verjetno poskušate rešiti kakšno težavo z izvajanjem bash.

Morda vaše okolje bash ne nastavlja spremenljivke okolja in ne razumete, zakaj. Morda ste nekaj vtaknili v različne zagonske datoteke ali profile bash ali vse naključne datoteke, dokler ni delovalo.

V vsakem primeru je bistvo te opombe čim bolj preprosta predstavitev postopka za zagon bash, da se boste lahko spopadli s težavami.

Diagram

Ta diagram poteka povzema vse procese pri izvajanju bash.

Podrobno izvajanje Bash-a

Zdaj pa si podrobneje oglejmo vsak del.

Prijava Shell?

Najprej morate izbrati, ali ste v prijavni lupini ali ne.

Prijavna lupina je prva lupina, ki jo vnesete, ko se prijavite v interaktivno sejo. Lupina za prijavo ne zahteva uporabniškega imena in gesla. Lupino za prijavo lahko prisilite, da se zažene z dodajanjem zastavice --login ob klicu bash, na primer:

bash --prijava

Prijavna lupina nastavi osnovno okolje, ko prvič zaženete lupino bash.

Interaktiven?

Nato določite, ali je lupina interaktivna ali ne.

To je mogoče preveriti s prisotnostjo spremenljivke PS1 (namesti funkcijo vnosa ukazov):

if [ "${PS1-}" ]; nato echo interaktivni else echo neinteraktivni fi

Ali pa preverite, ali je možnost nastavljena -i, z uporabo posebne spremenljivke vezaj - v bashu, na primer:

$echo$-

Če je v izhodu simbol i, potem je lupina interaktivna.

V prijavni lupini?

Če ste v lupini za prijavo, bash poišče datoteko /etc/profile in teče, če obstaja.

Nato poišče katero koli od teh treh datotek v naslednjem vrstnem redu:

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

Ko enega najde, ga zažene, druge pa preskoči.

V interaktivni lupini?

Če ste v lupini brez prijave, se predpostavlja, da ste že bili v lupini za prijavo, okolje je konfigurirano in bo podedovano.

V tem primeru se po vrstnem redu izvedeta naslednji dve datoteki, če obstajata:

/etc/bash.bashrc ~/.bashrc

Ni možnosti?

Če niste niti v lupini za prijavo niti v interaktivni lupini, bo vaše okolje dejansko prazno. To povzroča veliko zmede (glejte spodaj o opravilih cron).

V tem primeru bash pogleda spremenljivko BASH_ENV vaše okolje in ustvari tam navedeno ustrezno datoteko.

Pogoste težave in preprosta pravila

cron opravila

95 % časa odpravljam napake pri zagonu bash, ker opravilo cron ne teče po pričakovanjih.

Ta prekleta naloga deluje dobro, ko ga zaženem v ukazni vrstici, vendar ne uspe, ko ga zaženem v crontabu.

Tukaj dva razloga:

  • Opravila Cron niso interaktivna.
  • Za razliko od skriptov ukazne vrstice opravila cron ne podedujejo lupinskega okolja.

Običajno ne boste opazili ali skrbeli za to, da lupinski skript ni interaktiven, ker okolje podeduje interaktivno lupino. To pomeni, da vse PATH и alias konfiguriran, kot bi pričakovali.

Zato je pogosto treba določiti posebno PATH za opravilo cron, kot je tukaj:

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

Skripte, ki se kličejo

Druga pogosta težava je, ko so skripti pomotoma konfigurirani za medsebojno klicanje. na primer /etc/profile poziva k ~/.bashrc.

To se običajno zgodi, ko je nekdo poskušal popraviti kakšno napako in se je zdelo, da vse deluje. Na žalost, ko morate ločiti te različne vrste sej, se pojavijo nove težave.

Dockerjeva slika v peskovniku

Za eksperimentiranje z izvajanjem lupine sem ustvaril sliko Docker, ki jo je mogoče uporabiti za odpravljanje napak pri izvajanju lupine v varnem okolju.

Kosilo:

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

Dockerfile se nahaja tukaj.

Za prisilno prijavo in simulacijo lupine za prijavo:

$ bash --login

Za testiranje nabora spremenljivk BASH_ENV:

$ env | grep BASH_ENV

Za odpravljanje napak crontab preprost skript bo izveden vsako minuto (v /root/ascript):

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

Vir: www.habr.com

Dodaj komentar