Câu trả lời:
Bạn có thể làm điều này với một chức năng:
$ cdls() { cd "$@" && ls; }
Có &&
nghĩa là ' cd
đến một thư mục và nếu thành công (ví dụ: thư mục tồn tại), hãy chạy ls
'. Sử dụng &&
toán tử thì tốt hơn là sử dụng ;
toán tử dấu chấm phẩy ở giữa hai lệnh, như với { cd "$@" ; ls; }
. Lệnh thứ hai này sẽ chạy ls
bất kể có cd
hoạt động hay không. Nếu cd
thất bại, ls
sẽ in nội dung của thư mục hiện tại của bạn, điều này sẽ gây nhầm lẫn cho người dùng. Là một thực hành tốt nhất, sử dụng &&
và không ;
.
$ cdls /var/log
CDIS.custom fsck_hfs.log monthly.out system.log
$ pwd
/var/log
Nói chung, việc đổi tên một lệnh đã tồn tại là một thực tế xấu, đặc biệt đối với một lệnh thường được gọi là như thế cd
. Thay vào đó, tạo một lệnh mới với một tên khác. Nếu bạn ghi đè lên cd
với một chức năng hay bí danh mà cũng được đặt tên cd
, điều gì sẽ xảy ra khi bạn nhập một thư mục với 100.000 file? Có nhiều tiện ích sử dụng cd
và chúng có thể bị nhầm lẫn bởi hành vi bất thường này. Nếu bạn sử dụng tài khoản dùng chung (Chẳng hạn như root
khi bạn đang làm việc với các quản trị viên hệ thống khác), việc thay thế một lệnh hiện có sẽ rất nguy hiểm vì môi trường khác với những gì mọi người mong đợi.
pwd
. Không chắc chắn nếu đây là một thực hành tốt nhất, nhưng nó thường được thực hiện. Xem tldp.org/LDP/abs/html/aliases.html để biết một số ví dụ.
cd() { builtin cd "$@" && pwd; };
- sử dụng vỏ bourne tiêu chuẩn trên macOS (Sierra 10.12.6)
Tôi có cái này trong .bashrc của tôi và nó hoạt động tốt.
function cd {
builtin cd "$@" && ls -F
}
Trước đó trong .bashrc của tôi, tôi có: [ -z "$PS1" ] && return
và mọi thứ sau dòng đó chỉ áp dụng cho các phiên tương tác, vì vậy điều này không ảnh hưởng đến cách cd
hành xử trong các tập lệnh.
[ -z "$PS1" ] && return
làm gì?
[ -z "$PS1" ]
kiểm tra xem $PS
(biến nhắc tương tác) có "độ dài không" (-z). Nếu nó có độ dài bằng 0, điều này có nghĩa là nó chưa được đặt, do đó Bash không được chạy trong chế độ tương tác. Phần && return
thoát ra khỏi nguồn .bashrc
tại thời điểm này, trong những điều kiện này.
i
trong "$-"
: case "$-" in *i*) ;; *) return ;; esac
.
PS1
Biến có thể không được đặt hoặc trống và shell vẫn có thể tương tác (nhưng không có dấu nhắc). Tôi sẽ kiểm tra $-
để đảm bảo.
ngoài chủ đề, vì câu hỏi được gắn thẻ / bash, nhưng vì một số câu hỏi được đóng lại là bản sao của câu hỏi này không đề cập đến bash:
Với zsh:
chpwd() ls
Hàm chpwd () được gọi bởi zsh mỗi khi thư mục hiện tại thay đổi (theo cách của cd, pushd, popd ...). tcsh có một tính năng tương tự và có lẽ là nơi zsh có nó từ đó.
Tại sao không thêm bí danh vào tệp .bashrc của bạn?
Cái gì đó như:
alias cdls='cd "$@" && ls'
Giải pháp chung cho việc tạo bí danh cho lệnh cd là không hoàn hảo vì có các lệnh khác có thể thay đổi thư mục hiện tại của bạn như popd hoặc thậm chí chạy tập lệnh có lệnh cd trong đó.
Tốt hơn là sử dụng hook $ PROMPT_COMMAND để thực thi lệnh trước khi trả về lời nhắc.
Lệnh (một chức năng trong trường hợp của chúng tôi) sẽ chỉ thực hiện ls nếu thư mục đã thay đổi để giảm nhiễu màn hình. Mã cho .bashrc:
#each console has its own file to save PWD
PrevDir=$(tty)
PrevDir=/tmp/prev-dir${PrevDir////-}
#don't ls when shell launched
echo $PWD > $PrevDir
LsAfterCd() {
[[ "$(< $PrevDir)" == "$PWD" ]] && return 0
ll --color=always | sed 1d
echo $PWD > $PrevDir
}
PROMPT_COMMAND=LsAfterCd
Sao chép cái này:
altercd(){ cd(){ unset -f cd ; cd $*; ls ; altercd; } } ; altercd
Bây giờ bạn chỉ có thể làm cd đơn giản:
cd /
(files listed)
cd /home
(files listed)
etc...
Trong bash, bạn không thể lặp lại thành bí danh cho hành động yêu cầu tham số. Đối với điều này có chức năng. Vì vậy, đặt trong ~/.bashrc
sau đây của bạn
mycd() {
cd "$1"
ls
}
function mycd { builtin cd "$1" && ls "$2" }
.
Đặt mã dưới đây vào .profile và nó hoạt động. Đã thử nghiệm trên hộp HP-Unix.
cdl()
{
if [ "$#" = 0 ]; then
cd ~ && ls -ltr
elif [ -d "$@" ]; then
cd "$@" && ls -ltr
else
echo "$@" directory not found!!!
fi
}
#SET YOUR ALIAS TO CD
alias cd="cdl"
Thậm chí tiện dụng hơn - với khả năng quay trở lại trong lịch sử :
function cd() {
if [ -d "$@" ]; then
echo -n "Stack: "
pushd "$@"
ls
else
builtin cd "$@"
fi
}
function popd() {
builtin popd "$@" && ls
}
Khi bạn thay đổi thư mục, một dòng với: Stack: (current_dir) (previous_dir) ...
sẽ được hiển thị, sau đó ls
xuất ra. Để quay lại lịch sử dirs, chỉ cần bật lệnh này : popd
.
Tôi đã thêm else
để bạn sẽ thấy một lỗi khi cố gắng đi đến một thư mục sai.
Tôi nghĩ thật tốt khi kích hoạt ls
các tùy chọn theo cách này vì cd
không có tùy chọn nào.
cdls() {
cd ${$#} && ls ${@:0:$#-1}
}
cd
không có tùy chọn.
Đây là những gì tôi thấy hữu ích (trên Debian 9):
c() {
cd "${@}" \
&& ls --color=always -C \
| sed '
# on line 5, print the line,
5 {
# append an ellipsis
a[...]
# and quit
q
}
# print lines 1-4 verbatim
'
}
Điều này mang lại cho tôi đầu ra bị cắt bằng dấu chấm lửng trong trường hợp có quá nhiều mục trong thư mục đó để giao diện điều khiển sạch sẽ:
$ c data/git/buildroot/package/
4th lua-markdown
a10disp lua-messagepack
acl lua-msgpack-native
acpica luaossl
acpid lua-periphery
[...]
$ ls -1 | wc --lines
1977
alias cd='builtin cd $1 && ls -l && builtin cd $1'