Что я заметил, так это то, что когда я добавляю :$PATH к первому PATH, он повторяет весь путь, когда вы echo его.

Например, я использую MANPATH, но то же самое происходит и с переменной PATH.

# I use MANPATH here
export MANPATH="/usr/local/share/man" # Here no :$MANPATH
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
export MANPATH="/usr/local/opt/make/libexec/gnuman:$MANPATH"

Это выводит:

$ echo $MANPATH
/usr/local/opt/make/libexec/gnuman:/usr/local/opt/coreutils/libexec/gnuman:/usr/local/share/man

Но когда я добавляю :$MANPATH к первому:

export MANPATH="/usr/local/share/man:$MANPATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
export MANPATH="/usr/local/opt/make/libexec/gnuman:$MANPATH"

Это выводит:

$ echo $MANPATH
/usr/local/opt/make/libexec/gnuman:/usr/local/opt/coreutils/libexec/gnuman:/usr/local/share/man:/usr/local/opt/make/libexec/gnuman:/usr/local/opt/coreutils/libexec/gnuman:/usr/local/share/man:

Как видите, все MANPATH повторяются.

Итак, мои вопросы:

  1. Должен ли я опустить :$PATH или $MANPATH в конце первой строки?
  2. Почему он повторяет все пути, когда я добавляю его в конец первой строки?
0
shin 14 Мар 2021 в 01:24
Просто комментарий: вам нужен только один export, чтобы сделать переменную оболочки переменной среды. Экспортировать его в каждом задании не нужно. Вам не нужно экспортировать переменные, которые уже являются переменными среды, например PATH (если только вы не unset их).
 – 
Kusalananda
14 Мар 2021 в 14:18

2 ответа

Лучший ответ

Если, когда вы бежите

export MANPATH="/usr/local/share/man:$MANPATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
export MANPATH="/usr/local/opt/make/libexec/gnuman:$MANPATH"

Вы получите содержимое MANPATH

/usr/local/opt/make/libexec/gnuman:/usr/local/opt/coreutils/libexec/gnuman:/usr/local/share/man:/usr/local/opt/make/libexec/gnuman:/usr/local/opt/coreutils/libexec/gnuman:/usr/local/share/man:

Это означает, что MANPATH уже содержит

/usr/local/opt/make/libexec/gnuman:/usr/local/opt/coreutils/libexec/gnuman:/usr/local/share/man:

До первого присваивания (т.е. вы не начали с новой/пустой переменной).

Как вы показываете, foo=bar:$foo означает «объединить строку foo, которая в настоящее время расширяется до« bar », и присвоить результат foo». Вы сбрасываете переменную foo, если начинаете серию назначений с foo=bar; вы расширяете foo, если начинаете с foo=bar:$foo.

Что касается вопроса, заданного в заголовке, следует ли вам использовать foo=bar (сброс) или foo=bar:$foo (расширение), зависит от контекста. Обычно файлы профиля оболочки, которые добавляют пути к PATH, предназначены для запуска только один раз за сеанс пользователя. Более консервативный вариант, который они могут сделать, — это расширить PATH, потому что другие программы могли добавить к нему полезные компоненты перед запуском.

Если сценарий оболочки должен убедиться, что он расширяет переменную среды только один раз, независимо от того, сколько раз он запускается, он должен проверить, содержит ли переменная уже добавляемый компонент. Подробнее об этом см. в разделе Как правильно добавить $PATH?

2
fra-san 14 Мар 2021 в 14:12

Выполнение MANPATH="/path/to/somewhere:$MANPATH" означает "добавить /path/to/somewhere к PATH".
Выполнение MANPATH="/path/to/somewhere" означает "удалить все, что хранит MANPATH, и установить для него значение /path/to/somewhere"
Следует ли вам это делать или нет, зависит от того, хотите ли вы перезаписать или дополнить переменную MANPATH.

1
cajomar 14 Мар 2021 в 01:39