Źródłem mojego profilu bash, gdy korzystam z systemu OS X

3

Chciałbym uzyskać źródło .bash_profile(lub może jakiś inny plik) za każdym razem, gdy przełączam się na administratora. ( .bash_profilejest to login rc w Mac OS X, .bashrcto skrypt bez logowania i .profilejest to rc logowania działający dla dowolnej powłoki).

Po prostu .bash_profilesprawia , że korzystanie z terminala jest dla mnie wygodniejsze, a czasami, kiedy muszę iść super, mam wrażenie, że próbuję grać na gitarze bez kciuków. Co więcej, $PS1i $PROMPT_COMMANDzostaną wyeksportowane do superużytkownika, ale funkcje zdefiniowane w moim .bash_profilei użyte w moim $PROMPT_COMMANDnie zostaną wyeksportowane do tego środowiska leksykalnego.

W szczególności źródłowy git-prompt.shskrypt w moim źródle .bash_profilei używam w nim wyeksportowanego __git_ps1polecenia $PROMPT_COMMAND. Dlatego każdy wiersz zachęty w powłoce administratora jest poprzedzony ostrzeżeniem:

bash: __git_ps1: command not found.

Teraz technicznie mogę zmodyfikować systemowy rc /etc/profilew celu uzyskania efektu. Mógłbym spojrzeć $HOME, a jeśli to mój dom, to źródło $HOME/.bash_profile. Nie jest to jednak przenośne. Musiałbym zmodyfikować /etc/profilena każdym hoście, na którym prawdopodobnie będę pracować. Chcę wyeksportować to zachowanie na wszystkich hostach, na których pracuję.

Czy ktoś może pomyśleć o rozwiązaniu, które jest całkowicie zawarte w moim własnym profilu bash?

Nie są wymagane żadne ostrzeżenia o zostaniu superużytkownikiem. Wiem, że tam jest sudoi że jest źle, źle, źle i jestem moralnie i intelektualnie gorszy za robienie tego. :)

Mac OS X sunie ma -copcji, która byłaby całkiem dobrym rozwiązaniem.

masonk
źródło

Odpowiedzi:

0

Jeśli jesteś suz $ HOME, możesz po prostu zrobić

. .bash_profile
Roland Smith
źródło
0

W porządku. Mam coś teraz. To nie jest ładne, ale działa. Główną sztuczką jest to, że mogę spowodować wykonanie kodu w powłoce superużytkownika poprzez zmianę $PROMPT_COMMANDw środowisku. $PROMPT_COMMANDjest wykonywany natychmiast po przejściu do nowego środowiska, a su zachowuje zmienne środowiskowe bash.

Oto rozwiązanie, którego używam:

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

Teraz mój .bash_profilezostanie uruchomiony, gdy tylko przełączy się na superużytkownika, i będzie wiedział dwie kluczowe informacje: 1) że jest uruchamiany, ponieważ przełączam się na superużytkownika, i 2) lokalizację mojego prawdziwego katalogu domowego . Może wykorzystać te informacje do zrobienia wszystkiego, co musi zrobić. W szczególności mój .bash_profile zresetuje się z $PROMPT_COMMANDpowrotem do swojej prawdziwej wartości, dzięki czemu skrypt będzie pozyskiwany tylko po przejściu na su. Na końcu skryptu mam

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

Podobną sztuczkę opartą na aliasingu exit()można, jak sądzę, zrobić po wyjściu z superużytkownika.

masonk
źródło
Pozostawię to otwarte na wypadek, gdyby ktoś miał lepszy pomysł.
masonk