Odpowiedzi:
.profile
vs. .zprofile
Zsh nie działa ~/.zprofile
, ~/.profile
gdy jest wywoływany jako powłoka logowania. Powodem jest to, że zsh ma wystarczająco dużo niezgodności ze standardowymi powłokami, aby łamać skrypty.
Zsh działa, ~/.profile
jeśli jest wywoływany jako sh
lub ksh
. Ale jeśli Twoim celem jest wyświetlenie monitu o zsh podczas logowania, to nie pomoże.
Możesz utworzyć /bin/sh
powłokę logowania i dołączyć ją export SHELL=/bin/zsh
do swojego ~/.profile
. Następnie, gdy otworzysz terminal, terminal uruchomi zsh (z wyjątkiem kilku emulatorów terminali nie przestrzegających tego $SHELL
ustawienia). Ale nadal będziesz mieć, sh
gdy zalogujesz się przez ssh. Można temu zaradzić, dołączając exec zsh
na końcu ~/.profile
(to zastępuje działającą powłokę przez zsh), ale musisz być ostrożny, aby to zrobić tylko dla interaktywnych logowań, a nie wtedy, gdy ~/.profile
jest dołączony z innych skryptów, takich jak rozpoczęcie sesji X (dobra test to nazwa procesu nadrzędnego uzyskana przez ps -o comm= $PPID
: jeśli jest sshd
lub su
, to jest to bezpieczne exec
).
Najłatwiejszym rozwiązaniem zarówno do pracy z zsh, jak i run ~/.profile
jest utworzenie ~/.zprofile
trybu, który przechodzi w tryb emulacji podczas działania ~/.profile
:
emulate sh
. ~/.profile
emulate zsh
Jeśli masz dość niedawną wersję Zsh (na Ubuntu, to znaczy od czasu świadomego, myślę), możesz to uprościć emulate sh -c '. ~/.profile'
.
.zprofile
vs. .zshrc
Plik ~/.profile
jest ładowany przez powłoki logowania . Powłoka logowania jest pierwszym procesem uruchamianym po zalogowaniu się w trybie tekstowym, na przykład w konsoli tekstowej lub przez ssh. Domyślnie na większości komputerów z Linuksem powłoka logowania jest bash, ale można ją zmienić za pomocą chsh
polecenia lub innego narzędzia, takiego jak „Ustawienia użytkownika” w Ubuntu. Gdy jest to powłoka logowania, bash czyta, ~/.bash_profile
jeśli istnieje, a ~/.profile
podczas gdy zsh tylko czyta ~/.zprofile
(ponieważ jej składnia nie jest w pełni kompatybilna z tradycyjnym sh). W większości konfiguracji ~/.profile
jest również ładowany przez skrypty uruchamiania sesji X podczas logowania w graficznym menedżerze wyświetlania.
Po uruchomieniu emulatora terminala i wyświetleniu monitu powłoki lub po jawnym uruchomieniu powłoki otrzymujesz powłokę, która nie jest powłoką logowania. Ponieważ ~/.profile
(lub ~/.zprofile
) dotyczy poleceń, które chcesz wykonać podczas logowania, powłoka niezalogowana nie odczytuje tego pliku. Zamiast tego, kiedy uruchamiasz interaktywny zsh, odczytuje ~/.zshrc
. (Zsh czyta ~/.zshrc
we wszystkich interaktywnych powłokach, niezależnie od tego, czy są to powłoki do logowania, nie są; bash, o dziwo, nigdy nie czyta ~/.bashrc
w powłokach do logowania.)
Zazwyczaj ~/.profile
zawiera definicje zmiennych środowiskowych i może uruchamiać niektóre programy, które chcesz uruchomić raz podczas logowania lub na całą sesję; ~/.zshrc
zawiera rzeczy, które należy wykonać dla każdej instancji powłoki, takie jak aliasy i definicje funkcji, ustawienia opcji powłoki, ustawienia zakończenia, ustawienia monitów, powiązania klawiszy itp.
~/.profile
nie jest ładowany zsh
przy logowaniu.zsh
ładuje ~/.zprofile
przy logowaniu.zsh
ładuje się ~/.zshrc
podczas rozpoczynania nowej sesji terminala.Potrzebujesz więcej informacji? Spójrz na doskonałą odpowiedź Gillesa!
Oprócz odpowiedzi Gillesa, z dość aktualną wersją zsh, możesz to zrobić:
[[ -e ~/.profile ]] && emulate sh -c 'source ~/.profile'
... Który będzie pozyskiwał plik .profile z działającym trybem sh w Zsh. I jest aktywny tylko podczas źródła. Nie musisz więc zapisywać bieżącego stanu opcji, aby odtworzyć go ponownie po zakupie.
Mam .zprofile
kompatybilny z .profile
(zawiera tylko zmiany PATH), dlatego potrzebuję tylko:
ln -s .profile .zprofile
Zsh dokumentacja mam pod ręką tylko wymienia /etc/profile
i ~/.profile
dla powłok zgłoszeniowych w sh / ksh trybie zgodności.
% zsh --version
zsh 4.3.10 …
% cat ~/.profile
echo 'Running ~/.profile...'
Powłoka logowania w trybie macierzystym (zaczyna się od argv [0] -
) nie używa ~/.profile
(będzie ~/.zprofile
jednak używać ):
% zsh -c 'exec -a -zsh zsh' </dev/null
(brak wyników)
SH / KSH Zgodność trybu logowania muszle wykorzystuje .profile:
% zsh -c 'exec -a -sh zsh' </dev/null
Running ~/.profile...
% zsh -c 'exec -a -ksh zsh' </dev/null
Running ~/.profile...