2010-07-29 31 views
16

Tôi muốn thực hiện một hàm bash cụ thể khi tôi nhập một thư mục mới. Somethink like:Thực hiện một hàm bash khi nhập một thư mục

alias cd="cd [email protected] && myfunction" 

[email protected] không hoạt động ở đó và thêm dấu gạch chéo ngược không có tác dụng. Tôi cũng có một chút lo lắng về việc rối tung với cd, và nó sẽ rất tuyệt nếu nó làm việc cho các lệnh khác đã thay đổi thư mục, như pushdpopd.

Mọi bí danh/lệnh tốt hơn?

Trả lời

17

Giải pháp đơn giản nhất tôi có thể đưa ra là thế này

myfunction() { 
    if [ "$PWD" != "$MYOLDPWD" ]; then 
    MYOLDPWD="$PWD"; 
    # strut yer stuff here.. 
    fi 
} 

export PROMPT_COMMAND=myfunction 

Đó phải làm điều đó. Nó sẽ làm việc với tất cả các lệnh và sẽ được kích hoạt trước khi lời nhắc được hiển thị.

+1

Chỉ cần thêm 'printf" \ e] 1; $ PWD \ a "' và bam (!), Tên tab được đổi thành pwd. – Fadi

+0

@Fadi trong khi thực sự, hầu hết mọi người chỉ cần thêm một chuỗi thoát vào dấu nhắc cho chính nó, nó không thực sự quan trọng mà nó được cập nhật với mọi lời nhắc (thay vì chỉ khi thay đổi thư mục), vì nó sẽ không đáng chú ý. – falstro

2

Tôi đã viết tập lệnh ZSH sử dụng chức năng gọi lại chpwd cho các cấu hình ZSH nguồn dự án cụ thể. Tôi không chắc liệu nó có hoạt động với Bash hay không, nhưng tôi nghĩ nó sẽ đáng để thử. Nếu nó không tìm thấy một tập tin kịch bản trong thư mục bạn đang cd'ing vào, nó sẽ kiểm tra các thư mục mẹ cho đến khi nó tìm thấy một kịch bản nguồn (hoặc cho đến khi nó đạt đến /). Nó cũng gọi một hàm unmagic khi cd'ing ra khỏi thư mục, cho phép bạn dọn dẹp môi trường của mình khi rời khỏi một dự án.

http://github.com/jkramer/home/blob/master/.zsh/func/magic

Ví dụ cho một "ma thuật" kịch bản:

export BASE=$PWD # needed for another script of mine that allows you to cd into the projects base directory by pressing ^b 

ctags -R --languages=Perl $PWD # update ctags file when entering the project directory 

export PERL5LIB="$BASE/lib" 

# function that starts the catalyst server 
function srv { 
    perl $BASE/script/${PROJECT_NAME}_server.pl 
} 

# clean up 
function unmagic { 
    unfunction src 
    unset PERL5LIB 
} 
+0

Có vẻ như không phải là một. –

16

biệt hiệu không chấp nhận các thông số. Bạn nên sử dụng một hàm. Không cần phải thực thi nó tự động mỗi khi có lời nhắc.

function cd() { builtin cd "[email protected]" && myfunction; } 

Từ khóa builtin cho phép bạn xác định lại nội dung Bash mà không tạo đệ quy. Trích dẫn tham số làm cho nó hoạt động trong trường hợp có khoảng trắng trong tên thư mục.

Các Bash docs nói:

Đối với hầu hết các mục đích, chức năng vỏ được ưa thích hơn bí danh.

+0

nó không bao gồm mối quan tâm của mình về pushd, popd vv; và tạo ra một hàm cho mọi trường hợp làm cho nó có lẽ phức tạp hơn lệnh nhắc. – falstro

6

Có một vài phiên bản khác của việc này trên mạng, bao gồm

  • smartcd, mà tôi đã viết, và có nhiều tính năng bao gồm khuôn mẫu và biến tạm thời tiết kiệm
  • ondir, đó là nhỏ hơn và đơn giản hơn nhiều

Cả hai hỗ trợ cả bash và zsh

+0

Ồ, người đàn ông, smartcd đó trông rất ngon! – mihai

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