Introdução
Se eu entendi corretamente, você deseja adicionar diretórios "$X/node_modules/.bin"
, em que $X
é o $PWD
ou qualquer um de seus ancestrais.
O script no final deste post deve dar o comportamento desejado. Você precisa fonte em todas as sessões onde você quer. Se você nomear o arquivo augment_path.sh
, adicionar essa linha ao seu .bashrc
deve ser suficiente:
source augment_path.sh
Discussão
Eu acho que o garyjohn tem a abordagem básica correta, mas ele está pesquisando todos os descendentes ao invés de todos os ancestrais.
A variável $PROMPT_COMMAND
permite que você especifique um comando a ser executado toda vez que o prompt for exibido. Eu adicionei uma variável $PROMPT_COMMAND_OLD
para permitir que o original $PROMPT_COMMAND
seja restaurado
Provavelmente não é necessário, mas para uma boa forma eu adiciono uma variável $LAST_WD
e testei para evitar recomputar o caminho quando o diretório não foi alterado. Você pode remover todas as três linhas contendo LAST_WD
, se quiser.
A função augment_path
varre de $PWD
para cima, procurando os diretórios de destino em cada ancestral e adicionando qualquer um que encontrar ao caminho.
-
Eles são colocados no caminho na ordem, portanto, o diretório mais profundo terá precedência se houver algum conflito. Eu suponho que este é o comportamento desejado. Se não, mude
PATH_ADDITION="$PATH_ADDITION:$resolved_target"
para
PATH_ADDITION="$resolved_target:$PATH_ADDITION"
-
No entanto, esses diretórios terão precedência sobre o restante do caminho. Se você quiser que o restante do caminho tenha precedência, altere:
PATH="$PATH_ADDITION:$RAW_PATH"
para
PATH="$RAW_PATH:$PATH_ADDITION"
Script
RAW_PATH="$PATH"
LAST_WD='pwd'
augment_path() {
target="node_modules/.bin"
if [ "$PWD" = "$LAST_WD" ]; then return 0; fi;
PATH_ADDITION=""
scandir="$PWD"
until [ "$scandir" = "" ]; do
resolved_target="$scandir"/"$target"
if [ -d "$resolved_target" ]; then
PATH_ADDITION="$PATH_ADDITION:$resolved_target"
fi
scandir="${scandir%/*}"
done
PATH="$PATH_ADDITION:$RAW_PATH"
LAST_WD='pwd'
}
PROMPT_COMMAND_OLD="${PROMPT_COMMAND%; augment_path}"
PROMPT_COMMAND="$PROMPT_COMMAND_OLD; augment_path"