Running Bash në detaje

Nëse e gjetët këtë faqe në një kërkim, ndoshta po përpiqeni të zgjidhni një problem me drejtimin e bash.

Ndoshta mjedisi juaj bash nuk po vendos një variabël mjedisi dhe ju nuk e kuptoni pse. Mund të keni ngulur diçka në skedarë ose profile të ndryshme bash boot ose të gjithë skedarët rastësisht derisa të funksionojë.

Në çdo rast, qëllimi i këtij shënimi është të parashtroni procedurën për fillimin e bash-it sa më thjeshtë që të jetë e mundur, në mënyrë që të përballeni me problemet.

Diagramë

Ky diagram i rrjedhës përmbledh të gjitha proceset gjatë ekzekutimit të bash.

Running Bash në detaje

Tani le të hedhim një vështrim më të afërt në secilën pjesë.

Identifikohu Shell?

Së pari ju duhet të zgjidhni nëse jeni në guaskën e hyrjes apo jo.

Predha e hyrjes është guaska e parë që futni kur identifikoheni për një seancë interaktive. Predha e hyrjes nuk kërkon një emër përdoruesi dhe fjalëkalim. Ju mund ta detyroni predhën e hyrjes të fillojë duke shtuar një flamur --login kur thirret bash, për shembull:

bash --hyrje

Predha e hyrjes konfiguron mjedisin bazë kur filloni për herë të parë guaskën bash.

Interaktive?

Pastaj ju përcaktoni nëse guaska është interaktive apo jo.

Kjo mund të kontrollohet nga prania e ndryshores PS1 (ai instalon funksionin e hyrjes së komandës):

nëse [ "${PS1-}" ]; pastaj jehonë interaktive tjetër echo jo-interaktive fi

Ose shikoni nëse opsioni është vendosur -i, duke përdorur një variabël të veçantë vizë - në bash, për shembull:

$echo$-

Nëse ka një simbol në dalje i, atëherë guaska është interaktive.

Në guaskën e hyrjes?

Nëse jeni në një guaskë identifikimi, atëherë bash kërkon skedarin /etc/profile dhe funksionon nëse ekziston.

Pastaj kërkon ndonjë nga këta tre skedarë në rendin e mëposhtëm:

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

Kur gjen një, e nis dhe i kalon të tjerët.

Në një guaskë interaktive?

Nëse jeni në një guaskë pa hyrje, supozohet se keni qenë tashmë në një guaskë identifikimi, mjedisi është konfiguruar dhe do të trashëgohet.

Në këtë rast, dy skedarët e mëposhtëm ekzekutohen me radhë, nëse ekzistojnë:

/etc/bash.bashrc ~/.bashrc

Asnjë opsion?

Nëse nuk jeni as në një guaskë identifikimi ose në një guaskë interaktive, atëherë mjedisi juaj do të jetë me të vërtetë bosh. Kjo shkakton shumë konfuzion (shih më poshtë për punët e cron).

Në këtë rast bash shikon variablin BASH_ENV mjedisin tuaj dhe krijon skedarin përkatës të specifikuar aty.

Vështirësitë e zakonshme dhe rregullat e gishtit

cron pune

95% e rasteve që korrigjoj bash startup-in është për shkak se puna e cron nuk po funksionon siç pritej.

Kjo detyrë e mallkuar funksionon mirë kur e ekzekutoj në vijën e komandës, por dështon kur e ekzekutoj në crontab.

Këtu dy arsye:

  • Punët e Cron nuk janë ndërvepruese.
  • Ndryshe nga skriptet e linjës së komandës, cron jobs nuk trashëgojnë mjedisin e guaskës.

Zakonisht nuk do të vini re ose nuk do t'ju interesojë që një skrip shell nuk është ndërveprues sepse mjedisi trashëgon nga guaska interaktive. Kjo do të thotë se gjithçka PATH и alias konfiguruar siç do të prisnit.

Kjo është arsyeja pse shpesh është e nevojshme të vendosni një specifikë PATH për një detyrë kronike si këtu:

* * * * * PATH=${PATH}:/rruga/to/my/program/folder myprogram

Skriptet që thërrasin njëri-tjetrin

Një problem tjetër i zakonshëm është kur skriptet janë konfiguruar gabimisht për të thirrur njëri-tjetrin. Për shembull, /etc/profile apelon tek ~/.bashrc.

Kjo zakonisht ndodh kur dikush u përpoq të rregullonte ndonjë gabim dhe gjithçka dukej se funksiononte. Fatkeqësisht, kur duhet të ndani këto lloje të ndryshme seancash, lindin probleme të reja.

Imazhi Sandboxed Docker

Për të eksperimentuar me ekzekutimin e një predhe, krijova një imazh Docker që mund të përdoret për të korrigjuar drejtimin e një predhe në një mjedis të sigurt.

Nisja:

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

Dockerfile ndodhet këtu.

Për të detyruar hyrjen dhe simulimin e një guaskë identifikimi:

$ bash --login

Për të testuar një grup variablash BASH_ENV:

$ env | grep BASH_ENV

Për korrigjimin e gabimeve crontab një skenar i thjeshtë do të ekzekutohet çdo minutë (në /root/ascript):

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

Burimi: www.habr.com

Shto një koment