Cách tốt nhất để thực thi một tập lệnh khi vào một thư mục là gì?
Khi tôi chuyển sang một thư mục mới, tôi muốn bash thực thi tập lệnh projectSinstall.bash giống như RVM.
Cách tốt nhất để thực thi một tập lệnh khi vào một thư mục là gì?
Khi tôi chuyển sang một thư mục mới, tôi muốn bash thực thi tập lệnh projectSinstall.bash giống như RVM.
Câu trả lời:
Bạn có thể tạo cd
một hàm (và pop
và pushd
) và làm cho nó phát hiện nếu bạn vào thư mục cụ thể đó.
cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
unset_all_project_settings () {
# do whatever it takes to undo the effect of projectSettings.bash,
# e.g. unset variables, remove PATH elements, etc.
}
chpwd () {
case $PWD in
/some/directory|/some/other/directory) . ./projectSettings.bash;;
*) unset_all_project_settings;;
esac
}
Đừng làm điều này trong các thư mục mà bạn chưa có trong danh sách trắng, bởi vì nó sẽ giúp người khác dễ dàng lừa bạn chạy mã tùy ý - gửi cho bạn một kho lưu trữ, vì vậy bạn giải nén nó, thay đổi vào thư mục mà nó đã tạo và bạn ' Bây giờ đã chạy mã của kẻ tấn công.
Tôi không khuyên bạn nên tiếp cận phương pháp này, vì nó có nghĩa là tập lệnh sẽ được thực thi ngay cả khi bạn vào thư mục đó vì một số lý do không liên quan đến làm việc trên dự án. Tôi đề nghị có một chức năng cụ thể thay đổi thư mục dự án và lấy tập lệnh cài đặt.
myproj () {
cd /some/directory && . ./projectSettings.bash
}
cd
và không có nghi ngờ gì là một cách tốt hơn. Ngay cả khi sử dụng $ PROMPT_COMMAND vẫn tốt hơn!
if [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi
. Điều này là để tránh các vấn đề trong trường hợp bạn làm một cái gì đó PATH = / mytools / bin: $ PATH loại khởi tạo.
direnv có thể là những gì bạn đang tìm kiếm.
Dưới đây là một ví dụ được lấy từ tài liệu chính thức:
$ cd ~/my_project
$ echo ${FOO-nope}
nope
$ echo export FOO=foo > .envrc
.envrc is not allowed
$ direnv allow .
direnv: reloading
direnv: loading .envrc
direnv export: +FOO
$ echo ${FOO-nope}
foo
$ cd ..
direnv: unloading
direnv export: ~PATH
$ echo ${FOO-nope}
nope