Ответ 1
Я подозреваю, что ваш .bash_profile
или .bashrc
добавляет
.rbenv/shims
для вашей PATH, и это работает в какой-то момент раньше
path_helper
вызывается во время запуска оболочки.
Страница man для path_helper открывается с помощью
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.
Важнейшим моментом здесь является то, что утилита path_helper предназначена для
добавьте содержимое в существующий параметр PATH
, а не замените их. (И в
актуальность, то, что она действительно делает, - это добавить содержимое, а не добавлять их,
что имеет значение для переменных PATH
...)
Итак, если я начну с записи на моем PATH
, параметр, сгенерированный
path_helper гарантирует, что запись будет продолжаться в 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;
Обратите внимание, что foo
был включен в мою PATH в последней строке, хотя
содержимое /etc/paths
и /etc/paths.d/*
не изменилось.
В то же время утилита path_helper также, похоже,
для создания путей с дублирующимися записями; он удаляет повторяющиеся записи
после конкатенации /etc/paths
и /etc/paths.d/*
, а ток
PATH
.
Эта последняя деталь может быть особенно запутанной, поскольку она может вызвать (по умолчанию).
Ниже приведены некоторые примеры такого поведения: первый случай показывает удаление дубликата foo
. Второй и третий случай иллюстрируют переупорядочение записи: генерируемый PATH в обоих случаях одинаковый, но в третьем случае запись /usr/bin
была перемещена из промежуточных foo
и bar
в начало PATH
. (Это удаление дубликатов-ссылок, по-видимому, основано на простом сопоставлении строк по парам записей, как показано в четвертом случае ниже, где строка /usr/bin/
остается между foo/
и 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;
Наконец, чтобы дать кредит, где должен быть кредит:
Хотя все приведенные выше последовательности команд являются результатом моих собственных исследований, мне изначально было предложено изучить поведение path_helper
после прочтения примечания здесь,
в котором указано, что path_helper
повторно использует переменную среды PATH
, заданную родительским процессом.