Bash exekutatzen xehetasunez

Orrialde hau bilaketa batean aurkitu baduzu, ziurrenik bash exekutatzen ari zaren arazoren bat konpontzen saiatzen ari zara.

Agian zure bash ingurunea ez da ingurune-aldagai bat ezartzen ari eta ez duzu ulertzen zergatik. Baliteke bash abioko hainbat fitxategi edo profiletan edo fitxategi guztietan ausaz itsatsi izana funtzionatu arte.

Nolanahi ere, ohar honen helburua bash abiarazteko prozedura ahalik eta errazen ezartzea da, arazoei aurre egin ahal izateko.

Π”ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ°

Fluxu-diagrama honek bash exekutatzen ari direnean prozesu guztiak laburbiltzen ditu.

Bash exekutatzen xehetasunez

Orain ikus ditzagun zati bakoitza hurbilagotik.

Shell saioa hasi nahi duzu?

Lehenik eta behin, saioa hasteko shell-ean zauden ala ez aukeratu behar duzu.

Saioa hasteko shell-a saio interaktibo batean saioa hasten duzunean sartzen duzun lehen shell-a da. Saioa hasteko shell-ak ez du erabiltzaile-izenik eta pasahitzik behar. Saioa hasteko shell-a abiaraztera behartu dezakezu bandera bat gehituz --login deituta bash, adibidez:

bash --saioa

Saioa hasteko shell-ak oinarrizko ingurunea konfiguratzen du bash shell-a lehen aldiz abiarazten duzunean.

Interaktiboa?

Ondoren, shell interaktiboa den ala ez zehazten duzu.

Hau aldagaiaren presentziaren arabera egiaztatu daiteke PS1 (komandoa sartzeko funtzioa instalatzen du):

if [ "${PS1-}" ]; orduan echo interactive else echo ez-interaktiboa fi

Edo ikusi aukera ezarrita dagoen -i, marratxoaren aldagai berezi bat erabiliz - bash-en, adibidez:

$oihartzuna$-

Irteeran ikur bat badago i, orduan shell interaktiboa da.

Saioa hasteko shell-ean?

Saioa hasteko shell batean bazaude, bash-ek fitxategia bilatzen du /etc/profile eta exekutatzen da existitzen bada.

Ondoren, hiru fitxategi hauetako edozein bilatu ordena honetan:

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

Bat aurkitzen duenean, abiarazten du eta besteak saltatzen ditu.

Shell interaktibo batean?

Saio-hasierako shell batean bazaude, dagoeneko saioa hasteko shell batean egon zarela suposatzen da, ingurunea konfiguratuta dago eta heredatuko da.

Kasu honetan, honako bi fitxategi hauek ordenan exekutatzen dira, baldin badaude:

/etc/bash.bashrc ~/.bashrc

Aukerarik ez?

Ez bazaude saio hasierako shell batean edo shell interaktibo batean, orduan zure ingurunea hutsik egongo da. Horrek nahasmen handia eragiten du (ikus behean cron lanei buruz).

Kasu honetan bash-ek aldagaiari begiratzen dio BASH_ENV zure ingurunea eta bertan zehaztutako dagokion fitxategia sortzen du.

Ohiko zailtasunak eta arauak

cron lanak

Bash abiaraztearen % 95ean arazketa egiten dudan cron lana espero bezala exekutatzen ez delako gertatzen da.

Zeregin madarikatu hau ondo funtzionatzen du komando-lerroan exekutatzen dudanean, baina huts egiten du crontab-en exekutatzen dudanean.

Hemen bi arrazoi:

  • Cron lanak ez dira interaktiboak.
  • Komando-lerroko scriptek ez bezala, cron lanek ez dute shell ingurunea heredatzen.

Normalean ez zaizu ohartuko edo axola shell script bat ez dela interaktiboa inguruneak shell interaktibotik heredatzen duelako. Horrek esan nahi du dena dela PATH ΠΈ alias espero zenukeen moduan konfiguratuta.

Horregatik askotan beharrezkoa da zehatz bat ezartzea PATH hemen bezalako cron zeregin baterako:

* * * * * PATH=${PATH}:/path/to/nire/programa/karpeta nireprograma

Elkarri deitzen dioten gidoiak

Ohiko beste arazo bat da script-ak gaizki konfiguratuta elkarri deitzeko. Adibidez, /etc/profile errekurtsoak ~/.bashrc.

Hau gertatu ohi da norbait akatsen bat konpontzen saiatzen denean eta dena funtzionatzen zuela zirudien. Zoritxarrez, saio mota hauek bereizi behar dituzunean, arazo berriak sortzen dira.

Sandboxed Docker irudia

Shell bat exekutatzen esperimentatzeko, Docker irudi bat sortu nuen, ingurune seguru batean shell bat exekutatzen arazteko erabil daitekeena.

Abiarazi:

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

Dockerfile dago Hemen.

Saioa behartzeko eta saioa hasteko shell bat simulatzeko:

$ bash --login

Aldagai multzo bat probatzeko BASH_ENV:

$ env | grep BASH_ENV

Arazketarako crontab minuturo script soil bat exekutatuko da (in /root/ascript):

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

Iturria: www.habr.com

Gehitu iruzkin berria