Եթե դուք գտել եք այս էջը որոնման մեջ, ապա հավանաբար փորձում եք ինչ-որ խնդիր լուծել «bash»-ի հետ կապված:
Միգուցե ձեր bash միջավայրը միջավայրի փոփոխական չի դնում, և դուք չեք հասկանում, թե ինչու: Դուք կարող եք ինչ-որ բան խրված լինել տարբեր bash boot ֆայլերի կամ պրոֆիլների կամ բոլոր ֆայլերի մեջ պատահական, մինչև այն աշխատի:
Ամեն դեպքում, այս գրառման իմաստն այն է, որ հնարավորինս պարզ ձևակերպի bash-ը սկսելու ընթացակարգը, որպեսզի կարողանաք հաղթահարել խնդիրները:
Диаграмма
Այս աղյուսակը ամփոփում է բոլոր գործընթացները, երբ աշխատում է 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