.bashrc
это файл конфигурации bash, только когда он выполняется в интерактивном режиме. Он загружается только при запуске bash, а не при запуске какой-либо другой программы, например sh
(даже если bash вызывается через имя sh
). И он загружается только тогда, когда bash является интерактивным, а не когда он выполняет скрипт или команду с помощью -c
.
sudo sh -c 'echo $PATH'
или sudo bash -c 'echo $PATH'
не вызывает интерактивную оболочку, поэтому .bashrc
не участвует.
sudo su; echo $PATH
запускает интерактивный экземпляр оболочки root. Если это bash, то ~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'
.