/etc/profile
jest wywoływany tylko dla powłok logowania, ponieważ jest to jego szczególny cel.
Jeśli chcesz, aby polecenie było uruchamiane dla interaktywnych powłok, które nie są powłokami logowania, a używasz bash
, umieść je w ~/.bashrc
lub /etc/bash.bashrc
.
Pliki „profilu” mają zawierać polecenia, które powinny być uruchamiane tylko dla powłok logowania. Te pliki to:
/etc/profile
, uruchamiany przez wszystkie powłoki zgodne z Bourne (w tym bash
i dash
), gdy jest uruchamiany jako powłoka logowania.
Skrypty w /etc/profile.d
.
Dotyczy to powłok w stylu Bourne'a, ale nie jest zakodowane w samym pliku wykonywalnym powłoki. Zamiast tego /etc/profile
wywołuje je polecenia. Na przykład w moim systemie Ubuntu 12.04 /etc/profile
zawiera następujące wiersze:
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
.profile
w katalogu osobistym użytkownika, uruchamianym przez powłoki zgodne z Bourne, gdy jest uruchamiany jako powłoka logowania (chyba że zostanie zastąpiona, patrz poniżej).
.bash_profile
lub .bash_login
w katalogu osobistym użytkownika. Są one ignorowane przez powłoki inne niż bash
. Ale jeśli .bash_profile
istnieje, bash
uruchamia go zamiast .profile
. Jeśli .bash_profile
nie istnieje, ale .bash_login
istnieje, to jest uruchamiane zamiast .profile
.
(Ale to jest wspólne dla .bash_profile
lub .bash_login
, jeśli istnieje, jest napisany tak, aby * jawnie wywołać .profile
).
Zaletą plików profili specyficznych dla powłoki jest to, że mogą one zawierać polecenia lub składnię, które są poprawne tylko dla tej powłoki. Na przykład mogę użyć [[
operatora oceny w .bash_profile
/, .bash_login
ale jeśli go użyję, .profile
a następnie zaloguję się dash
jako moja powłoka, zakończy się niepowodzeniem.
Co powinno się znajdować w plikach „profilowych”
Pliki „profil” powinny zawierać polecenia, które powinny być uruchamiane tylko raz, na początku logowania. (Obejmuje to również logowanie graficzne, ponieważ zaczynają się one również od powłoki logowania.) Jeśli powłoka jest interaktywna, użytkownik, który ją uruchomił, jest prawdopodobnie zalogowany, a więc prawdopodobnie ma przodka (który ją uruchomił lub co go uruchomił, lub zaczął to itp.), który był powłoką logowania.
Możesz uruchomić polecenie tylko raz, ponieważ:
- nie ma powodu, aby uruchamiać go więcej niż jeden raz na logowanie, byłoby to nieefektywne lub
- przyniosłoby to niepożądany wynik, aby uruchomić go więcej niż raz podczas logowania.
Jako przykład drugiej sytuacji, w której wystąpiłby niepożądany wynik, rozważ te linie, które domyślnie pojawiają się u każdego użytkownika ~/.profile
:
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
Załóżmy, że korzystasz z SSH, uruchomiłeś inną powłokę (powiedzmy zsh
), w pewnym momencie okazało się, że chcesz tymczasowo wrócić, bash
ale zachować swoje środowisko (więc uruchomiłem bash
ponownie, gdy jesteś w zsh
), a następnie uruchomiłeś podobny program, mc
który uruchamia powłokę jako część jego interfejsu. Jeśli bin
istnieje w twoim katalogu domowym, a twoja nazwa użytkownika to james
, twoja PATH
w najbardziej wewnętrznej powłoce przypomina:
/home/james/bin:/home/james/bin:/home/james/bin:/home/james/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Jest to nieefektywne i (co ważniejsze) utrudnia zrozumienie treści PATH
.
Nie jest to jednak katastrofa. O ile wiem, jeśli każda interaktywna powłoka pozyska pliki „profilu”, nic złego się nie stanie, w domyślnej konfiguracji . Ponieważ jednak celem plików „profilowych” jest zawieranie poleceń uruchamianych tylko raz podczas logowania , użytkownik lub administrator może dodawać polecenia do profilu, które muszą być uruchamiane tylko podczas uruchamiania powłoki logowania.
Gdzie umieścić polecenia dla każdej interaktywnej powłoki do uruchomienia
Jeśli używasz bash
, w każdej interaktywnej powłoce znajdują się pliki poleceń.
/etc/bash.bashrc
.bashrc
w katalogu osobistym użytkownika.
Jest to najczęściej używane do poleceń, które
- wpływają tylko na środowisko powłoki, w której działają - nawet na powłoki potomne lub
- powinien działać, nawet jeśli nie jest to powłoka logowania.
Na przykład, uzupełnianie tabulacji w wierszu poleceń powinno być ogólnie włączone niezależnie od tego, czy bash
była to powłoka logowania. To pojawia się w ~/.bashrc
:
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
. /etc/bash_completion
fi
Obowiązują oba 1 i 2 : to nie przenosi się na inne powłoki uruchomione w tym, a uzupełnianie tabulatorami powinno działać, bash
nawet jeśli zalogowałem się przy użyciu innej powłoki.
Gdzie umieścić polecenia dotyczące powłok logowania i interaktywnych powłok bez logowania
Jeśli używasz bash
i chcesz, aby polecenie było uruchamiane w powłokach logowania i powłokach interaktywnych, które nie są powłokami logowania, zwykle wystarczy umieścić je w /etc/bash.bashrc
lub~/.bashrc
. Dzieje się tak dlatego, domyślnie /etc/profile
i ~/.profile
uruchomić je wyraźnie. Na przykład ~/.profile
ma:
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
(Podobnie /etc/profile
źródła /etc/bash.bashrc
dla bash
.)
Zatem zarówno pliki „profil”, jak i „rc” są uruchamiane podczas uruchamiania bash
powłoki interaktywnej (niezależnie od tego, czy jest to powłoka logowania).
Gdzie umieścić polecenia do uruchomienia w nieinteraktywnych powłokach
Prawdopodobnie nie chcesz określać żadnych poleceń dla wszystkich nieinteraktywnych powłok; będą one działać przy każdym uruchomieniu skryptu (pod warunkiem, że skrypt jest uruchamiany przez powłokę skonfigurowaną do ich uruchamiania).
Może to spowodować znaczne uszkodzenie. Jeśli masz zamiar to zrobić, a w systemie nie ma konta administratora oprócz tego, którego używasz, możesz je utworzyć; które mogą ułatwić naprawianie błędów.
W bash
pliki „rc” są rzeczywiście uruchomić czy powłoka jest interaktywna, czy nie . Jednak na górze mówią:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
Jeśli więc potrzebujesz komend do automatycznego uruchamiania się nawet w nieinteraktywnych powłokach, takich jak te uruchamiane w celu wykonywania skryptów, możesz dodać swoje komendy przed tymi wierszami.
Uruchamianie powłoki logowania
Logowanie uruchamia powłokę logowania. Jeśli chcesz, aby powłoka uruchomiona później działała jako powłoka logowania, zacznij od -l
flagi (oznacza l ogin ). Na przykład:
Jest to najlepszy sposób na uruchomienie powłoki logowania (bez logowania), chyba że chcesz uruchomić ją jako inny użytkownik. Następnie użyj:
sudo -i
dla root
(użyj sudo -s
dla niezalogowanej, interaktywnej powłoki roota)
sudo -u username -i
dla każdego użytkownika
su - username
dla osób niebędących root
użytkownikami (użyj do interaktywnej powłoki roota bez logowania)su username
Co to jest wstępna powłoka logowania?
Wstępna powłoką zgłoszeniową jest taka sama jak powłoki logowania . Wszędzie ta odpowiedź mówi „powłoka logowania”, może powiedzieć „początkowa powłoka logowania” (z wyjątkiem tej sekcji, która już przestałaby mieć sens).
Jednym z powodów terminu „ początkowa powłoka logowania” jest to, że powłoka logowania jest również używana w innym znaczeniu - w celu określenia, który program jest używany jako powłoka, która jest wykonywana podczas logowania. Jest to sens powłoki logowania używanej do powiedzenia:
- „ Domyślną powłoką logowania OpenBSD jest
ksh
; w Ubuntu jest” bash
.
- „Możesz zmienić powłokę logowania za pomocą
chsh
.”
Dalsza lektura
In bash, the "rc" files are actually run whether the shell is interactive or not.
jest nieprawidłowe. /etc/bash.bashrc jest uruchamiany przez /etc/bash.profile.