Jawaban:
Anda dapat melakukan ini dengan suatu fungsi:
$ cdls() { cd "$@" && ls; }
Cara &&
' cd
ke direktori, dan jika berhasil (misalnya direktori ada), jalankan ls
'. Menggunakan &&
operator lebih baik daripada menggunakan ;
operator titik koma di antara dua perintah, seperti dengan { cd "$@" ; ls; }
. Perintah kedua ini akan berjalan ls
terlepas apakah cd
berhasil atau tidak. Jika cd
gagal, ls
akan mencetak isi direktori Anda saat ini, yang akan membingungkan bagi pengguna. Sebagai praktik terbaik, gunakan &&
dan tidak ;
.
$ cdls /var/log
CDIS.custom fsck_hfs.log monthly.out system.log
$ pwd
/var/log
Secara umum, itu adalah praktik yang buruk untuk mengubah nama perintah yang sudah ada, terutama untuk perintah yang biasa disebut seperti cd
. Sebagai gantinya, buat perintah baru dengan nama yang berbeda. Jika Anda menimpa cd
dengan fungsi atau alias yang juga bernama cd
, apa yang akan terjadi ketika Anda memasukkan direktori dengan 100.000 file? Ada banyak utilitas yang digunakan cd
, dan mereka mungkin menjadi bingung oleh perilaku yang tidak biasa ini. Jika Anda menggunakan akun bersama (Seperti root
ketika Anda bekerja dengan administrator sistem lain), akan sangat berbahaya untuk mengganti perintah yang ada karena lingkungannya berbeda dari apa yang orang harapkan.
pwd
. Tidak yakin apakah ini adalah praktik terbaik, tetapi itu biasa dilakukan. Lihat tldp.org/LDP/abs/html/aliases.html untuk beberapa contoh.
cd() { builtin cd "$@" && pwd; };
- menggunakan shell bourne standar pada macOS (Sierra 10.12.6)
Saya memilikinya di .bashrc saya, dan berfungsi dengan baik.
function cd {
builtin cd "$@" && ls -F
}
Sebelumnya di .bashrc saya, saya punya:, [ -z "$PS1" ] && return
dan semuanya setelah baris itu hanya berlaku untuk sesi interaktif, jadi ini tidak mempengaruhi bagaimana cd
berperilaku dalam skrip.
[ -z "$PS1" ] && return
dilakukan?
[ -z "$PS1" ]
memeriksa apakah $PS
(variabel prompt interaktif) adalah "nol panjang" (-z). Jika panjangnya nol, ini berarti belum ditetapkan, jadi Bash tidak boleh berjalan dalam mode interaktif. Bagian && return
keluar dari sumber .bashrc
pada titik ini, di bawah kondisi ini.
i
di "$-"
: case "$-" in *i*) ;; *) return ;; esac
.
PS1
Variabel mungkin tidak disetel atau kosong dan shell mungkin masih interaktif (tetapi tanpa prompt). Saya akan memeriksa $-
untuk memastikan.
di luar topik, karena pertanyaan diberi tag / bash, tetapi karena beberapa pertanyaan ditutup sebagai duplikat dari yang ini tidak menyebutkan bash:
Dengan zsh:
chpwd() ls
Fungsi chpwd () dipanggil oleh zsh setiap kali direktori saat ini berubah (dengan cara cd, pushd, popd ...). tcsh memiliki fitur serupa dan mungkin dari mana zsh mendapatkannya.
Mengapa tidak menambahkan alias ke file .bashrc Anda?
Sesuatu seperti:
alias cdls='cd "$@" && ls'
Solusi umum untuk membuat alias untuk perintah cd tidak sempurna karena ada perintah lain yang dapat mengubah direktori Anda saat ini seperti popd atau bahkan menjalankan skrip dengan perintah cd di dalamnya.
Lebih baik menggunakan $ PROMPT_COMMAND Bash hook yang mengeksekusi perintah sebelum mengembalikan prompt.
Perintah (fungsi dalam kasus kami) akan menjalankan ls hanya jika direktori telah berubah untuk mengurangi kebisingan layar. Kode untuk .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
Salin ini:
altercd(){ cd(){ unset -f cd ; cd $*; ls ; altercd; } } ; altercd
Sekarang Anda bisa melakukan cd sederhana:
cd /
(files listed)
cd /home
(files listed)
etc...
Di bash, Anda tidak dapat berulang ke alias untuk tindakan yang memerlukan parameter. Untuk ini ada fungsinya. Jadi masukkan ~/.bashrc
yang berikut ini
mycd() {
cd "$1"
ls
}
function mycd { builtin cd "$1" && ls "$2" }
.
Tempatkan kode di bawah ini di .profile dan berfungsi. Diuji pada kotak 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"
Yang lebih praktis - dengan kemampuan untuk kembali ke sejarah :
function cd() {
if [ -d "$@" ]; then
echo -n "Stack: "
pushd "$@"
ls
else
builtin cd "$@"
fi
}
function popd() {
builtin popd "$@" && ls
}
Ketika Anda mengubah direktori, baris dengan: Stack: (current_dir) (previous_dir) ...
akan ditampilkan, lalu ls
output. Untuk kembali dirs sejarah hanya pop perintah ini: popd
.
Saya menambahkan else
sehingga Anda akan melihat kesalahan ketika mencoba untuk pergi ke direktori yang salah.
Saya pikir itu baik untuk mengaktifkan ls
opsi dengan cara ini karena cd
tidak mengambil opsi.
cdls() {
cd ${$#} && ls ${@:0:$#-1}
}
cd
memang mengambil opsi.
Inilah yang menurut saya berguna (pada 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
'
}
Ini memberi saya output terpotong dengan elipsis jika ada terlalu banyak item di direktori itu sehingga konsol tetap bersih:
$ 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'