.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'
.
.profile
? Вы имеете в виду/root/.profile
или/home/user/.profile
? Я попытался добавитьexport PATH=$PATH:/mydir
к обоим. Не сработало Я пробовал безexport
, это тоже не сработало.Посмотрите на
-E
и-i
варианты.-E
Указывает политике безопасности, что пользователь желает сохранить существующие переменные среды. Политика безопасности может возвращать ошибку, если у пользователя нет разрешения на сохранение среды.-i
: Запустите оболочку, указанную в записи базы данных паролей целевого пользователя, в качестве оболочки входа. Это означает, что специфичные для входа файлы ресурсов, такие как .profile или .login, будут читаться оболочкой. Если указана команда, она передается в оболочку для выполнения через опцию -c оболочки. Если команда не указана, выполняется интерактивная оболочка. sudo пытается перейти в домашний каталог этого пользователя перед запуском оболочки. Команда запускается в среде, аналогичной той, которую пользователь получает при входе в систему. В разделе Командная среда в руководстве sudoers (5) описано, как параметр -i влияет на среду, в которой запускается команда, когда политика sudoers имеет значение в использовании.источник
Вы могли бы
sudo bash
, который действительно читаетbash
файлы запуска, как документировано вbash
странице руководства / документации. Обратите внимание, однако, что он можетHOME
неправильно установить переменную среды. Это можно исправить в общесистемномbash
файле запуска (/etc
точное расположение зависит от дистрибутива) - проверьте,$uid
равно ли 0.источник