Kurante Bash detale

Se vi trovis ĉi tiun paĝon en serĉo, vi verŝajne provas solvi iun problemon pri rulado de bash.

Eble via bash-medio ne fiksas mediovariablon kaj vi ne komprenas kial. Vi eble ŝtopis ion en diversaj bash-ŝargdosieroj aŭ profiloj aŭ ĉiuj dosieroj hazarde ĝis ĝi funkciis.

Ĉiukaze, la celo de ĉi tiu noto estas aranĝi la proceduron por komenci bash kiel eble plej simple por ke vi povu trakti problemojn.

Diagramo

Ĉi tiu fludiagramo resumas ĉiujn procezojn dum rulado de bash.

Kurante Bash detale

Nun ni rigardu pli detale ĉiun parton.

Ensalutu Shell?

Unue vi devas elekti ĉu vi estas en la ensaluta ŝelo aŭ ne.

La ensaluta ŝelo estas la unua ŝelo, kiun vi eniras kiam vi ensalutas por interaga sesio. La ensaluta ŝelo ne postulas uzantnomon kaj pasvorton. Vi povas devigi la ensalutan ŝelon komenci aldonante flagon --login kiam vokita bashekzemple:

bash --ensalutu

La ensaluta ŝelo starigas la bazan medion kiam vi unue komencas la bash-ŝelon.

Interaga?

Tiam vi determinas ĉu la ŝelo estas interaga aŭ ne.

Ĉi tio povas esti kontrolita per la ĉeesto de la variablo PS1 (ĝi instalas la komandan enigfunkcion):

if [ "${PS1-}" ]; tiam eĥo interaga else eĥo ne-interaga fi

Aŭ vidu ĉu la opcio estas agordita -i, uzante specialan streketo-variablon - en bash, ekzemple:

$eĥo$-

Se estas simbolo en la eligo i, tiam la ŝelo estas interaga.

En la ensaluta ŝelo?

Se vi estas en ensaluta ŝelo, tiam bash serĉas la dosieron /etc/profile kaj kuras se ĝi ekzistas.

Poste serĉu iun el ĉi tiuj tri dosieroj en la sekva ordo:

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

Kiam ĝi trovas unu, ĝi startas ĝin kaj preterlasas la aliajn.

En interaga ŝelo?

Se vi estas en ne-saluta ŝelo, oni supozas, ke vi jam estis en ensaluta ŝelo, la medio estas agordita kaj estos heredita.

En ĉi tiu kazo, la sekvaj du dosieroj estas ekzekutitaj en ordo, se ili ekzistas:

/etc/bash.bashrc ~/.bashrc

Neniu eblo?

Se vi ne estas en ensaluta ŝelo aŭ interaga ŝelo, tiam via medio ja estos malplena. Ĉi tio kaŭzas multe da konfuzo (vidu sube pri cron-laboroj).

En ĉi tiu kazo bash rigardas la variablon BASH_ENV via medio kaj kreas la respondan dosieron specifitan tie.

Oftaj Malfacilaĵoj kaj Dikraj Reguloj

cron laborpostenoj

95% de la tempo mi elpurigas bash-komencon estas ĉar la cron-laboro ne funkcias kiel atendite.

Ĉi tiu malbenita tasko funkcias bone kiam mi rulas ĝin sur la komandlinio, sed malsukcesas kiam mi rulas ĝin en crontab.

estas du kialoj:

  • Cron-laboroj ne estas interagaj.
  • Male al komandliniaj skriptoj, cron-laboroj ne heredas la ŝelan medion.

Tipe vi ne rimarkos aŭ zorgos, ke ŝelo-skripto ne estas interaga ĉar la medio heredas de la interaga ŝelo. Ĉi tio signifas, ke ĉio PATH и alias agordita kiel vi atendus.

Tial ofte necesas agordi specifan PATH por cron-tasko kiel ĉi tie:

* * * * * PATH=${PATH}:/vojo/al/mia/programo/dosierujo mia programo

Skriptoj vokantaj unu la alian

Alia ofta problemo estas kiam skriptoj estas erare agorditaj por voki unu la alian. Ekzemple, /etc/profile apelacias al ~/.bashrc.

Ĉi tio kutime okazas kiam iu provis ripari iun eraron kaj ĉio ŝajnis funkcii. Bedaŭrinde, kiam vi bezonas apartigi ĉi tiujn malsamajn specojn de sesioj, novaj problemoj aperas.

Sandboxed Docker-bildo

Por eksperimenti pri rulado de ŝelo, mi kreis Docker-bildon, kiu povas esti uzata por sencimigi ruladon de ŝelo en sekura medio.

Lanĉo:

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

Dockerfile situas tie.

Por devigi ensaluton kaj simuli ensalutan ŝelon:

$ bash --login

Por testi aron de variabloj BASH_ENV:

$ env | grep BASH_ENV

Por senararigado crontab simpla skripto estos efektivigita ĉiun minuton (en /root/ascript):

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

fonto: www.habr.com

Aldoni komenton