Дублирующиеся записи в $PATH проблема?

Bash не может сделать этого легко. Необходимо было бы в основном получить список всех файлов в папке и периодически получать новый список и сравнивать их для наблюдения то, что изменяется.

То, что Вы ищете, называют inotify. Его встроенный в ядро Linux и можно в основном сидеть, там ожидая, что что-то произойдет, в котором точка inotify возвращается и говорит 'эй, существует новый файл, названный foobar'

Для выполнения, что Вы хотите, необходимо было бы переключиться на что-то как жемчуг и использовать Linux:: Inotify2 (Python, вероятно, поддерживает inotify также, но я - человек жемчуга).

49
13.06.2011, 11:05
5 ответов

Наличие большего количества записей в $PATH не делает непосредственно медленный Ваш запуск, но он действительно замедляет каждый раз Вас первый показ конкретная команда на сессии оболочки (не каждый раз, когда Вы выполняете команду, потому что удар поддерживает кэш). Замедление редко заметно, если у Вас нет особенно медленной файловой системы (например, NFS, Samba или другая сетевая файловая система, или на Cygwin).

Дублирующиеся записи являются также небольшим раздражением при рассмотрении Вашего $PATH визуально, необходимо пробраться через большее количество хлама.

Достаточно легко постараться не добавлять дублирующиеся записи.

case ":$PATH:" in
  *":$new_entry:"*) :;; # already there
  *) PATH="$new_entry:$PATH";; # or PATH="$PATH:$new_entry"
esac

Примечание стороны: определение источника чужого сценария оболочки означает выполнять код, что он записан. Другими словами, Вы предоставляете своих друзей доступ к Вашей учетной записи каждый раз, когда они хотят.

Примечание стороны: .bashrc правильное место не должно устанавливать $PATH или любая другая переменная среды. Переменные среды должны быть установлены в ~/.profile. Посмотрите, Какие файлы настройки должны использоваться для установки переменных среды с ударом?, Различие между .bashrc и .bash_profile.

48
27.01.2020, 19:33
  • 1
    +1: не может подчеркнуть что "предоставление Ваших друзей доступ к Вашей учетной записи" достаточно акцента. Даже если нет никакой попытки причинения Вам вред, их сценарий мог бы быть, что они нуждаются и все еще едят Ваш ланч, когда Вы получаете его. самый быстрый –  msw 13.06.2011, 14:41

Я видел, что люди очищают дубликаты от своего использования переменной ПУТИ awk и что-то вроде этого:

PATH=$(printf "%s" "$PATH" | awk -v RS=':' '!a[$1]++ { if (NR > 1) printf RS; printf $1 }')

Вы могли попытаться добавить, что к Вашему собственному bashrc и удостоверяются, что Вы получаете другие файлы где-нибудь прежде, чем выполнить это.

Альтернатива должна была бы использовать pathmerge утилита.

Что касается Вашей проблемы скорости, это не будет влиять на время запуска оболочки никаким значительным способом, но это может сохранить заполнение клавишей Tab выполнения некоторого времени для команд, особенно когда команда не найдена в пути, и это делает повторенный, перерывает те же папки, ища его.

Примечание по безопасности: необходимо действительно учесть предупреждения Gilles о безопасности здесь. Путем определения источника файла, принадлежавшего другому пользователю, Вы даете свободную передачу тем пользователям для выполнения их собственного кода как пользователь каждый раз, когда Вы запускаете оболочку. Если Вы не доверяете тем пользователям свой пароль, Вы не должны получать их файлы оболочки.

31
27.01.2020, 19:33
  • 1
    мне нравится awk острота, но это печатает запаздывание ORS ':'. Таким образом, я изменил его для чтения PATH=$(echo "$PATH" | awk -v RS=':' -v ORS=":" '!a[$1]++{if (NR > 1) printf ORS; printf $a[$1]}') –  gkb0986 18.09.2013, 09:01
  • 2
    запаздывание : не только косметическая проблема. Это совпадает с добавлением . к Вашему пути, который потенциально опасен. –  wisbucky 25.04.2017, 02:31
  • 3
    , я отредактировал ответ для включения фиксации от gkb0986. –  Tim Lesher 19.01.2018, 15:24
  • 4
    @TimLesher, которым причина, которая я никогда не редактировал, чем в ответом, состоит в том, что это не работает на меня.... и оригинал без него, работает (включая не отъезд запаздывающего разделителя. Я не знаю, каково различие. –  Caleb 19.01.2018, 16:07

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

Отвечать на Ваш вопрос: это не должно быть причиной медленного запуска.

2
27.01.2020, 19:33
  • 1
    Но это занимает больше времени, когда я ввожу команду, которая не существует. Это будет искать ту же папку дважды команду. –  balki 13.06.2011, 11:50
  • 2
    @balki Вы означаете завершать команду с TAB? В этом случае необходимо проверить, завершаетесь ли Вы, определение не похоже complete -c which -a. Необходимо удалить -a параметр. Можно проверить что путем выдачи команды: complete | grep which. –  Rajish 13.06.2011, 12:34
  • 3
    Это могла все еще быть проблема, если это ищет тот же каталог, что это не находится в многократно прежде, чем найти его. –  Random832 13.06.2011, 16:44

На основе ответа @Gilles вы можете обернуть его функцией, чтобы минимизировать набор текста:

function addToPATH {
  case ":$PATH:" in
    *":$1:"*) :;; # already there
    *) PATH="$1:$PATH";; # or PATH="$PATH:$1"
  esac
}

addToPATH /Applications/AIRSDK_Compiler/bin
addToPATH ~/.local/lib/npm/bin
14
27.01.2020, 19:33

Чтобы предотвратить дублирование записей в моем PATH, мне пришлось поместить следующее в ОБА профиль ~/.bash _и ~/.bashrc:

PATH=$(echo $(sed 's/:/\n/g' <<< $PATH | sort | uniq) | sed -e 's/\s/':'/g')

Главный недостаток заключается в том, что он сортирует записи PATH, но я думаю, что с этим можно смириться.

-1
27.01.2020, 19:33

Теги

Похожие вопросы