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 lsbất kể có cdhoạt động hay không. Nếu cdthất bại, lssẽ 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 cdvớ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 cdvà 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ư rootkhi 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" ] && returnvà 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 cdhành xử trong các tập lệnh.
[ -z "$PS1" ] && returnlà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 && returnthoát ra khỏi nguồn .bashrctại thời điểm này, trong những điều kiện này.
itrong "$-": case "$-" in *i*) ;; *) return ;; esac.
PS1Biế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 ~/.bashrcsau đâ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 đó lsxuấ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 lscác tùy chọn theo cách này vì cdkhông có tùy chọn nào.
cdls() {
cd ${$#} && ls ${@:0:$#-1}
}
cdkhô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'