.bashrcto 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 .bashrcnie jest zaangażowany.
sudo su; echo $PATHuruchamia interaktywną instancję powłoki roota. Jeśli to bash, to ~root/.bashrcjest ładowane. Ten fragment kodu jest wykonywany echo $PATHpo 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 $PATHpo zachęcie interaktywnej powłoki uruchomionej przez sudo su, zobaczysz wartość ustawioną przez ~root/.bashrc.
Ponieważ .bashrcjest 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 .bashrcdo 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_environmentlub ~/.profile.
Tak ustawić PATHw .profilezamiast .bashrc, i uruchom powłokę logowania z sudo -i 'echo $PATH', lub jawnie źródła .profilez sudo sh -c '. ~/.profile; echo $PATH'.