Câu trả lời:
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$
Bạn có thể sử dụng builtin
lệnh trong bash:
function cd() {
new_directory="$*";
if [ $# -eq 0 ]; then
new_directory=${HOME};
fi;
builtin cd "${new_directory}" && ls
}
function ls() { /usr/bin/ls $* }
cd
vì rvm
thay đổi cd
định nghĩa của tôi quá. Xem stackoverflow.com/a/19941991/1601989
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 cs
làm tên vì có một cs
lệ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ó reset
hiệu lực.
$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; }
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 cd
bằng cách sử dụng $@
thay vì "$1"
như vậy : cs() { cd $@ && ls; }
.
Tôi đã có vấn đề xác định lại cd
vì rvm
thay đổ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 builtin
vì đ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 rmv
dòng .bashrc
sau:
alias cd='cdd'
# Use bash built in completion for cd to allow for filenames to be used
complete -r cd