Bi berfirehî Bash dimeşîne

Ger we ev rûpel di lêgerînekê de dît, dibe ku hûn hewl didin ku bi xebitandina bash re pirsgirêkek çareser bikin.

Dibe ku hawîrdora weya bash guhêrbarek jîngehê saz nake û hûn çima fam nakin. Dibe ku we tiştek di pelên cûda yên bash boot an profîlan de an jî hemî pelan bi rengek bêserûber de asê kiriye heya ku ew bixebite.

Di her rewşê de, xala vê notê ev e ku hûn prosedurê ji bo destpêkirina bash bi qasî ku pêkan hêsan bikin destnîşan bikin da ku hûn bi pirsgirêkan re mijûl bibin.

Dîyagram

Ev herikîn hemî pêvajoyên dema ku bash dimeşîne kurt dike.

Bi berfirehî Bash dimeşîne

Naha em ji nêz ve li her beşê binêrin.

Têkeve Shell?

Pêşî hûn hewce ne ku hilbijêrin ka hûn di şêlê têketinê de ne an na.

Dema ku hûn ji bo danişînek înteraktîf têkevin, şêlê têketinê yekem şêlê ye ku hûn têkevinê. Têketinê navê bikarhêner û şîfreyê hewce nake. Hûn dikarin şêlê têketinê bi zorê bidin destpêkirin ku bi lêzêdekirina alekê dest pê bike --login dema gazî kirin bash, wek nimûne:

bash - têketin

Dema ku hûn yekem dest bi şêlê bash dikin, şêlê têketinê hawîrdora bingehîn saz dike.

Bihevra?

Dûv re hûn diyar dikin ka şêl înteraktîf e an na.

Ev dikare bi hebûna guhêrbar ve were kontrol kirin PS1 (ew fonksiyona têketina fermanê saz dike):

heke [ "${PS1-}" ]; paşê echo înteraktîf din echo ne-înteraktîf fi

An jî bibînin ka vebijêrk hatiye danîn -i, bi kar guhêrbareke taybet - di bash de, wek nimûne:

$echo$-

Ger di deranê de sembolek hebe i, hingê şêlê înteraktîf e.

Di şêlê têketinê de?

Heke hûn di şêlê têketinê de ne, wê hingê bash li pelê digere /etc/profile û ger hebe diherike.

Dûv re bi rêza jêrîn li yek ji van sê pelan digere:

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

Dema ku yekî dibîne dest pê dike û yên din diavêje.

Di şêlê înteraktîf de?

Ger hûn di şêlekek ne-têketinê de bin, tê texmîn kirin ku hûn berê di şêlek têketinê de bûn, hawîrdor hatî mîras kirin û dê were mîras kirin.

Di vê rewşê de, du pelên jêrîn heke hebin bi rêz têne darve kirin:

/etc/bash.bashrc ~/.bashrc

Vebijêrk tune?

Ger hûn ne di nav şêlek têketinê an jî şêlekek înteraktîf de ne, wê hingê jîngeha we dê bi rastî vala be. Ev dibe sedema gelek tevliheviyê (li jêr li ser karên cron binêre).

Di vê rewşê de bash li guherbarê dinêre BASH_ENV hawîrdora we û pelê têkildar ku li wir hatî destnîşan kirin diafirîne.

Zehmetiyên Hevbeş û Rêgezên Thumb

karên cron

95% ji dema ku ez destpêka bash debug dikim ev e ku ji ber ku karê cron wekî ku tê hêvî kirin nameşe.

Ev karê lanet Gava ku ez wê li ser rêzika fermanê dimeşîne baş dixebite, lê gava ku ez wê di crontab-ê de dimeşînim têk diçe.

Ev e du sedem:

  • Karên Cron ne înteraktîf in.
  • Berevajî skrîptên rêza fermanê, karên kronê hawîrdora şêlê mîras nakin.

Bi gelemperî hûn ê ferq nekin an jî bala xwe nedin ku skrîptek şêl ne înteraktîf e ji ber ku jîngeh ji şêlê înteraktîf mîras digire. Ev tê wê wateyê ku her tişt PATH и alias wek ku hûn li bendê ne hatine mîheng kirin.

Ji ber vê yekê pir caran hewce ye ku meriv taybetmendiyek diyar bike PATH ji bo karekî kronî mîna vir:

* * * * * PATH=${PATH}:/rê/ber/min/bername/peldanka bernameya min

Skrîptên gazî hev dikin

Pirsgirêkek din a hevpar ev e ku gava nivîsar bi xeletî têne mîheng kirin ku gazî hev bikin. Bo nimûne, /etc/profile behsa ~/.bashrc.

Ev bi gelemperî diqewime dema ku kesek hewl da ku hin xeletiyek rast bike û her tişt xuya bû ku kar dike. Mixabin, gava ku hûn hewce ne ku van celebên danişînan ji hev veqetînin, pirsgirêkên nû derdikevin.

Wêneyê Sandboxed Docker

Ji bo ceribandina xebitandina şêlekê, min wêneyek Docker afirand ku dikare were bikar anîn da ku şêlek di jîngehek ewledar de xelet bike.

Destpêkirin:

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

Dockerfile heye vir.

Ji bo têketinê bi zorê û simulasyona şêlek têketinê:

$ bash --login

Ji bo ceribandina komek guherbaran BASH_ENV:

$ env | grep BASH_ENV

Ji bo debugging crontab skrîptek hêsan dê her hûrdem were darve kirin (di /root/ascript):

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

Source: www.habr.com

Add a comment