Якщо ви знайшли цю сторінку в пошуку, то, напевно, намагаєтеся вирішити якусь проблему із запуском 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