Bash не может сделать этого легко. Необходимо было бы в основном получить список всех файлов в папке и периодически получать новый список и сравнивать их для наблюдения то, что изменяется.
То, что Вы ищете, называют inotify. Его встроенный в ядро Linux и можно в основном сидеть, там ожидая, что что-то произойдет, в котором точка inotify возвращается и говорит 'эй, существует новый файл, названный foobar'
Для выполнения, что Вы хотите, необходимо было бы переключиться на что-то как жемчуг и использовать Linux:: Inotify2 (Python, вероятно, поддерживает inotify также, но я - человек жемчуга).
Наличие большего количества записей в $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.
Я видел, что люди очищают дубликаты от своего использования переменной ПУТИ awk
и что-то вроде этого:
PATH=$(printf "%s" "$PATH" | awk -v RS=':' '!a[$1]++ { if (NR > 1) printf RS; printf $1 }')
Вы могли попытаться добавить, что к Вашему собственному bashrc и удостоверяются, что Вы получаете другие файлы где-нибудь прежде, чем выполнить это.
Альтернатива должна была бы использовать pathmerge
утилита.
Что касается Вашей проблемы скорости, это не будет влиять на время запуска оболочки никаким значительным способом, но это может сохранить заполнение клавишей Tab выполнения некоторого времени для команд, особенно когда команда не найдена в пути, и это делает повторенный, перерывает те же папки, ища его.
Примечание по безопасности: необходимо действительно учесть предупреждения Gilles о безопасности здесь. Путем определения источника файла, принадлежавшего другому пользователю, Вы даете свободную передачу тем пользователям для выполнения их собственного кода как пользователь каждый раз, когда Вы запускаете оболочку. Если Вы не доверяете тем пользователям свой пароль, Вы не должны получать их файлы оболочки.
PATH=$(echo "$PATH" | awk -v RS=':' -v ORS=":" '!a[$1]++{if (NR > 1) printf ORS; printf $a[$1]}')
– gkb0986
18.09.2013, 09:01
:
не только косметическая проблема. Это совпадает с добавлением .
к Вашему пути, который потенциально опасен.
– wisbucky
25.04.2017, 02:31
Только первое соответствие в $PATH
выполняется, таким образом, любые последующие записи не обрабатываются после этого. Вот почему необходимо иногда пересматривать порядок записей в Вашем $PATH
заставить Вашу среду вести себя как ожидалось.
Отвечать на Ваш вопрос: это не должно быть причиной медленного запуска.
TAB
? В этом случае необходимо проверить, завершаетесь ли Вы, определение не похоже complete -c which -a
. Необходимо удалить -a
параметр. Можно проверить что путем выдачи команды: complete | grep which
.
– Rajish
13.06.2011, 12:34
На основе ответа @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
Чтобы предотвратить дублирование записей в моем PATH, мне пришлось поместить следующее в ОБА профиль ~/.bash _и ~/.bashrc:
PATH=$(echo $(sed 's/:/\n/g' <<< $PATH | sort | uniq) | sed -e 's/\s/':'/g')
Главный недостаток заключается в том, что он сортирует записи PATH, но я думаю, что с этим можно смириться.