добавить подкаталоги в $ PATH в bash с помощью find

В Bash есть специальная переменная PROMPT_COMMAND , содержимое которой выполняется каждый раз после выполнения команды, поэтому вы можете установите его следующим образом:

PROMPT_COMMAND='[[ "$PWD" = /tmp ]] && { alias ll=ls; echo "Remember: ll=ls"; } || { unalias ll 2>/dev/null; }'

С этого момента каждый раз, когда вы будете в каталоге / tmp , будет создан псевдоним ll , а во всех остальных каталогах он будет удален.


Вероятно, более практично будет собрать все ваши псевдонимы и другой материал в одной функции (скажем, makealias ), а все unaliases - в другой функции makeunalias , которую вы можете запустить в зависимости от ваших потребностей. , что-то вроде

PROMPT_COMMAND='[[ "$PWD" = /tmp ]] && makealias || makeunalias 2>/dev/null'

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

3
22.02.2017, 23:26
2 ответа

Поскольку вы пометили Q и присвоили ему название bash , вот решение, которое не требует find вообще - оно использует globstar из bash для рекурсии. каталоги:

PATH=${PATH}$(shopt -s globstar dotglob; printf ":%s" ~/scripts/**/)

Магазин запускается в подоболочке, поэтому они не повлияют на вашу работающую оболочку. В printf встроен bash; Я постарался поставить двоеточие перед % s в строке формата printf, чтобы в конце не было непреднамеренно пустой строки пути (эквивалентно добавлению . на ваш ПУТЬ).

0
27.01.2020, 21:18

Сделайте это для оболочки bash или dash:

PATH=$PATH$(find $HOME/scripts/ -type d -exec printf ":%s" {} +)

Кроме того, если вы хотите использовать оболочку Fish, вы можете сделать это:

set -x PATH $PATH (find $HOME/scripts/ -type d -exec printf ":%s" \{\} +)
4
27.01.2020, 21:18

Теги

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