Running Bash-ը մանրամասն

Եթե ​​դուք գտել եք այս էջը որոնման մեջ, ապա հավանաբար փորձում եք ինչ-որ խնդիր լուծել «bash»-ի հետ կապված:

Միգուցե ձեր bash միջավայրը միջավայրի փոփոխական չի դնում, և դուք չեք հասկանում, թե ինչու: Դուք կարող եք ինչ-որ բան խրված լինել տարբեր bash boot ֆայլերի կամ պրոֆիլների կամ բոլոր ֆայլերի մեջ պատահական, մինչև այն աշխատի:

Ամեն դեպքում, այս գրառման իմաստն այն է, որ հնարավորինս պարզ ձևակերպի bash-ը սկսելու ընթացակարգը, որպեսզի կարողանաք հաղթահարել խնդիրները:

Диаграмма

Այս աղյուսակը ամփոփում է բոլոր գործընթացները, երբ աշխատում է bash-ը:

Running Bash-ը մանրամասն

Այժմ եկեք ավելի սերտ նայենք յուրաքանչյուր մասի:

Մուտք գործել Shell?

Նախ պետք է ընտրեք՝ դուք մուտքի կեղևում եք, թե ոչ:

Մուտքի պատյանն առաջին պատյանն է, որը դուք մուտք եք գործում ինտերակտիվ նիստի համար մուտք գործելիս: Մուտքի վահանակը չի պահանջում օգտվողի անուն և գաղտնաբառ: Դուք կարող եք ստիպել մուտքի վահանակին սկսել՝ ավելացնելով դրոշակ --login երբ կոչվում է bash, օրինակ `

bash --մուտք

Մուտքի վահանակը ստեղծում է բազային միջավայրը, երբ առաջին անգամ սկսում եք bash shell-ը:

Ինտերակտիվ?

Այնուհետև դուք որոշում եք՝ պատյանը ինտերակտիվ է, թե ոչ:

Սա կարելի է ստուգել փոփոխականի առկայությամբ PS1 (այն տեղադրում է հրամանի մուտքագրման գործառույթը):

եթե [ «${PS1-}» ]; ապա echo interactive else echo ոչ ինտերակտիվ fi

Կամ տեսեք, թե արդյոք տարբերակը դրված է -i, օգտագործելով հատուկ գծիկ փոփոխական - բաշում, օրինակ.

$echo$-

Եթե ​​ելքի մեջ կա նշան i, ապա կեղևը ինտերակտիվ է:

Մուտքի պատյանո՞ւմ:

Եթե ​​դուք մուտքի կեղևում եք, ապա bash-ը փնտրում է ֆայլը /etc/profile և գործում է, եթե այն գոյություն ունի:

Այնուհետև որոնում է այս երեք ֆայլերից որևէ մեկը հետևյալ հաջորդականությամբ.

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

Երբ գտնում է մեկին, սկսում է այն և բաց է թողնում մյուսները:

Ինտերակտիվ պատյանո՞ւմ:

Եթե ​​դուք գտնվում եք ոչ մուտքային վահանակում, ապա ենթադրվում է, որ դուք արդեն եղել եք մուտքի վահանակում, միջավայրը կազմաձևված է և կժառանգվի:

Այս դեպքում հետևյալ երկու ֆայլերը կատարվում են հերթականությամբ, եթե դրանք կան.

/etc/bash.bashrc ~/.bashrc

Տարբերակ չկա՞

Եթե ​​դուք մուտքի կամ ինտերակտիվ կեղևի մեջ չեք, ապա ձեր միջավայրն իսկապես դատարկ կլինի: Սա մեծ շփոթություն է առաջացնում (տես ստորև cron աշխատանքների մասին):

Այս դեպքում bash-ը նայում է փոփոխականին BASH_ENV ձեր միջավայրը և ստեղծում է այնտեղ նշված համապատասխան ֆայլը:

Ընդհանուր դժվարություններ և կանոններ

cron աշխատատեղեր

Ժամանակի 95%-ում ես վրիպազերծում եմ bash startup-ը, դա պայմանավորված է նրանով, որ cron աշխատանքը չի աշխատում այնպես, ինչպես սպասվում էր:

Այս անիծյալ առաջադրանքը լավ է աշխատում, երբ այն գործարկում եմ հրամանի տողում, բայց ձախողվում է, երբ այն գործարկում եմ crontab-ում.

Այստեղ երկու պատճառ:

  • Cron-ի աշխատանքները ինտերակտիվ չեն:
  • Ի տարբերություն հրամանի տողերի սկրիպտների, cron աշխատանքները չեն ժառանգում shell միջավայրը:

Սովորաբար դուք չեք նկատի և չեք հետաքրքրվի, որ shell script-ը ինտերակտիվ չէ, քանի որ միջավայրը ժառանգում է ինտերակտիվ վահանակից: Սա նշանակում է, որ ամեն ինչ PATH и alias կազմաձևված է այնպես, ինչպես կսպասեիք:

Ահա թե ինչու հաճախ անհրաժեշտ է կոնկրետ սահմանել PATH Cron առաջադրանքի համար, ինչպիսին այստեղ է.

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

Սցենարներ, որոնք կանչում են միմյանց

Մեկ այլ ընդհանուր խնդիր է, երբ սկրիպտները սխալմամբ կազմաձևված են միմյանց կանչելու համար: Օրինակ, /etc/profile դիմում է ~/.bashrc.

Սա սովորաբար տեղի է ունենում, երբ ինչ-որ մեկը փորձել է ուղղել ինչ-որ սխալ, և թվում էր, թե ամեն ինչ ստացվում է: Ցավոք, երբ դուք պետք է առանձնացնեք այս տարբեր տեսակի նիստերը, նոր խնդիրներ են առաջանում:

Sandboxed Docker պատկեր

Շելլը գործարկելու փորձեր կատարելու համար ես ստեղծեցի Docker պատկեր, որը կարող է օգտագործվել անվտանգ միջավայրում կեղևի գործարկման վրիպազերծման համար:

Գործարկել:

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

Dockerfile-ը գտնվում է այստեղ.

Մուտք գործելու և մուտքի կեղևը մոդելավորելու համար.

$ bash --login

Փոփոխականների մի շարք փորձարկելու համար BASH_ENV:

$ env | grep BASH_ENV

Վրիպազերծման համար crontab մի պարզ սցենար կկատարվի ամեն րոպե (in /root/ascript):

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

Source: www.habr.com

Добавить комментарий