.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'
.