pengantar
Jika saya mengerti Anda benar, Anda ingin menambahkan direktori "$X/node_modules/.bin"mana $Xadalah $PWDatau 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 .bashrcharus cukup:
source augment_path.sh
Diskusi
Saya pikir garyjohn memiliki pendekatan dasar yang benar, tetapi dia mencari semua keturunan daripada semua leluhur.
The $PROMPT_COMMANDvariabel memungkinkan Anda untuk menentukan perintah yang akan dieksekusi setiap kali prompt ditampilkan. Saya telah menambahkan $PROMPT_COMMAND_OLDvariabel untuk memungkinkan yang asli $PROMPT_COMMANDdikembalikan
Ini mungkin tidak perlu, tetapi untuk bentuk yang baik saya menambahkan $LAST_WDvariabel dan menguji untuk menghindari mengkompilasi ulang jalur ketika direktori belum berubah. Anda dapat menghapus ketiga baris yang berisi LAST_WDjika Anda mau.
The augment_pathscan fungsi dari $PWDatas, 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"