.bashrc
to plik konfiguracyjny bash, tylko gdy jest wykonywany interaktywnie. Jest ładowany tylko podczas uruchamiania bash, a nie podczas uruchamiania innego programu, takiego jak sh
(nawet jeśli bash jest wywoływany przez nazwę sh
). I jest ładowany tylko wtedy, gdy bash jest interaktywny, a nie podczas wykonywania skryptu lub polecenia -c
.
sudo sh -c 'echo $PATH'
lub sudo bash -c 'echo $PATH'
nie wywołuje interaktywnej powłoki, więc .bashrc
nie jest zaangażowany.
sudo su; echo $PATH
uruchamia interaktywną instancję powłoki roota. Jeśli to bash, to ~root/.bashrc
jest ładowane. Ten fragment kodu jest wykonywany echo $PATH
po zakończeniu działania tej interaktywnej powłoki, więc cokolwiek dzieje się w powłoce interaktywnej, nie ma wpływu na to, co zostanie wydrukowane na końcu. Ale jeśli wpiszesz echo $PATH
po zachęcie interaktywnej powłoki uruchomionej przez sudo su
, zobaczysz wartość ustawioną przez ~root/.bashrc
.
Ponieważ .bashrc
jest wywoływany w każdej interaktywnej powłoce, a nie przez powłoki logowania (nawet przez interaktywne powłoki logowania, co jest wadą projektową w bash), niewłaściwe miejsce do definiowania zmiennych środowiskowych. Służy .bashrc
do interaktywnych ustawień bash, takich jak powiązania klawiszy, aliasy i ustawienia uzupełniania. Ustaw zmienne środowiskowe w plikach, które są ładowane podczas logowania: ~/.pam_environment
lub ~/.profile
.
Tak ustawić PATH
w .profile
zamiast .bashrc
, i uruchom powłokę logowania z sudo -i 'echo $PATH'
, lub jawnie źródła .profile
z sudo sh -c '. ~/.profile; echo $PATH'
.
.profile
? Masz na myśli/root/.profile
czy/home/user/.profile
? Próbowałem dodaćexport PATH=$PATH:/mydir
do obu. Nie działało Próbowałem bezexport
, to też nie działało.Spójrz na opcje
-E
i-i
.-E
: Wskazuje w polityce bezpieczeństwa, że użytkownik chce zachować istniejące zmienne środowiskowe. Polityka bezpieczeństwa może zwrócić błąd, jeśli użytkownik nie ma uprawnień do ochrony środowiska.-i
: Uruchom powłokę określoną przez wpis bazy danych haseł użytkownika docelowego jako powłokę logowania. Oznacza to, że pliki zasobów specyficzne dla logowania, takie jak .profile lub .login, zostaną odczytane przez powłokę. Jeśli podano polecenie, jest ono przekazywane do powłoki w celu wykonania za pomocą opcji -c powłoki. Jeśli nie podano polecenia, wykonywana jest powłoka interaktywna. sudo próbuje przejść do katalogu domowego tego użytkownika przed uruchomieniem powłoki. Polecenie jest uruchamiane w środowisku podobnym do tego, które użytkownik otrzyma podczas logowania. Sekcja Środowisko poleceń w podręczniku sudoers (5) dokumentuje, w jaki sposób opcja -i wpływa na środowisko, w którym polecenie jest uruchamiane, gdy zasada sudoers jest w użyciu.źródło
Możesz to zrobić
sudo bash
, który odczytujebash
pliki startowe zgodnie z dokumentacją nabash
stronie / dokumentacji podręcznika. Należy jednak pamiętać, że może nie ustawićHOME
poprawnie zmiennej środowiskowej. Można to naprawić w ogólnosystemowymbash
pliku startowym (/etc
dokładna lokalizacja zależy od dystrybucji) - sprawdź, czy$uid
jest to 0.źródło