Giriş
Seni doğru anladıysam, herhangi dizinleri eklemek istediğiniz olduğu ya da atalarından herhangi."$X/node_modules/.bin"
$X
$PWD
Bu yazının sonundaki komut dosyası istediğiniz davranışı sağlamalıdır. İstediğiniz her oturumda onu kaynaklamanız gerekir. Dosyayı adlandırırsanız augment_path.sh
, bu satırı bilgisayarınıza eklemek .bashrc
yeterli olacaktır:
source augment_path.sh
Tartışma
Sanırım Garyjohn'un temel bir yaklaşımı var, ama atalarından ziyade tüm soyundan geliyor.
$PROMPT_COMMAND
Değişken istemi her gösterildiğinde yürütülecek bir komut girmesini sağlar. $PROMPT_COMMAND_OLD
Orijinalin $PROMPT_COMMAND
geri yüklenmesine izin vermek için bir değişken ekledim
Muhtemelen gerekli değildir, ancak iyi form için $LAST_WD
, dizin değişmediğinde yolu yeniden hesaplamaktan kaçınmak için bir değişken ekleyip test ediyorum . İsterseniz içeren üç satırı da kaldırabilirsiniz LAST_WD
.
augment_path
Dan işlev taramalar $PWD
yukarı her atanın hedef dizinleri arayan ve onu yola bulduğu ekledi.
Yola sıralı olarak yerleştirilirler, bu nedenle herhangi bir çakışma olursa bu kadar derin dizin öncelik kazanacaktır. Bunun istenen davranış olduğunu farz ediyorum. Değilse değiştir
PATH_ADDITION="$PATH_ADDITION:$resolved_target"
için
PATH_ADDITION="$resolved_target:$PATH_ADDITION"
Ancak, bu dizinlerin tümü yolun geri kalanından öncelikli olacaktır. Yolun geri kalanının öncelikli olmasını istiyorsanız, değiştirin:
PATH="$PATH_ADDITION:$RAW_PATH"
için
PATH="$RAW_PATH:$PATH_ADDITION"
Senaryo
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"