Bash_profile globale


20

Mi rendo conto che ci sono /etc/profilee /etc/bashrcfile per l'impostazione delle variabili di ambiente globali e forse sto solo fraintendendo i loro scopi, ma ...

C'è un bash_profilefile globale ?

Sto usando Mac OS X.

Risposte:


15

Non si chiama bash_profile, ma è il posto standard per la configurazione bash globale /etc/bash.bashrc. È normale chiamarlo da /etc/profilese la shell è bash. Ad esempio, nel mio /etc/profileho:

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

In termini di utilizzo, /etc/profilefornisce una configurazione a livello di sistema per tutte le shell compatibili con Bourne (sh, bash, ksh, ecc.). Normalmente non è necessario un equivalente /etc/bash_profile, poiché l'intenzione del file di profilo è controllare il comportamento delle shell di accesso. Normalmente qualsiasi cosa tu voglia fare lì non sarà specifica per la bash. /etc/bash.bashrcè specifico per bash e verrà eseguito per shell di login e non login.

Per complicare ulteriormente le cose, sembra che OS X non ne abbia nemmeno uno /etc/bash.bashrc. Ciò è probabilmente dovuto al fatto che i Terminali in OS X funzionano come shell di login , quindi la distinzione viene persa:

Un'eccezione alle linee guida della finestra del terminale è Terminal.app di Mac OS X, che per impostazione predefinita esegue una shell di accesso per ogni nuova finestra del terminale, chiamando .bash_profile anziché .bashrc. Altri emulatori di terminali GUI possono fare lo stesso, ma la maggior parte tende a non farlo.

Non eseguo OS X, quindi la portata delle mie conoscenze finisce qui.


Non leggere /etc/bash.bashrcda una shell non interattiva. /etc/profilepuò essere letto da una shell non interattiva. Vedi la differenza tra Shell di accesso e Shell non di accesso?
Gilles 'SO- smetti di essere malvagio' il

@Gilles - Non sono chiaro quale punto stai cercando di chiarire qui. Una shell di login non interattiva è davvero una cosa insolita. Per riferimento, il codice che cito non è una mia creazione. È di default /etc/profilein Ubuntu 12.04. Cosa suggeriresti invece se si volesse uno /etc/profileche è stato eseguito solo sotto bash e nessun'altra shell sh-compatibile?
ire_and_curses il

Il sistema /etc/profiledi file per il mio sistema contiene un commento in alto che recita: # System-wide .profile for sh(1). Questo significa che profileè shspecifico? In shqualche modo viene eseguito prima bash?

@Josh Voigts - shè un sottoinsieme di bash. /etc/profileviene eseguito per sh, bashe per tutte le altre shell compatibili con Bourne.
ire_and_curses,

@ire_and_curses Sembra che il file sia chiamato /etc/bashrcsul Mac, no /etc/bash.bashrc. Sembra anche funzionare anche per /bin/sh.
BrainStorm.exe


0

Installazione di Interactive Shell (Bash) a livello globale

Questo non viene caricato /etc/profile, quindi non /etc/profile.d/viene caricato nulla (a differenza delle shell di login, vedere la fine).

Il file globale per questo è / etc / bashrc o /etc/bash.bashrc (a seconda del -DSYS_BASHRC=flag impostato al momento della compilazione):

# 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"

Di solito è una buona idea lasciare questo file così com'è (per quanto possibile) per evitare conflitti. La strategia che uso è simile a quella utilizzata dalle shell di login (/ etc / profile).

La mia strategia è di aggiungere un caricatore al file sopra:

# 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

Ora posso facilmente aggiungere n personalizzazioni al file shell interattivo globale (bash) inserendo nuovi file .sh nella directory /etc/bashrc.d.

Colora Grep globalmente

/etc/bashrc.d/grep.sh

alias grep='grep --color=auto'

Puoi farlo con questo one-liner:

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

Confronta profile.d vs bashrc.d

Se, dopo aver letto questo, non sei convinto, fallo per convincerti:

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

Apri un nuovo emulatore di terminale e cerca una parola comune nella tua directory utente come "the" usando grep

grep -r 'the'

Niente dovrebbe essere colorato. Fai la stessa cosa in una console virtuale facendo CTRLALTF1 (ricorda che probabilmente il tuo server X è in esecuzione su CTRLALTF7 in modo da poter tornare indietro. Se dimentichi, riavvia il desktop manager, ad esempio)

grep -r 'the' 

produrrà risultati colorati come desiderato.

Niente dovrebbe essere colorato. Fai la stessa cosa in una console virtuale CTRLALTF1(ricorda che probabilmente il tuo server X è in esecuzione in CTRLALTF7modo da poter tornare indietro. Se dimentichi, riavvia il desktop manager, ad esempio)

grep -r 'the' 

produrrà risultati colorati come desiderato.

Una shell di accesso è ciò che ottieni quando avvii una macchina o cambi console virtuali CTRLALTF1tramite FNthla console virtuale.

Una Shell di accesso si carica /etc/profilementre carica i /etc/profile.d/*.shfile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.