В 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 присутствует только для предотвращения некоторых бесполезных в этом случае предупреждений.
Поскольку вы пометили Q и присвоили ему название bash
, вот решение, которое не требует find
вообще - оно использует globstar из bash для рекурсии. каталоги:
PATH=${PATH}$(shopt -s globstar dotglob; printf ":%s" ~/scripts/**/)
Магазин запускается в подоболочке, поэтому они не повлияют на вашу работающую оболочку. В printf
встроен bash; Я постарался поставить двоеточие перед % s
в строке формата printf, чтобы в конце не было непреднамеренно пустой строки пути (эквивалентно добавлению .
на ваш ПУТЬ).
Сделайте это для оболочки 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" \{\} +)