3

Я хотел бы получить свой .bash_profile (или, возможно, какой-нибудь другой файл) всякий раз, когда я переключаюсь на суперпользователя. (.bash_profile - это rc для входа в систему в Mac OS X, .bashrc - это сценарий без входа в систему, а .profile - это rc для входа в систему, который запускается для любой оболочки).

Проще говоря , мой .bash_profile делает использование терминала более удобным для меня, и в те редкие моменты, когда мне приходится играть супер, я чувствую, что пытаюсь играть на гитаре без больших пальцев. Более того, $PS1 и $PROMPT_COMMAND экспортируются суперпользователю, но функции, определенные в моем .bash_profile и используемые в моем $PROMPT_COMMAND , не экспортируются в эту лексическую среду.

В частности, я использую сценарий git-prompt.sh в своем .bash_profile и использую экспортированную команду __git_ps1 в моем $PROMPT_COMMAND . Таким образом, каждой отдельной строке приглашения в оболочке суперпользователя предшествует предупреждение:

bash: __git_ps1: command not found.

Теперь я технически мог изменить общесистемный rc в /etc/profile для достижения эффекта. Я мог бы взглянуть на $HOME , и если это мой дом, то найдите $HOME/.bash_profile . Тем не менее, это не портативно. Я должен был бы изменить /etc/profile на каждом хосте, на котором я, вероятно, буду работать. Я хочу экспортировать это поведение на все хосты, на которых я работаю.

Кто-нибудь может придумать решение, которое полностью содержится в моем профиле bash?

Никаких предупреждений о том, чтобы стать суперпользователем, не требуется. Я знаю, что есть sudo , и что это плохо, плохо, плохо, и я морально и интеллектуально уступаю в этом. :)

В su Mac OS X нет опции -c , которая была бы довольно хорошим решением.

2 ответа2

0

Если вы su из вашего $ HOME, вы можете просто сделать

. .bash_profile
0

Хорошо. У меня есть кое-что сейчас. Это не красиво, но это работает. Основная хитрость заключается в том, что я могу заставить код выполняться в суперпользовательской оболочке, изменив $PROMPT_COMMAND в среде. $PROMPT_COMMAND запускается при переключении в новую среду, и su сохраняет переменные среды bash.

Таким образом, вот решение, которое я использую:

alias su="export REAL_HOME=$HOME && export SWITCHING_TO_SU=true && export PROMPT_COMMAND='source $HOME/.bash_profile; $PROMPT_COMMAND' && su"

Теперь мой .bash_profile будет запущен, как только я переключусь на суперпользователя, и он будет знать две ключевые части информации: 1) что он запускается, потому что я переключаюсь на супер пользователя, и 2) местоположение моего реального пользователя. домашний каталог. Он может использовать эту информацию, чтобы делать все остальное, что ему нужно. В частности, мой .bash_profile вернет $PROMPT_COMMAND обратно к его истинному значению, так что сценарий будет получен только при переключении на su. В конце сценария у меня есть

if [[ "$SWITCHING_TO_SU" == 'true' ]]; then
    unset SWITCHING_TO_SU
    unset REAL_HOME
fi

Я полагаю, что аналогичный прием, основанный на псевдониме exit() можно использовать для переключения при работе с суперпользователем.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .