Làm thế nào tôi có thể tạo một bí danh cho cd và ls?


32

Tôi thường xuyên chạy lslệnh sau khi chạy cdlệnh. Làm cách nào tôi có thể tạo bí danh (như cs) cho thao tác này?

Câu trả lời:


35

Từ Bash Mẹo và Thủ thuật: 'cd' với phong cách :

Cuối cùng, tôi muốn chỉ cho bạn cách viết thay thế tùy chỉnh của riêng bạn cho lệnh 'cd'.

Bạn có thấy mình luôn gõ cùng một thứ khi thay đổi vào một thư mục không? Bạn có thể ít nhất liệt kê các tệp ở đó mỗi lần, có lẽ nhiều đến mức tay bạn tự động gõ 'ls' sau mỗi 'cd'.

Chà, bằng cách thử mọi cách tôi có thể nghĩ ra, hóa ra chỉ có một cách duy nhất để thực hiện đúng mục tiêu mà chúng tôi đang tìm kiếm. Chúng ta phải tạo một hàm shell.

Các hàm Shell là một phần của lập trình shell. Giống như trong các ngôn ngữ lập trình được biên dịch, các hàm cung cấp một loại mô đun hóa thủ tục. Người ta có thể tạo một hàm chung để thực hiện một bit logic hoặc tính toán thường được sử dụng với các tham số khác nhau. Trong trường hợp này, tham số là thư mục làm việc hiện tại.

Đây là một cách đơn giản:

function cs () {
    cd $1
    ls
}

Như @geirha lưu ý chính xác, chức năng trên sẽ thất bại nếu bạn cố chuyển sang một thư mục có khoảng trắng trong tên của nó:

$ cs A\ B/
-bash: cd: A: No such file or directory
<current directory listing>  

Thay vào đó, bạn nên sử dụng chức năng sau:

function cs () {
    cd "$@" && ls
    }

Khi bạn thêm mã đó vào ~/.bashrc, bạn sẽ có thể làm điều này:

hello@world:~$ cs Documents/
example.pdf tunafish.odt
hello@world:~/Documents$

1
Điều đó sẽ thất bại cho các thư mục chứa khoảng trắng. Xem bình luận cho câu trả lời của dv3500ea.
geirha

24

Bạn có thể sử dụng builtinlệnh trong bash:

function cd() {
    new_directory="$*";
    if [ $# -eq 0 ]; then 
        new_directory=${HOME};
    fi;
    builtin cd "${new_directory}" && ls
}

2
Điều này là khá trơn tru. Tôi đã có một giải pháp tương tự như @Florian trong .bashrc của tôi trong một thời gian rất dài, nhưng điều này thỏa đáng hơn nhiều khi tôi quên rằng các đồng nghiệp không có bí danh 'cs' của tôi trên máy tính của họ.
khủng long

Tôi thích câu trả lời này tốt nhất. Vì một số lý do, bạn không thể sử dụng bí danh để ghi đè lệnh, vì vậy bạn phải tạo một hàm như câu trả lời này. : D
trusktr

Nhưng những gì về các lệnh không dựng sẵn? Ví dụ, ở trên sẽ không hoạt động để ghi đè lệnh ls. Có một số từ khóa để sử dụng thay vì "dựng sẵn"?
trusktr

sử dụng đường dẫn đầy đủ cho nó, ví dụ:function ls() { /usr/bin/ls $* }
OneOfOne

Tôi đã có vấn đề xác định lại cdrvmthay đổi cdđịnh nghĩa của tôi quá. Xem stackoverflow.com/a/19941991/1601989
DavidG

16

Sử dụng hàm thay vì bí danh:

cs() { cd "$1" && ls; }

5
+1, vì phiên bản này sẽ dừng nếu 'cd' không thành công.
htorque

9

Cảm ơn Florian Diesch cho mẹo sử dụng một chức năng. Tôi không thể sử dụng cslàm tên vì có một cslệnh trong gói csound , vì vậy tôi đã sử dụng lc.

Tôi đã thêm cái này vào ~/.bash_aliases( nano ~/.bash_aliases):

function lc () {
    cd $1;
    ls 
}

Thiết bị đầu cuối cần phải có resethiệu lực.


8
Không $1được trích dẫn như thế sẽ làm cho nó thất bại nếu thư mục chứa khoảng trắng. Ngoài ra, bạn nên kiểm tra giá trị trả về của cd; nếu thất bại (ví dụ như quyền bị từ chối), sẽ không có điểm nào trong việc chạy ls. lc() { cd "$@" && ls; }
geirha

1

Là một bản mở rộng cho hàm này : cs() { cd "$1" && ls; }, bạn có thể muốn chuyển tất cả các đối số của hàm sang cdbằng cách sử dụng $@thay vì "$1"như vậy : cs() { cd $@ && ls; }.


1

Tôi đã có vấn đề xác định lại cdrvmthay đổi cdđịnh nghĩa của tôi quá. Xem https://stackoverflow.com/a/19941991/1601989 . Tôi không thực sự muốn sử dụng builtinvì điều đó sẽ bỏ qua mọi thứ rvmđang làm.

Tôi đã thêm vào như sau .bashrc:

# cdd allows you to cd to the directory of the given file or directory
function cdd()
{
  if [[ $# -eq 0 ]]; then
    cd
  elif [[ -d "$*" ]]; then
    cd "$*"
  elif [[ -f "$*" ]]; then
    echo "WARNING: file given, cd to file's dirname" 1>&2
    local dir=$(dirname "$*")
    cd "$dir"
  else
    cd "$*"
  fi
}

function cs()
{
  cdd $* && ls
}

Và sau rmvdòng .bashrcsau:

alias cd='cdd'
# Use bash built in completion for cd to allow for filenames to be used
complete -r cd
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.