Bash-ni batafsil ishga tushirish

Agar siz ushbu sahifani qidiruvda topsangiz, bash-ni ishga tushirish bilan bog'liq muammolarni hal qilmoqchisiz.

Ehtimol, sizning bash muhitingiz muhit o'zgaruvchisini o'rnatmayapti va nima uchun siz tushunmayapsiz. Siz turli xil bash yuklash fayllari yoki profillariga yoki barcha fayllarga tasodifiy ishlamaguncha biror narsani yopishtirib qo'ygan bo'lishingiz mumkin.

Qanday bo'lmasin, ushbu eslatmaning maqsadi muammolarni hal qilish uchun bashni boshlash tartibini iloji boricha sodda tarzda belgilashdir.

Diagramma

Ushbu oqim diagrammasi bash-ni ishga tushirishda barcha jarayonlarni umumlashtiradi.

Bash-ni batafsil ishga tushirish

Endi har bir qismni batafsil ko'rib chiqaylik.

Shell-ga kiringmi?

Avval siz login qobig'ida ekanligingizni tanlashingiz kerak.

Kirish qobig'i interaktiv seansga kirganingizda birinchi kiradigan qobiqdir. Kirish qobig'i foydalanuvchi nomi va parolni talab qilmaydi. Kirish qobig'ini bayroq qo'shish orqali boshlashga majbur qilishingiz mumkin --login chaqirilganda bash, masalan:

bash --login

Kirish qobig'i bash qobig'ini birinchi marta ishga tushirganingizda asosiy muhitni o'rnatadi.

Interaktivmi?

Keyin qobiqning interaktiv yoki yo'qligini aniqlaysiz.

Buni o'zgaruvchining mavjudligi bilan tekshirish mumkin PS1 (buyruqni kiritish funksiyasini o'rnatadi):

agar [ "${PS1-}" ]; keyin echo interaktiv boshqa echo interaktiv bo'lmagan fi

Yoki parametr o'rnatilganligini tekshiring -i, maxsus defis o'zgaruvchisi yordamida - bash da, masalan:

$echo$-

Chiqishda belgi bo'lsa i, keyin qobiq interaktiv bo'ladi.

Kirish qobig'ida?

Agar siz login qobig'ida bo'lsangiz, bash faylni qidiradi /etc/profile va agar mavjud bo'lsa ishlaydi.

Keyin ushbu uchta fayldan birini quyidagi tartibda qidiradi:

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

Birini topsa, uni ishga tushiradi va qolganlarini o'tkazib yuboradi.

Interaktiv qobiqdami?

Agar siz login bo'lmagan qobiqda bo'lsangiz, siz allaqachon kirish qobig'ida bo'lgan deb taxmin qilinadi, muhit sozlangan va meros qilib olinadi.

Bunday holda, quyidagi ikkita fayl, agar mavjud bo'lsa, tartibda bajariladi:

/etc/bash.bashrc ~/.bashrc

Variant yo'qmi?

Agar siz login qobig'ida yoki interaktiv qobiqda bo'lmasangiz, sizning muhitingiz haqiqatan ham bo'sh bo'ladi. Bu juda ko'p chalkashliklarni keltirib chiqaradi (quyida cron ishlari haqida qarang).

Bu holda bash o'zgaruvchiga qaraydi BASH_ENV muhitingizni yaratadi va u erda ko'rsatilgan tegishli faylni yaratadi.

Umumiy qiyinchiliklar va bosh barmoq qoidalari

cron ishlari

Vaqtning 95% men bash ishga tushirilishini disk raskadrovka qilaman, chunki cron ishi kutilganidek ishlamayapti.

Bu la'nat vazifa buyruq satrida ishga tushirganimda yaxshi ishlaydi, lekin uni crontabda ishga tushirganimda muvaffaqiyatsiz bo'ladi.

u ikkita sabab:

  • Cron ishlari interaktiv emas.
  • Buyruqlar qatori skriptlaridan farqli o'laroq, cron ishlari qobiq muhitini meros qilib olmaydi.

Odatda siz qobiq skripti interaktiv emasligini sezmaysiz yoki unga ahamiyat bermaysiz, chunki muhit interaktiv qobiqdan meros bo'lib o'tadi. Bu hamma narsani anglatadi PATH и alias siz kutganingizdek sozlangan.

Shuning uchun ko'pincha aniq belgini o'rnatish kerak PATH bu kabi cron vazifasi uchun:

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

Bir-birini chaqiradigan skriptlar

Yana bir keng tarqalgan muammo - skriptlar bir-biriga qo'ng'iroq qilish uchun noto'g'ri tuzilgan. Masalan, /etc/profile ga murojaat qiladi ~/.bashrc.

Bu, odatda, kimdir xatoni tuzatishga harakat qilganda sodir bo'ladi va hamma narsa ishlaganday tuyuladi. Afsuski, bu har xil turdagi sessiyalarni ajratish kerak bo'lganda, yangi muammolar paydo bo'ladi.

Sandboxed Docker tasviri

Shellni ishga tushirish bilan tajriba qilish uchun men xavfsiz muhitda qobiqni ishga tushirishda disk raskadrovka qilish uchun ishlatilishi mumkin bo'lgan Docker tasvirini yaratdim.

Ishga tushirish:

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

Dockerfile joylashgan shu yerda.

Majburiy kirish va kirish qobig'ini simulyatsiya qilish uchun:

$ bash --login

O'zgaruvchilar to'plamini sinab ko'rish uchun BASH_ENV:

$ env | grep BASH_ENV

Nosozliklarni tuzatish uchun crontab oddiy skript har daqiqada bajariladi (in /root/ascript):

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

Manba: www.habr.com

a Izoh qo'shish