Вступление
Если я вас правильно понимаю, вы хотите добавить любые каталоги "$X/node_modules/.bin"
где $X
- это $PWD
или любой из его предков.
Сценарий в конце этого поста должен дать желаемое поведение. Вы должны получать его в каждом сеансе, где вы хотите. Если вы назовете файл augment_path.sh
, то добавления этой строки в ваш .bashrc
должно быть достаточно:
source augment_path.sh
обсуждение
Я думаю, что у Гарийона правильный подход, но он ищет всех потомков, а не всех предков.
$PROMPT_COMMAND
позволяет указать команду, которая будет выполняться при каждом отображении приглашения. Я добавил переменную $PROMPT_COMMAND_OLD
чтобы позволить восстановить исходный $PROMPT_COMMAND
Возможно, в этом нет необходимости, но для хорошей формы я добавляю переменную $LAST_WD
и проверяю, чтобы избежать повторного вычисления пути, когда каталог не изменился. Вы можете удалить все три строки, содержащие LAST_WD
если хотите.
Функция augment_path
сканирует от $PWD
выше, ищет целевые каталоги у каждого предка и добавляет все найденные пути к пути.
Они располагаются в пути по порядку, поэтому самый глубокий такой каталог будет иметь приоритет, если возникнут какие-либо конфликты. Я предполагаю, что это желаемое поведение. Если нет, измените
PATH_ADDITION="$PATH_ADDITION:$resolved_target"
в
PATH_ADDITION="$resolved_target:$PATH_ADDITION"
Однако все эти каталоги будут иметь приоритет над остальной частью пути. Если вы хотите, чтобы остаток пути имел приоритет, измените:
PATH="$PATH_ADDITION:$RAW_PATH"
в
PATH="$RAW_PATH:$PATH_ADDITION"
скрипт
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"