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.
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 bash
ekzemple:
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
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