Podejrzewam, że twój .bash_profile
lub .bashrc
jest dodanie .rbenv/shims
do ścieżki, i że działa w pewnym momencie przed path_helper
jest wywoływana podczas rozruchu powłoki.
Strona man dla path_helper otwiera:
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.
Zasadniczą kwestią jest to, że narzędzie path_helper ma dodać zawartość do istniejącego ustawienia PATH
, nie je zastąpić. (A w rzeczywistości, co to naprawdę jest prepend zawartość, a nie je dołączyć, który liczy na PATH
zmiennych ...)
Tak więc, jeśli zacznę się z wpisem na moim PATH
ustawienie generowane przez path_helper zapewni, że wejście będzie kontynuowane na wygenerowanym PATH
.
% 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;
Zauważ, że foo
została ujęta w moim ścieżka w ostatnim wierszu, choć zawartość /etc/paths
i /etc/paths.d/*
nie uległy zmianie.
Jednocześnie narzędzie path_helper wydaje się być ostrożne, aby nie tworzyć ścieżek z duplikatami; usuwa zduplikowane wpisy po konkatenacji /etc/paths
i /etc/paths.d/*
i bieżącym PATH
.
Ten ostatni szczegół może być szczególnie mylący, ponieważ może spowodować zmianę kolejności wpisów w porównaniu do oryginalnego ustawienia (!).
Poniżej znajduje się kilka przykładów tego zachowania: Pierwszy przypadek pokazuje usunięcie duplikatu foo
. Drugi i trzeci przypadek ilustrują zmianę kolejności wpisów: wygenerowana PATH jest taka sama w obu przypadkach, ale w trzecim przypadku wpis /usr/bin
został przeniesiony z pomiędzy foo
i bar
z przodu PATH
. (Wydanie tego duplikatu wydaje się być oparte tylko na prostym dopasowywaniu ciągów na parach wpisów, co ilustruje czwarty przypadek poniżej, gdzie ciąg /usr/bin/
pozostaje między foo/
i 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;
Wreszcie, aby dać kredytu w przypadku gdy kredyt jest spowodowane: Podczas gdy wszystkie sekwencje poleceń powyżej są rezultatem moich własnych badań, byłem początkowo inspirowany zajrzeć do zachowania path_helper
po przeczytaniu notatki here , , która wskazała, że path_helper
ponownie używa zmiennej środowiskowej PATH
ustawionej przez proces macierzysty.
Dzięki za wskazanie, że, contra the docs, path_helper * dodaje * ścieżki i usuwa duplikaty. – algal