2013-01-23 29 views
5

Tôi làm việc trong môi trường Linux nơi cần phải tải các mô-đun nhất định cho các khu vực làm việc khác nhau. Chúng được phân cách bởi các thư mục hệ thống tệp riêng lẻ.Thiết bị đầu cuối Linux: Chạy lệnh khi thay đổi thư mục

Tôi tự hỏi nếu có một cách dễ dàng để chạy các lệnh 1 dòng khác nhau khi nhập thư mục. Tôi linh hoạt với loại vỏ được sử dụng, nhưng hiện đang sử dụng C Shell.

Trả lời

6

Nếu bạn đang sử dụng bash, tôi sẽ khuyên bạn để tạo một chức năng như sau:

function custom_cd() { custom_command $1; cd $1; } 
alias cd='custom_cd' 

Tại đây, lệnh tùy chỉnh của bạn có thể là bất kỳ điều gì sẽ thực thi các lệnh cụ thể theo vào thư mục bạn nhập.

Bí danh được khai báo sau đó đảm bảo rằng nhập 'cd' sẽ gọi hàm và lệnh cd thực.

chỉnh sửa: Một ví dụ cho nhu cầu của bạn

function custom_cd() { 
    if [ -z "$1" ]; 
    then 
     target=~ 
    else 
     target=$1 
    fi 
    target=${target%/} 
    parent=$(dirname `readlink -f $target`) 
    grand_parent=`dirname $parent` 
    script=$grand_parent/`basename $target`.sh 
    if [ -x $script ]; 
    then 
     `$script` 
    fi 
    cd $1 
} 

Giải thích:

Chúng tôi tạo ra một biến chứa phụ huynh của thư mục bạn muốn nhập. Sau đó, chúng tôi truy xuất cha mẹ của phụ huynh. Sau đó, chúng tôi tạo tên tập lệnh trong thư mục ông bà.

Sau đó, khả năng thực thi của tên tệp này được chọn, nếu có, tập lệnh được thực hiện và cuối cùng lệnh cd thực được thực hiện.

Hãy cẩn thận để xác định hàm trước bí danh, nếu không nó sẽ gây ra một đệ quy vô hạn!

+1

Vì sự an toàn, trong hàm sử dụng 'builtin cd' để đảm bảo bạn không nhấn bí danh. Trong thực tế, nếu bạn sử dụng lệnh "nội trang", bạn không cần bí danh, bạn có thể đặt tên hàm là "cd". –

+1

@glennjackman không biết về nội trang, tôi nghi ngờ một cái gì đó như thế này tồn tại, tốt đẹp! – SirDarius

+0

Điều này làm việc tuyệt vời. Tôi đã thực hiện một cái gì đó trong phong cách này chuyển sang C shell nhưng cũng sẽ tạo một phiên bản Bash. Cảm ơn! – devshans

2

một câu hỏi khá mơ hồ, nhưng tôi nghĩ rằng lệnh alias có thể giúp bạn:

alias cd='echo "hello $1"' 

này sẽ hiển thị hello <arg given to cd> khi bạn cố gắng cd đâu đó

+0

Tôi đoán nó khá mơ hồ. Tôi cần phải chạy một lệnh khác nhau cho một tập con nhỏ của toàn bộ hệ thống tập tin. Ví dụ: nếu tôi muốn nhập thư mục/home/user/a thì tôi muốn chạy /home/a.csh. Sau đó, nếu tôi nhập/home/scripts/b tôi sẽ chạy /home/b.csh – devshans

+0

Điều tôi đưa cho bạn là một khởi đầu. Nó sẽ không làm việc ví dụ nếu bạn sử dụng gnome, hoặc một số trình quản lý tập tin khác. Tôi không biết một số trình kích hoạt có thể được thực thi tùy chỉnh khi bạn thay đổi một thư mục. Có lẽ bạn có thể móc vào một cái gì đó liên quan đến chính sách bảo mật –

3

Bạn có thể thực hiện chức năng để chạy các lệnh đặc biệt đó.

run_command() { 
    case `pwd` in 
    "/path/to/dir1") 
     ... 
     ;; 
    "/path/to/dir2") 
     ... 
     ;; 
    ... 
    esac 
} 

Sau đó, bạn gọi hàm đó cùng với cd với chức năng khác chẳng hạn.

cd2() { 
    cd $1 
    run_command 
} 

cd2 /path/to/somewhere 
Các vấn đề liên quan