.bashrc
- це файл конфігурації bash, лише коли він виконується інтерактивно. Він завантажується лише під час запуску bash, а не під час запуску якоїсь іншої програми (наприклад, sh
навіть якщо bash викликається через ім'я sh
). І завантажується лише тоді, коли bash є інтерактивним, а не тоді, коли він виконує скрипт чи команду -c
.
sudo sh -c 'echo $PATH'
або sudo bash -c 'echo $PATH'
не викликає інтерактивну оболонку, тому .bashrc
не бере участь.
sudo su; echo $PATH
запускає інтерактивний екземпляр оболонки кореня. Якщо це баш, то ~root/.bashrc
завантажується. Цей фрагмент виконується, echo $PATH
коли ця інтерактивна оболонка закінчується, тому те, що відбувається в інтерактивній оболонці, не впливає на те, що фрагмент друкується в кінці. Але якщо ви введете echo $PATH
підказку інтерактивної оболонки, запущеноїsudo su
, ви побачите значення, встановлене символом ~root/.bashrc
.
Оскільки .bashrc
викликається в кожній інтерактивній оболонці, а не по оболонках входу (навіть не по інтерактивних оболонках входу, що є дефектом дизайну в bash), неправильне місце для визначення змінних середовища. Використовуйте .bashrc
для інтерактивних налаштувань bash, таких як прив'язка ключів, псевдоніми та налаштування завершення. Встановити змінні середовища у файлах, які завантажуються під час входу:~/.pam_environment
або ~/.profile
.
Так встановлено PATH
в .profile
замість .bashrc
, і або запустити оболонку входу в систему з sudo -i 'echo $PATH'
, або в явному вигляді джерела .profile
з sudo sh -c '. ~/.profile; echo $PATH'
.