Globalny profil bash

20

Zdaję sobie sprawę, że istnieją /etc/profilei /etc/bashrcpliki do ustawiania globalnych zmiennych środowiskowych i może po prostu nie rozumiem ich celów, ale ...

Czy istnieje bash_profileplik globalny ?

Używam Mac OS X.

Hubro
źródło

Odpowiedzi:

15

To się nie nazywa bash_profile, ale standardowym miejscem globalnej konfiguracji bash jest /etc/bash.bashrc. Zwykle wywołuje się to, /etc/profilejeśli powłoka jest bash. Na przykład w moim /etc/profilemam:

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1=’0
    if [ f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  fi
fi

Pod względem użytkowania /etc/profilezapewnia konfigurację ogólnosystemową dla wszystkich kompatybilnych powłok Bourne (sh, bash, ksh itp.). Zwykle nie ma potrzeby równoważnika /etc/bash_profile, ponieważ celem pliku profilu jest kontrolowanie zachowania powłok logowania. Zwykle wszystko, co chcesz zrobić, nie będzie specyficzne dla bash. /etc/bash.bashrcjest specyficzny dla bash i będzie uruchamiany zarówno dla powłok zalogowanych, jak i niezalogowanych.

Aby jeszcze bardziej skomplikować, wygląda na to, że OS X nawet nie ma /etc/bash.bashrc. Jest to prawdopodobnie związane z faktem, że Terminale w OS X domyślnie działają jako powłoki logowania , więc rozróżnienie zostaje utracone:

Wyjątkiem od wytycznych dotyczących okna terminala jest aplikacja Terminal.app w systemie Mac OS X, która domyślnie uruchamia powłokę logowania dla każdego nowego okna terminala, wywołując plik .bash_profile zamiast .bashrc. Inne emulatory terminala GUI mogą robić to samo, ale większość tego nie robi.

Nie uruchamiam OS X, więc na tym kończy się moja wiedza.

ire_and_curses
źródło
Nie czytaj /etc/bash.bashrcz nieinteraktywnej powłoki. /etc/profilemoże być odczytany przez nieinteraktywną powłokę. Zobacz różnice między powłoką logowania a powłoką niezalogowaną?
Gilles „SO- przestań być zły”
@Gilles - Nie jestem pewien, o co tutaj starasz się wspomnieć. Nieinteraktywna powłoka logowania jest naprawdę niezwykła. Dla porównania, cytowany przeze mnie kod nie jest moim własnym dziełem. Jest domyślnie /etc/profilew Ubuntu 12.04. Co byś zasugerował, gdyby ktoś chciał, /etc/profilektóry byłby wykonywany tylko w trybie bash, a nie żadnej innej powłoki kompatybilnej z SH?
ire_and_curses
System /etc/profileplików dla mojego systemu zawiera komentarz na górze, który brzmi: # System-wide .profile for sh(1). Czy to znaczy, że profilejest shspecyficzne? Czy shjakoś działa wcześniej bash?
@Josh Voigts - shjest podzbiorem bash. /etc/profilejest wykonywany dla sh, bashi wszystkich innych powłok kompatybilnych z Bourne.
ire_and_curses
@ire_and_curses Wygląda na to, że plik jest wywoływany /etc/bashrcna komputerze Mac, a nie /etc/bash.bashrc. Wydaje się również, że działa /bin/sh.
BrainStorm.exe
4

/etc/profilejest globalny bash_profile. Nie ma pliku, który byłby specyficzny dla bash, bash po prostu czyta standardowy plik odczytywany przez wszystkie powłoki w stylu Bourne'a. Tam możesz ustawić ogólnosystemowe zmienne środowiskowe.

Zobacz Czy istnieje plik równoważny „.bashrc” odczytywany przez wszystkie powłoki? ogólny przegląd typowych plików startowych bash.

Gilles „SO- przestań być zły”
źródło
0

Skonfiguruj interaktywną powłokę (Bash) globalnie

To się nie ładuje /etc/profile, więc nic się /etc/profile.d/nie ładuje (w przeciwieństwie do powłok logowania, patrz koniec).

Globalny plik do tego to / etc / bashrc lub /etc/bash.bashrc (w zależności od -DSYS_BASHRC=flagi ustawionej podczas kompilacji):

# System-wide .bashrc file for interactive bash(1) shells.
if [ -z "$PS1" ]; then
   return
fi

PS1='\h:\W \u\$ '
# Make bash check its window size after a process completes
shopt -s checkwinsize

[ -r "/etc/bashrc_$TERM_PROGRAM" ] && . "/etc/bashrc_$TERM_PROGRAM"

Zwykle dobrym pomysłem jest pozostawienie tego pliku w stanie, w jakim się znajduje (tak dużo, jak to możliwe), aby uniknąć konfliktów. Strategia, z której korzystam, jest podobna do strategii używanej przez powłoki (/ etc / profile).

Moją strategią jest dodanie modułu ładującego do powyższego pliku:

# Add new directory analog to /etc/profile.d
mkdir /etc/bashrc.d

# Write the loader to /etc/bash.bashrc (it might be /etc/bashrc on as mentioned above)
cat >> /etc/bash.bashrc << 'EOF'
# I appended this: Load scripts from /etc/bashrc.d
if test -d /etc/bashrc.d; then
  for script in /etc/bashrc.d/*.sh; do
    test -r "$script" && . "$script"
  done
  unset item
fi
EOF

Teraz mogę łatwo dodać n dostosowań do globalnego interaktywnego pliku powłoki (bash), umieszczając nowe pliki .sh w katalogu /etc/bashrc.d.

Koloruj Grep na całym świecie

/etc/bashrc.d/grep.sh

alias grep='grep --color=auto'

Możesz to zrobić za pomocą tej linijki:

printf "alias grep=\'grep --color=auto\'" > /etc/bashrc.d/grep.sh

Porównaj profil. D vs bashrc.d

Jeśli po przeczytaniu tego nie będziesz przekonany, zrób to, aby się przekonać:

printf "alias grep=\'grep --color=auto\'" > /etc/profile.d/grep.sh

Otwórz nowy emulator terminala i wyszukaj w katalogu użytkownika kilka popularnych słów, takich jak „the”, używając grep

grep -r 'the'

Nic nie powinno być kolorowe. Zrób to samo w wirtualnej konsoli, wykonując CTRLALTF1 (pamiętaj, że Twój serwer X prawdopodobnie działa na CTRLALTF7, abyś mógł się z powrotem przełączyć. Jeśli zapomnisz, po prostu zrestartuj na przykład menedżera pulpitu)

grep -r 'the' 

da pożądane kolorowe wyniki.

Nic nie powinno być kolorowe. Zrób to samo w wirtualnej konsoli, wykonując tę ​​czynność CTRLALTF1(pamiętaj, że Twój serwer X prawdopodobnie działa CTRLALTF7, abyś mógł się z powrotem przełączyć. Jeśli zapomnisz, po prostu ponownie uruchom na przykład menedżera pulpitu)

grep -r 'the' 

da pożądane kolorowe wyniki.

Powłoka logowania jest dostępna podczas uruchamiania komputera lub przełączania konsol wirtualnych za CTRLALTF1pomocą FNthkonsoli wirtualnej.

Powłoka logowania ładuje się /etc/profilepodczas ładowania /etc/profile.d/*.shplików.

Jonathan Komar
źródło