Thực thi các tập lệnh bash khi vào một thư mục


40

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.


2
Vào mỗi thư mục, hoặc những người được chọn? Và cùng một kịch bản cho mỗi, hay không?
enzotib

Mỗi thư mục. Tập lệnh trong thư mục có tên projectSinstall.bash nếu nó tồn tại.
MageProspero

Câu trả lời:


46

Bạn có thể tạo cdmột hàm (và poppushd) 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
}

1
Tôi chỉ bắt đầu ở Ruby một lúc trước. Công cụ RVM tho hoàn toàn bằng Bash và là một trong những phần hay nhất của phép thuật Bash mà tôi đã thấy. Tôi nghĩ rằng câu trả lời là một chút ngớ ngẩn bởi vì một trong những điều hoàn toàn tồi tệ hơn bạn có thể làm là vượt qua một cái gì đó như thế cdvà 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!
MageProspero

3
Tôi đã hoàn toàn sai và xin lỗi. RVM đã quá tải cd.
MageProspero

5
(đã xóa một số nội dung pro / anti-Ruby tiếp tuyến khỏi chuỗi nhận xét này)
Michael Mrozek

1
trong projectSinstall.bash Tôi khuyên bạn nên thêm một biến cờ để không lặp lại việc khởi tạo trong trường hợp bạn thoát / nhập lại thư mục. Vì vậy, bao gồm tất cả mọi thứ trong 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.
nhện

5
@spider Thay vào đó nên có một số loại cơ chế hủy đặt nếu bạn rời khỏi thư mục. Nếu bạn rời đi và nhập lại, bạn sẽ lấy lại các cài đặt!
Gilles 'SO- ngừng trở nên xấu xa'

0

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.