2009-05-13 36 views
8

Tôi thường muốn thay đổi thư mục nơi một tập tin thực thi cụ thể được đặt. Vì vậy, tôi muốn một cái gì đó nhưMột bash một lót để thay đổi vào thư mục mà một số tập tin nằm

cd `which python` 

để thay đổi vào thư mục nơi lệnh python được cài đặt. Tuy nhiên, điều này rõ ràng là bất hợp pháp, vì cd lấy một thư mục chứ không phải một tệp. Rõ ràng là một số regexp-foo tôi có thể làm để loại bỏ tên tập tin, nhưng điều đó sẽ đánh bại điểm của nó là một lớp lót dễ dàng.

Trả lời

16

đây:

cd $(dirname `which python`) 

Edit:

Thậm chí dễ dàng hơn (thực sự thử nghiệm thời gian này):

function cdfoo() { cd $(dirname `which [email protected]`); } 

Sau đó "cdfoo trăn".

+0

+1 Chúng tôi không xứng đáng. –

+0

Tôi nên dừng lại khi tôi đi trước ... chỉnh sửa để xóa biểu mẫu bí danh không có thật. –

+0

đẹp ... tạo một hàm ... + 1 – ojblass

2

một cái gì đó như thế nên làm các trick:

cd `dirname $(which python)` 
1

Bạn có thể sử dụng một cái gì đó như thế này:

cd `which <file> | xargs dirname` 
2

Một tính năng tôi đã sử dụng phân bổ là pushd/popd. Chúng duy trì một thư mục ngăn xếp để bạn không cần phải cố gắng giữ lịch sử của nơi bạn đang có nếu bạn muốn quay trở lại thư mục làm việc hiện tại trước khi thay đổi thư mục.

Ví dụ:

pushd $(dirname `which [email protected]`) 
... 
popd 
8

Để tránh tất cả những chương trình bên ngoài ('dirname' và còn tồi tệ hơn, vô dụng nhưng phổ biến 'mà') có thể là một chút viết lại:

cdfoo() { 
    tgtbin=$(type -P "$1") 
    [[ $? != 0 ]] && { 
    echo "Error: '$1' not found in PATH" >&2 
    return 1 
    } 
    cd "${tgtbin%/*}" 
} 

này cũng sửa lỗi từ khóa 'chức năng' không phổ biến từ phía trên và thêm xử lý lỗi (rất đơn giản).

Có thể là sự khởi đầu cho giải pháp được chia nhỏ hơn.

+0

+1, Thật nhẹ nhõm, có sự tỉnh táo trong thế giới UNIX. – lhunath

0

tôi đã thêm một chút xử lý lỗi đơn giản mà làm cho hành vi của cdfoo() theo đó các dirname cho không tồn tại/lập luận nonpath

function cdfoo() { cd $(dirname $(which $1 || (echo . && echo "Error: '$1' not found" >&2)));} 
3

Để so sánh:

 
zsh:~% cd =vi(:h) 
zsh:/usr/bin% 

= cmd mở rộng để đường dẫn đến cmd và (: h) là công cụ sửa đổi glob để lấy đầu

zsh là chỉ viết nhưng mạnh mẽ.

+0

Cảm ơn bạn đã nhập mã. Họ là xuất sắc! –

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