2

В некоторых из моих окон терминала у меня есть повторяющиеся записи в переменной PATH ; что-то вроде этого:

PATH=/a/b:/c/d:/a/b:/c/d:/e/f:/a/b

Я полагаю, что в некоторых из моих сценариев виноваты такие строки:

PATH=/a/b:$PATH

После поиска того и другого, и снова, PATH становится очень длинным. Это вопрос:

Есть ли команда bash для очистки PATH и подобных переменных env? Это должен быть скрипт bash потому что нельзя выполнить утилиту и ожидать, что она изменит среду вызывающей оболочки.

В приведенном выше примере очищенный PATH должен выглядеть следующим образом:

PATH=/a/b:/c/d:/e/f

2 ответа2

5

Лучше не создавать дубликаты, чем пытаться удалить их потом. Этого легко избежать, используя технику, которую я использую в своем .bashrc для добавления моего личного каталога bin/ :

[ "${PATH#*$HOME/bin:}" == "$PATH" ] && export PATH="$HOME/bin:$PATH"

Я сделал это в то время, когда делал обновления для .bashrc и я хотел перезапустить его без перезапуска оболочки.

Если вы хотите добавить каталог в конец $PATH вам нужно использовать начальное двоеточие:

[ "${PATH#*:$HOME/bin}" == "$PATH" ] && export PATH="$PATH:$HOME/bin"

Вы можете использовать раскрытие параметров, чтобы пройти через PATH и удалить дубликаты, но это будет немного сложно, и вам нужно будет решить, какую позицию следует сохранить. Что-то вроде:

OLDPATH="$PATH"; NEWPATH=""; colon=""
while [ "${OLDPATH#*:}" != "$OLDPATH" ]
do  entry="${OLDPATH%%:*}"; search=":${OLDPATH#*:}:"
    [ "${search#*:$entry:}" == "$search" ] && NEWPATH="$NEWPATH$colon$entry" && colon=:
    OLDPATH="${OLDPATH#*:}"
done
NEWPATH="$NEWPATH:$OLDPATH"
export PATH="$NEWPATH"

После того, как я написал это на лету и проверил, я должен был удалить большинство ошибок, и это должно быть адекватным руководством к тому, что вам нужно будет сделать. Это оставляет последнее вхождение любых дубликатов, где они были бы, если бы вы использовали мой сценарий, чтобы избежать дубликатов в первую очередь. В сценарии его, конечно, нужно вызывать с помощью ./source команда.

0

Microsoft technet решает эту проблему с помощью скрипта Power Shell. Этот скрипт идентифицирует и удаляет повторяющиеся записи из PATH .

Это говорит:

Иногда повторная установка программного обеспечения может добавить повторяющиеся записи в переменную среды PATH. Поскольку переменная окружения имеет жесткое ограничение размера этой переменной, существует вероятность того, что вы можете ограничить ее в течение определенного периода времени. Этот скрипт проверяет переменную среды PATH и удаляет все повторяющиеся записи пути.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .