Come è costruita la mia variabile $ PATH in Mountain Lion?

5

Ho recentemente installato Homebrew sul mio Mac e si lamenta che /usr/bin si verifica prima di /usr/local/bin nella mia $PATH variabile, il che significa che i programmi forniti dal sistema verranno utilizzati al posto di quelli installati con Homebrew.

Il mio .bashrc è configurato in un insieme di file separati, come da questo screencast . Ciò significa che ~/.bash_profile assomiglia a questo:

if [ -f ~/.bashrc ];
then
  source ~/.bashrc
fi

~/.bashrc assomiglia a questo:

source ~/bin/dotfiles/bashrc

e ~/bin/dotfiles/bashrc assomiglia a questo:

. ~/bin/dotfiles/bash/env
. ~/bin/dotfiles/bash/config
. ~/bin/dotfiles/bash/aliases

~/bin/dotfiles/bash/env , che è dove ho impostato la mia variabile $PATH , assomiglia a questo:

export EDITOR="kom"
export PATH=some/path/at/start:usr/local/bin:/Users/jim/pear/bin:~/bin:/Users/jim/.gem/ruby/1.8/bin:/Users/jim/bin/bashscripts:some/path/at/end:$PATH

Ho aggiunto some/path/at/start e some/path/at/end a scopo di debug, dal momento che quando provo echo $PATH ottengo questo:

/opt/local/bin:/opt/local/sbin:/Users/jim/bin:/opt/local/bin:/opt/local/sbin:some/path/at/start:usr/local/bin:/Users/jim/pear/bin:/Users/jim/bin:/Users/jim/.gem/ruby/1.8/bin:/Users/jim/bin/bashscripts:some/path/at/end:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

Cioè, c'è un carico di altre cose che vengono caricate nella variabile $ PATH che non posso controllare nella configurazione che ho delineato sopra. Qualche idea su dove questa roba viene caricata, in modo che possa andare a cambiarlo e spostare /usr/local/bin prima di /usr/bin ?

    
posta Jim 17.09.2012 - 16:49
fonte

3 risposte

2

Se correggi l'errore nel tuo PATH assignment e sostituisci usr/local/bin con /usr/local/bin Homebrew dovrebbe smettere di lamentarti.

Le altre cose ( /opt/local/... ) vengono aggiunte definitivamente da qualche parte più avanti durante l'inizializzazione della shell (ovvero dopo source ~/.bashrc o dopo . ~/bin/dotfiles/bash/env ). Dovrai esaminare i diversi file (o grep per /opt/local o PATH.*PATH ) per vedere dove accade (e perché).

    
risposta data 17.09.2012 - 16:54
fonte
2

La sezione INVOCAZIONE della pagina man di bash dice

When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable.

Di particolare interesse è /etc/profile , che usa path_helper per costruire un percorso da ciò che trova in /etc/paths e /etc/paths.d/* .

    
risposta data 17.09.2012 - 20:58
fonte
1

C'è anche il bashrc di sistema, che si trova in / etc / bashrc, e un altro paio.

Da man bash : -

FILES
       /bin/bash
              The bash executable
       /etc/profile
              The systemwide initialization file, executed for login shells
       ~/.bash_profile
              The personal initialization file, executed for login shells
       ~/.bashrc
              The individual per-interactive-shell startup file
       ~/.bash_logout
              The individual login shell cleanup file, executed when a login shell exits
       ~/.inputrc
              Individual readline initialization file
    
risposta data 17.09.2012 - 20:04
fonte

Leggi altre domande sui tag