bashrc czy bash_profile?

49

Znam różnicę między dwoma skryptami logowania bash:

.bashrc jest uruchamiany tylko przez powłoki „niezalogowane”.

.bash_profile(lub .bash_loginlub .profile) jest wykonywany przez powłoki „login”.

Czy ktoś ma jakieś dobre przykłady tego, które rzeczy lepiej pasują do wykonania tylko logowania, na przykład, że umieszczam je tylko .bash_profile, ale tak naprawdę nie mają sensu .bashrc?

(Wiem, że większość z nas pochodzi z źródła , więc wydaje .bashrcsię .bash_profile, że nie ma większego sensu w odwrotnym pytaniu ...)

Don Faulkner
źródło
3
Zobacz także to samo pytanie w Super User .
Gilles „SO- przestań być zły”

Odpowiedzi:

24

Ponieważ a .bashrcjest dla powłok niezalogowanych, unikam wszelkich poleceń, które odbijają się echem na ekranie. Zetknąłem się również z doświadczeniami, w których instrukcje echa .bashrcspowodują, że polecenia sftp i rsync zawiodą (a może także polecenia scp).

# Print some information as we log in
# -s: OS Name -n: Node name -r: OS Release
uname -snr
uptime

Poza tym na ogół nie uruchamiasz ssh-agent z nieinteraktywnej powłoki. Więc mam to .bash_profile.

if [ -f ~/.ssh/ssh-agent ]; then . ~/.ssh/ssh-agent; fi
Stefan Lasiewski
źródło
2
Jeśli użyjesz ~ / .profile zamiast ~ / .bash_profile, rzeczy będą nadal działać, nawet jeśli zmienisz powłoki .. ~ / .bash_profile jest przeznaczony do specyficznych dla basha rzeczy.
LassePoulsen,
1
Ale bash uruchomi EITHER .bash_profile LUB .profile, więc jeśli zamierzasz używać obu, musisz zdobyć .profile z .bash_profile lub coś. W rzeczywistości nie jest to zły pomysł ...
Don Faulkner,
@Source & @Don: Dobre punkty. Kiedyś miałem Bashizmy w moim .bash_profile, ale teraz przeszedłem na coś bardziej uniwersalnego. Być może używanie .profile jest w porządku.
Stefan Lasiewski,
Jeśli chodzi o polecenia generujące dane wyjściowe w .bashrczakłócaniu metod zdalnego przesyłania plików zaimplementowanych za pomocą standardowych strumieni , rozwiązaniem jest umieszczenie takich poleceń pod kodem, który sprawdza, czy powłoka jest interaktywna i kontynuuje tylko, jeśli tak jest. Domyślne użytkowników .bashrcplików w Ubuntu, kopiowane z /etc/skel/.bashrcpodczas tworzenia konta, jak i systemowy /etc/bash.bashrc, już zawierać kod, który sprawdza i powroty jeśli powłoka jest Nieinteraktywny (choć trzeba jeszcze umieścić swoich poleceń wyjściowych produkujących pod nimi).
Eliah Kagan
8

Byobu to świetny przykład czegoś, czego nigdy nie powinieneś wkładać .bashrc.

W przeciwnym razie będzie rekurencyjnie uruchamiał się na każdym ze swoich „wirtualnych terminali” ;-)

Możesz jednak spróbować, to trochę zabawne.

Właśnie dlatego go .profilewłożyłeś, więc byobu (który tak naprawdę jest tylko otulaczem ekranu) jest ładowany tylko raz, podczas logowania. Sam byobu może rozpocząć nowe interaktywne sesje bash.

Ralf
źródło
To dobry przykład. Dziękuję również za wskaźnik do Byobu. Teraz idź wypróbuj.
Don Faulkner,