Running Bash v detailoch

Ak ste našli túto stránku vo vyhľadávaní, pravdepodobne sa pokúšate vyriešiť nejaký problém so spustením bash.

Možno vaše bash prostredie nenastavuje premennú prostredia a vy nerozumiete prečo. Možno ste uviazli niečo v rôznych zavádzacích súboroch alebo profiloch bash alebo vo všetkých súboroch náhodne, kým to nefungovalo.

V každom prípade je cieľom tejto poznámky čo najjednoduchšie rozvrhnúť postup spustenia bashu, aby ste sa mohli vysporiadať s problémami.

Schéma

Tento vývojový diagram sumarizuje všetky procesy pri spustení bash.

Running Bash v detailoch

Teraz sa pozrime bližšie na každú časť.

Login Shell?

Najprv si musíte vybrať, či ste v prihlasovacom prostredí alebo nie.

Prihlasovací shell je prvý shell, ktorý zadáte, keď sa prihlásite do interaktívnej relácie. Prihlasovací shell nevyžaduje používateľské meno a heslo. Môžete vynútiť spustenie prihlasovacieho shellu pridaním príznaku --login pri zavolaní bash, napríklad:

bash --prihlásenie

Prihlasovací shell nastaví základné prostredie pri prvom spustení bash shell.

Interaktívne?

Potom určíte, či je shell interaktívny alebo nie.

Dá sa to skontrolovať prítomnosťou premennej PS1 (nainštaluje funkciu zadávania príkazov):

if [ "${PS1-}" ]; potom echo interaktívne else echo neinteraktívne fi

Alebo skontrolujte, či je táto možnosť nastavená -ipomocou špeciálnej premennej pomlčky - v bash, napríklad:

$echo$-

Ak je vo výstupe symbol i, potom je shell interaktívny.

V prihlasovacom shelle?

Ak ste v prihlasovacom prostredí, bash hľadá súbor /etc/profile a beží, ak existuje.

Potom vyhľadá ktorýkoľvek z týchto troch súborov v nasledujúcom poradí:

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

Keď jeden nájde, spustí ho a ostatné preskočí.

V interaktívnom prostredí?

Ak sa nachádzate v neprihlasovacom prostredí, predpokladá sa, že ste už v prihlasovacom prostredí boli, prostredie je nakonfigurované a bude zdedené.

V tomto prípade sa spustia nasledujúce dva súbory v poradí, ak existujú:

/etc/bash.bashrc ~/.bashrc

Žiadna možnosť?

Ak sa nenachádzate v prihlasovacom ani interaktívnom prostredí, vaše prostredie bude skutočne prázdne. To spôsobuje veľa zmätku (pozri nižšie o úlohách cron).

V tomto prípade sa bash pozerá na premennú BASH_ENV prostredie a vytvorí zodpovedajúci súbor, ktorý je tam špecifikovaný.

Bežné ťažkosti a pravidlá palca

cron pracovné miesta

V 95% prípadov, keď ladím spustenie bash, je to preto, že úloha cron nebeží podľa očakávania.

Táto prekliata úloha funguje dobre, keď ho spustím na príkazovom riadku, ale zlyhá, keď ho spustím v crontab.

Tu dva dôvody:

  • Cron úlohy nie sú interaktívne.
  • Na rozdiel od skriptov príkazového riadka úlohy cron nededia prostredie shellu.

Zvyčajne si nevšimnete alebo vás nezaujíma, že skript shellu nie je interaktívny, pretože prostredie dedí z interaktívneho shellu. To znamená, že všetko PATH и alias nakonfigurovaný tak, ako by ste očakávali.

Preto je často potrebné nastaviť konkrétnu PATH pre úlohu cron, ako je tu:

* * * * * PATH=${PATH}:/cesta/k/môjmu/programu/priečinku môjprogram

Skripty sa navzájom volajú

Ďalším bežným problémom je, keď sú skripty omylom nakonfigurované tak, aby sa navzájom volali. Napríklad, /etc/profile žiada o ~/.bashrc.

Zvyčajne sa to stane, keď sa niekto pokúsil opraviť nejakú chybu a zdalo sa, že všetko funguje. Bohužiaľ, keď potrebujete oddeliť tieto rôzne typy relácií, vyvstanú nové problémy.

Obrázok Docker v karanténe

Aby som experimentoval so spustením shellu, vytvoril som obraz Docker, ktorý možno použiť na ladenie spustenia shellu v zabezpečenom prostredí.

Spustenie:

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

Dockerfile sa nachádza tu.

Ak chcete vynútiť prihlásenie a simulovať prihlasovacie prostredie:

$ bash --login

Na testovanie množiny premenných BASH_ENV:

$ env | grep BASH_ENV

Na ladenie crontab každú minútu sa spustí jednoduchý skript (v /root/ascript):

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

Zdroj: hab.com

Pridať komentár