Co robią skrypty w /etc/profile.d?


85

Czytam o podstawowych skryptach powłoki z wiersza poleceń Linuksa i Biblii skryptów powłoki .

Mówi, że /etc/profileplik ustawia zmienne środowiskowe podczas uruchamiania powłoki Bash. /etc/profile.dKatalog zawiera inne skrypty, które zawierają pliki startowe specyficzne dla aplikacji, które są wykonywane również w momencie uruchamiania przez powłokę.

  • Dlaczego te pliki nie są częścią, /etc/profilejeśli są również krytyczne dla uruchamiania Bash?

  • Jeśli te pliki są specyficznymi dla aplikacji plikami startowymi, które nie mają krytycznego znaczenia dla uruchamiania Bash, to dlaczego są częścią procesu uruchamiania? Dlaczego nie są uruchamiane tylko wtedy, gdy uruchamiane są określone aplikacje, dla których zawierają ustawienia?

Odpowiedzi:


71

Dlaczego te pliki nie są częścią / etc / profile, jeśli mają również kluczowe znaczenie dla uruchamiania Bash?

Jeśli masz na myśli: „Dlaczego nie są one połączone w jeden gigantyczny skrypt?”, Odpowiedź brzmi:

  1. Ponieważ byłby to koszmar konserwacji dla osób odpowiedzialnych za skrypty.
  2. Ponieważ ładowanie skryptów jako niezależnych modułów sprawia, że ​​cały system jest bardziej dynamicznie regulowany - poszczególne skrypty można dodawać i usuwać bez wpływu na inne. Itp.
  3. Ponieważ są ładowane przez / etc / profile, co czyni je częścią „profilu” bash w ten sam sposób.

Jeśli te pliki są specyficznymi dla aplikacji plikami startowymi, które nie mają krytycznego znaczenia dla uruchamiania Bash, to dlaczego są częścią procesu uruchamiania? Dlaczego nie są uruchamiane tylko wtedy, gdy uruchamiane są określone aplikacje, dla których zawierają ustawienia?

Wydaje mi się, że jest to szersze pytanie dotyczące filozofii projektowania, które podzielę na dwie części. Pierwsze pytanie dotyczy wartości i zasadności korzystania ze środowiska powłoki. Czy ma wartość dodatnią? Tak, jest to przydatne. Czy to najlepsze rozwiązanie wszystkich problemów z konfiguracją? Nie, ale jest bardzo skuteczny do zarządzania prostymi parametrami, a także powszechnie rozpoznawany i rozumiany. Dla kontrastu, powiedzmy, decydując się na heterogeniczną konfigurację takich rzeczy, być może $ PATH może być zarządzane przez oddzielne niezależne narzędzie, preferowane narzędzia, takie jak $ EDITOR, mogą być gdzieś w pliku sqlite, rzeczy $ LC lang mogą znajdować się w pliku tekstowym z plikiem niestandardowy format gdzie indziej itp. - nie tylko używa zmiennych env i/etc/profile.dnagle wydają się prostsze? Prawdopodobnie już wiesz, czym jest zmienna env, jak działają i jak z nich korzystać, w porównaniu do uczenia się 5 zupełnie różnych mechanizmów dla 5 różnych wszechobecnych aspektów tego, co jest odpowiednio nazywane „środowiskiem”.

Drugie pytanie brzmi: „Czy uruchomienie jest na to odpowiedni czas?”, Co nasuwa zarzut, że nie jest bardzo wydajny (wszystkie dane, które mogą, ale nie muszą zostać wykorzystane itp.). Ale:

  • Realistycznie rzecz biorąc, nie jest to tak dużo danych, częściowo dlatego, że nikt przy zdrowych zmysłach nie użyłby ich do więcej niż kilku prostych parametrów (ponieważ istnieją inne sposoby konfiguracji aplikacji).
  • Jeśli jest używany mądrze, w odniesieniu do rzeczy, które są często wywoływane, ustawienie np. Domyślnej wartości $ CFLAGS z pliku przy każdym wywołaniu gccbyłoby mniej wydajne. Pamiętaj, że ilość zajmowanej pamięci jest ponownie nieskończenie mała.
  • Może obejmować rzeczy systemowe, w które może być zaangażowanych więcej niż jedna aplikacja, a powłoka jest wspólną płaszczyzną .

Więcej można dodać do tej listy, ale mam nadzieję, że daje to pewne wyobrażenie o zaletach i wadach tego problemu - głównym „plusie” i głównym „wadzie” jest to, że jest to globalna przestrzeń nazw.


Does it have positive ... and understood.Co próbujesz tu powiedzieć? Zrozumiałem wszystko inne niż ten akapit.
asheeshr

3
Środowisko powłoki jest zwykle używane do konfigurowania samej powłoki i innych wszechobecnych narzędzi. Nie jest to jedyny sposób konfiguracji, dlatego warto zastanowić się, czy środowisko jest lepsze czy gorsze od innych opcji. Mając „pozytywną wartość”, miałem na myśli, że korzystanie ze środowiska wydaje się mieć pewne zalety w porównaniu z innymi opcjami, przynajmniej WRT „zarządzającymi prostymi parametrami” - a mianowicie, że jest bardzo wydajne oraz „szeroko rozpoznawane i rozumiane” ... i ja Dodam trochę, aby wyjaśnić to zdanie dalej.
goldilocks

Co z dopisywaniem linii do profile.local? Czy jest to dopuszczalne w porównaniu do tworzenia skryptów w folderze profile.d?
Avindra Goolcharan

@AvindraGoolcharan Różne dystrybucje mogą wykorzystywać różne schematy do tego rodzaju rzeczy. profile.dRoboty tylko dlatego, że jego zawartość są pozyskiwane przez /etc/profile, który jest określony przez muszli takie jak bash jako pliku startowego (zobacz WYWOŁANIE w man bash); jeśli edytujesz /etc/profile, możesz wyłączyć /etc/profile.d. /etc/profile.localwydaje się być wynalazkiem SUSE, prawdopodobnie pochodzącym z takich źródeł /etc/profile, aby można było tam umieścić własne rzeczy. Jeśli jednak przeniesiesz go do systemu innego niż SUSE i nie dokonasz żadnych innych korekt, nic go nie wykorzysta.
goldilocks

Gotcha, to krystalicznie czyste. Tak, używamy SUSE w mojej pracy. / etc / profile. wygląda na znacznie lepszy zakład.
Avindra Goolcharan

13

Pliki te są specyficzne dla aplikacji, ale są pozyskiwane podczas uruchamiania powłoki, a nie podczas uruchamiania aplikacji. Używany jest tutaj katalog konfiguracji z tego samego powodu, który znajduje się w wielu innych miejscach. Umożliwia to aplikacji lub pakietowi oprogramowania modyfikowanie konfiguracji. Nie byłoby to możliwe bez podzielonej konfiguracji, ponieważ wiele pakietów próbujących zarządzać / aktualizować pojedynczy plik konfiguracyjny, który może być również modyfikowany przez użytkownika, byłby błędny i bałagan.

Dodatkowa uwaga /etc/profilepochodzi od wszystkich pocisków, a nie tylko od uderzenia. Plik konfiguracyjny specyficzny dla bash jest bashrc i jest pozyskiwany tylko dla interaktywnych powłok.


3
Drugi akapit jest interesujący. Ponieważ różne powłoki obsługują inną składnię, wymagałoby to znaczącej wspólnej składni. To prawda dla bash i sh, ale nie sądzę, aby dla innych, takich jak csh lub tcsh, które mają własne globalne skrypty uruchamiania. W wielu systemach / bin / sh jest tylko linkiem do / bin / bash. Ale bash modyfikuje swoje zachowanie, aby było zgodne z POSIX-em, gdy jest wywoływane jako sh. Można by pomyśleć, że autorzy skryptów w /etc/profile.d musieliby uważać, aby nie używać rozszerzeń bash poza podzbiorem posix.
sootsnoot,

Pod Linuksem istnieją osobne pliki .csh i .sh dla dwóch głównych typów powłok.
surowy

0

odpowiedź jordanma jest nieprawidłowa. /etc/profilenie pochodzi od wszystkich muszli. Jak zauważyłeś, nie pochodzi od csh: tcsh- Nie jestem pewien zsh. Pochodzi z shpochodnych Bourne'a ( ), takich jak Korn Shell ( ksh) i BASH ( bash). cshwykorzystuje /etc/login. Ludzie, którzy używają wyłącznie pochodnych Borne Shell, zwykle zapominają o istnieniu innych powłok. Dodają coś, by /etc/profileoczekiwać, że zastosuje się to do „wszystkich użytkowników”, a następnie są zaskoczeni, gdy dziwny użytkownik powłoki C (a my jesteśmy dziwni) nie ma rzeczy, w których skonfigurowali /etc/profile.

Mimo to ludzie zapominają o istnieniu innych powłok pochodnych Borne Shell. Jeśli używają bashlub ksh, mogą dodawać do nich składnię, /etc/profilektóra nie jest poprawna w powłoce Bourne'a, na przykład definiowanie zmiennej i eksportowanie jej w tym samym wierszu. Potem dostajesz skrypt, który działa #!/bin/shi dusi się w składni. /etc/profilepowinien trzymać się składni kompatybilnej z Bourne Shell.

Podobnie, powinieneś trzymać się go samemu .profile(użyj, .bash_profilejeśli chcesz trochę składni bash) - może to być trochę dodatkowe pisanie, ale jest to dodatkowe pisanie, które robisz za jednym razem. Odnośnik, ${HOME}a nie ~itd. Niektóre smaki Uniksa, zadania cron są uruchamiane sh, każda linia Makefilejest przetwarzana sh, więc jeśli pracujesz nad wieloma odmianami UNIX, naprawdę opłaca się utrzymać .profilekompatybilność powłoki Bourne'a. Jako SysAdmin nie mogę powiedzieć, ile razy pomogłem komuś, ustawiając go tak, .profileaby był zgodny z Bourne Shell.

W Linuksie /bin/shjest linkiem do, /bin/basha kiedy go uruchomisz, wygląda na ścieżkę, która została użyta do jego uruchomienia i (teoretycznie) ogranicza się tylko do rzeczy obsługiwanych przez Bourne Shell. Podobnie viw Linuksie tak naprawdę vimznów się ogranicza. Czasami widzisz funkcje „przenikające”. Czasami vimudawanie vi, vimże virobi , robi coś, co nie obsługuje, ponieważ autorzy vimzapomnieli wyłączyć to w trybie „wstecznej kompatybilności”. Nie zdziwiłbym się, gdyby bashudawanie, że shma takie podobne cechy. Nie zdziwiłbym się, gdyby jakaś funkcja „działała na Borne Shell w systemie Linux”, ale nie w systemie UNIX opartym na systemie V lub BSD (AIX, OpenBSD itp.).


Czy na pewno „w Linuksie /bin/shjest link do /bin/bash”? To solidne stwierdzenie.
41754
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.