Ho il sospetto che il vostro .bash_profile
o .bashrc
è l'aggiunta di .rbenv/shims
al PATH, e che è in esecuzione ad un certo punto, prima path_helper
viene richiamato durante il guscio di start-up.
La pagina man per path_helper si apre con:
The path_helper utility reads the contents of the files in the directo-
ries /etc/paths.d and /etc/manpaths.d and appends their contents to the
PATH and MANPATH environment variables respectively.
Il punto cruciale è che l'utilità path_helper ha lo scopo di aggiungere contenuti a un PATH
impostazione esistente, non sostituirli. (E in realtà, ciò che realmente fa è prepend contenuti, non li aggiungere, che conta per PATH
variabili ...)
Quindi, se mi metto fuori con una voce sul mio PATH
, ha generato l'impostazione by path_helper farà in modo che la voce continui sul PATH
che genera.
% echo $SHELL
/bin/bash
% uname
Darwin
% /usr/libexec/path_helper
PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin"; export PATH;
% PATH="" /usr/libexec/path_helper
PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin"; export PATH;
% PATH=foo /usr/libexec/path_helper
PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:foo"; export PATH;
Nota che foo
è stato incluso nel mio percorso nell'ultima riga, anche se il contenuto di /etc/paths
e /etc/paths.d/*
non sono cambiate.
Allo stesso tempo, anche l'utilità path_helper sembra fare attenzione a non produrre percorsi con voci duplicate; rimuove le voci duplicate dopo aver concatenato /etc/paths
e /etc/paths.d/*
e l'attuale PATH
.
Quest'ultimo dettaglio può essere particolarmente confuso poiché può causare il riordino delle voci rispetto all'impostazione originale PATH
(!).
Di seguito sono riportati alcuni esempi di questo comportamento: Il primo caso mostra un duplicato foo
rimosso. Il secondo e il terzo caso illustrano il riordino della voce: il PATH generato è lo stesso in entrambi i casi, ma nel terzo caso la voce /usr/bin
è stata spostata da foo
e bar
nella parte anteriore dello PATH
. (Questa rimozione di voci duplicate sembra essere basata sulla semplice corrispondenza di stringhe sulle coppie di voci, come illustrato dal quarto caso in basso in cui la stringa /usr/bin/
rimane compresa tra foo/
e bar
.)
% PATH=foo:foo /usr/libexec/path_helper
PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:foo"; export PATH;
% PATH=foo:bar /usr/libexec/path_helper
PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:foo:bar"; export PATH;
% PATH=foo:/usr/bin:bar /usr/libexec/path_helper
PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:foo:bar"; export PATH;
% PATH=foo/:/usr/bin/:bar /usr/libexec/path_helper
PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:foo/:/usr/bin/:bar"; export PATH;
Infine, per dare credito quando il credito è dovuto: Mentre tutti le sequenze di comando di cui sopra sono il risultato delle mie ricerche, mi è stato originariamente ispirato a esaminare il comportamento di path_helper
dopo aver letto la nota here , che ha evidenziato che path_helper
riutilizza la variabile di ambiente PATH
impostata dal processo padre.
Grazie per aver sottolineato che, contrariamente ai documenti, path_helper * antepone * i percorsi e rimuove i duplicati. – algal