Запуск Bash у деталях

Якщо ви знайшли цю сторінку в пошуку, то, напевно, намагаєтеся вирішити якусь проблему із запуском bash.

Можливо, у вашому оточенні bash не встановлюється змінне середовище і ви не розумієте, чому. Можливо, ви засунули щось у різні завантажувальні файли bash або в профілі, або у всі файли навмання, поки це не спрацювало.

У будь-якому випадку, сенс цієї нотатки - якомога простіше викласти процедуру запуску bash, щоб ви могли впоратися з проблемами.

діаграма

Ця блок-схема узагальнює всі процеси під час запуску bash.

Запуск Bash у деталях

Тепер докладніше розглянемо кожну частину.

Login Shell?

Спершу потрібно вибрати, чи знаходитесь ви в командній оболонці входу (login shell) чи ні.

Оболонка входу - це перша оболонка, в яку ви потрапляєте під час входу в систему для інтерактивного сеансу. Оболонка входу не вимагає введення імені користувача та пароля. Ви можете форсувати запуск оболонки входу, додавши прапор --login під час виклику bash, Наприклад:

bash --login

Оболонка входу налаштовує базове середовище під час першого запуску оболонки bash.

Інтерактивний?

Потім ви визначаєте, є оболонка інтерактивною чи ні.

Це можна перевірити за наявності змінної PS1 (Вона встановлює функцію введення команд):

if [ "${PS1-}"]; then echo interactive else echo non-interactive fi

Або подивитися, чи встановлено параметр -i, за допомогою спеціальної змінної дефісу - в bash, наприклад:

$ echo $-

Якщо у видачі є символ iто оболонка є інтерактивною.

В оболонці входу?

Якщо ви знаходитесь в оболонці входу, bash шукає файл /etc/profile і запускає, якщо вона існує.

Потім шукає будь-який із цих трьох файлів у наступному порядку:

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

Коли знаходить один, то запускає його та пропускає інші.

В інтерактивній оболонці?

Якщо ви знаходитесь в інтерактивній оболонці без входу в систему (non-login shell), передбачається, що ви вже побували в оболонці входу, оточення налаштоване та успадковане.

У цьому випадку виконуються по порядку наступні два файли, якщо вони існують:

/etc/bash.bashrc ~/.bashrc

Жоден варіант?

Якщо ви не знаходитесь ні в оболонці входу, ні в інтерактивній оболонці, то ваше оточення справді буде порожнім. Це викликає велику плутанину (див. нижче про завдання cron).

У цьому випадку bash дивиться на змінну BASH_ENV вашого середовища та створює відповідний файл, який там вказаний.

Типові труднощі та емпіричні правила

Завдання cron

У мене в 95% випадків налагодження запуску bash пов'язане з тим, що завдання cron працює не так, як очікувалося.

Це прокляте завдання працює нормально, коли я запускаю її в командному рядку, але фейлі при запуску в crontab.

Тут дві причини:

  • Завдання cron не є інтерактивними.
  • На відміну від скриптів у командному рядку, завдання cron не успадковують середовище оболонки.

Зазвичай ви не помічаєте або не дбаєте, що скрипт оболонки не є інтерактивним, тому що середовище успадковується від інтерактивної оболонки. Це означає, що все PATH и alias налаштовані так, як ви очікуєте.

Ось чому часто доводиться встановити конкретний PATH для завдання cron, як тут:

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

Скрипти, що викликають одне одного

Ще одна поширена проблема, коли скрипти помилково налаштовані на виклик один одного. Наприклад, /etc/profile звертається до ~/.bashrc.

Зазвичай так відбувається, коли хтось намагався виправити якусь помилку і начебто все запрацювало. На жаль, коли потрібно розділити ці різні типи сесій, виникають нові проблеми.

Образ 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 щохвилини виконуються простий скрипт (в /root/ascript):

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

Джерело: habr.com

Додати коментар або відгук