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"
Saya pikir memasukkan hal berikut ke dalam
~/.bashrc
kehendak Anda melakukan apa yang Anda inginkan.Jika variabel lingkungan bash
PROMPT_COMMAND
diatur ke beberapa perintah, perintah itu dijalankan sebelum bash menampilkan prompt utama.Dalam kode di bawah ini,
PROMPT_COMMAND
diatur ke nama fungsidoit
,. Fungsi itu memeriksa apakah direktori kerja saat ini telah berubah dan jika demikian pertama-tama setPATH
ke nilai aslinya, kemudian memeriksa keberadaan subdirektori bernamanode_modules/.bin
. Jika subdirektori itu ada, fungsi menambahkan nama-nama itu dan semua subdirektori di bawahnyaPATH
.sumber
-printf
sana. Selain itu saya pikir itu akan berhasil ...-printf ':%p'
dengan-exec echo -n :{} \;
tampaknya berfungsi juga, tetapi tidak semuaecho
memiliki-n
dan saya tidak memiliki akses ke Mac saat ini. Jika Andaecho
tidak memiliki-n
atau yang setara, Anda dapat menghilangkan-n
dan ikutifind
dengan| tr -d '\n'
untuk menghapus baris baru.-n
sepertinya berhasil. Ini berfungsi hampir seperti yang saya inginkan, tetapi tidak bekerja secara rekursif dari direktori paling dalam ke atas atau apakah saya salah melakukannya? Katakan saya masukfoo/bar/baz
daripada tidak/foo/bar/baz/node_modules/.bin
dan/foo/node_modules/.bin
ditambahkan.Anda dapat bekerja dengan bash
PROMPT_COMMAND
:Perintah itu dijalankan setiap kali ketika prompt muncul. Oleh karena itu, setiap kali ketika perintah selesai,
PATH
variabel diubah. Direktori tambahan ditambahkan ke bagian akhir.Jika tidak ada direktori
./node_modules/.bin
di direktori kerja saat ini, jalur tetap ditambahkan. Tapi, itu bukan masalah. Itu tidak dicari melalui (karena tidak ada).Lihat demonstrasi:
sumber
foo/bar/baz
daripada tidak/foo/bar/baz/node_modules/.bin
dan/foo/node_modules/.bin
ditambahkan../node_modules/.bin
dan../../node_modules/.bin
? Jika ya, gunakan ituPROMPT_COMMAND='[ -z "$X" ] && X=$PATH; PATH=$X:$(pwd)/node_modules/.bin:$(pwd)/../../node_modules/.bin'
. Jika akan terlihat agak aneh saya$PATH
variabel tetapi harus bekerja, seperti yang diinginkan.../../
bagian itu hardcoded. Maaf, saya seharusnya mengatakan bahwa/foo/bar/baz
contoh saya hanyalah satu contoh. Itu benar-benar bisa menjadi salah struktur direktori. Saya akan mencoba jawaban @pyrocrasty sekarang.