2012-04-05 37 views
5


Nói chung tôi giữ các cài đặt thư mục cụ thể trong .bashrc và bất cứ khi nào tôi thay đổi thư mục thực hiện lệnh source .bashrc để làm cho các cài đặt này có hiệu quả.
Bây giờ tôi đã suy nghĩ về thao tác lệnh cd trong ~/.bashrc, vì vậy bất cứ khi nào tôi cd vào thư mục mới và nếu có .bashrc tồn tại ở đó, nó sẽ được tải tự động.tùy chỉnh lệnh cd

Tương tự như điều này cd $1; source .bashrc (Tôi đã xác minh rằng $ 1 là đường dẫn hợp lệ), nhưng vấn đề là cd là vỏ được xây dựng, do đó, nó là một vòng lặp đệ quy (cd luôn trỏ đến modifed cd). Chúng tôi không có tập tin elf của cd (mà nói chung chúng tôi có các lệnh khác viz scp hoặc những người khác). Vậy làm thế nào tôi có thể đạt được điều này? Ngoài ra nếu shopt -s cdspell được hỗ trợ thì tôi cũng cần có đường dẫn chính tả cd trong đối số $ 1.

+0

Tại sao mọi người đóng nó? Đây có phải là trùng lặp với một số chủ đề khác, tôi không nghĩ như vậy. Hoặc bởi vì những người có danh tiếng 100K hoặc 900K không thể có cơ hội trả lời? – peeyush

Trả lời

6

Bạn muốn lệnh "được tạo sẵn";

BUILTIN vỏ BUILTIN [luận]

Thực hiện xây dựng trong vỏ chỉ định, đi qua nó lập luận, và trở về trạng thái thoát của nó. Điều này rất hữu ích khi xác định một chức năng có tên giống với nội trang hệ vỏ, duy trì chức năng của nội trang dựng sẵn bên trong hàm. Cấu trúc nội bộ cd thường được định nghĩa lại theo cách này. Trạng thái trả về là false nếu shell-builtin không phải là lệnh nội trang hệ vỏ.

Từ: http://linux.die.net/man/1/bash

Vì vậy, bạn có thể có một cái gì đó tương tự (chưa được kiểm tra, không có một bash tiện dụng một trong hai);

function cd() { 
    builtin cd $1 \ 
     && test -e .bashrc \ 
     && source .bashrc 
} 
+0

cool :-). (Tại sao có giới hạn 15 ký tự?) – peeyush

+1

Bạn cần 'test' trước' -e'. – l0b0

+0

Cảm ơn, đã sửa nó. –

0

Bạn có thể thử này:

function cdd(){ cd $1; if [ -e ./.bashrc ] ; then source ./.bashrc; fi; } 
alias cd = 'cdd' 
? 

Không thử nghiệm nhiều này, tuy nhiên.

+0

vấn đề là như nhau, gọi đệ quy đến định nghĩa mới này của cd. – peeyush

+0

Tôi đã thử nghiệm điều này trong các biến thể sau: hàm cdd() { cd $ 1; nếu [-e ./.bashrc]; sau đó lặp lại "Xin chào, ở đó!"; fi } bí danh cd = 'cdd' Sau đó, lời nhắc> cd Xin chào, có – begemotv2718

1

RVM thực hiện điều này:

$ type cd 
cd is a function 
cd() 
{ 
    if builtin cd "[email protected]"; then 
     [[ -n "${rvm_current_rvmrc:-}" && "$*" == "." ]] && rvm_current_rvmrc="" || true; 
     __rvm_do_with_env_before; 
     __rvm_project_rvmrc; 
     __rvm_after_cd; 
     __rvm_do_with_env_after; 
     return 0; 
    else 
     return $?; 
    fi 
} 

Và vâng, này hoạt động trên máy tính của tôi. Về cơ bản, như @RoryHunter đã nói, hãy sử dụng builtin và chạy một số mã nếu thành công hoặc trả lại mã thoát nếu không thành công.

2

Bạn có thể xem direnv. https://github.com/zimbatm/direnv

+0

Một trong những mục tiêu cụ thể khi tôi thiết kế direnv là tránh ghi đè các lệnh dựng sẵn như RVM thực hiện (đã làm?). Thay vào đó direnv phụ thuộc vào các hook shell như PROMPT_COMMAND trong bash để phát hiện các thay đổi thư mục. – zimbatm

Các vấn đề liên quan