pengantar
Jika saya mengerti Anda benar, Anda ingin menambahkan direktori "$X/node_modules/.bin"
mana $X
adalah $PWD
atau dari nenek moyangnya.
Script di akhir posting ini harus memberikan perilaku yang Anda inginkan. Anda perlu sumber di setiap sesi di mana Anda inginkan. Jika Anda memberi nama file augment_path.sh
, maka menambahkan baris ini ke Anda .bashrc
harus cukup:
source augment_path.sh
Diskusi
Saya pikir garyjohn memiliki pendekatan dasar yang benar, tetapi dia mencari semua keturunan daripada semua leluhur.
The $PROMPT_COMMAND
variabel memungkinkan Anda untuk menentukan perintah yang akan dieksekusi setiap kali prompt ditampilkan. Saya telah menambahkan $PROMPT_COMMAND_OLD
variabel untuk memungkinkan yang asli $PROMPT_COMMAND
dikembalikan
Ini mungkin tidak perlu, tetapi untuk bentuk yang baik saya menambahkan $LAST_WD
variabel dan menguji untuk menghindari mengkompilasi ulang jalur ketika direktori belum berubah. Anda dapat menghapus ketiga baris yang berisi LAST_WD
jika Anda mau.
The augment_path
scan fungsi dari $PWD
atas, mencari direktori target dalam setiap nenek moyang dan menambahkan setiap itu menemukan jalan.
Mereka ditempatkan di jalan secara berurutan, sehingga direktori tersebut yang paling dalam akan diutamakan jika ada konflik. Saya menganggap ini adalah perilaku yang diinginkan. Jika tidak, ubah
PATH_ADDITION="$PATH_ADDITION:$resolved_target"
untuk
PATH_ADDITION="$resolved_target:$PATH_ADDITION"
Namun, direktori ini semua akan diutamakan dari sisa jalan. Jika Anda ingin sisa jalur diutamakan, ubah:
PATH="$PATH_ADDITION:$RAW_PATH"
untuk
PATH="$RAW_PATH:$PATH_ADDITION"
Naskah
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"