Buat cd secara otomatis ls

47

Saya menemukan bahwa saya sering melakukan hal berikut:

%> cd bla/bla
%> ls

Saya ingin itu setiap kali saya cdke direktori secara otomatis melakukan ls.

Saya bermain-main dengan saya .bashrcuntuk sementara waktu, tetapi tidak tahu bagaimana cara mewujudkannya.

RobKohr
sumber

Jawaban:

51

Anda dapat melakukan ini dengan suatu fungsi:

$ cdls() { cd "$@" && ls; }

Cara &&' cdke 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 lsterlepas apakah cdberhasil atau tidak. Jika cdgagal, lsakan 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 cddengan 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 rootketika Anda bekerja dengan administrator sistem lain), akan sangat berbahaya untuk mengganti perintah yang ada karena lingkungannya berbeda dari apa yang orang harapkan.

Stefan Lasiewski
sumber
Perintah itu benar-benar mengubah direktori? Dari halaman manual bash: "Tidak ada mekanisme untuk menggunakan argumen dalam teks pengganti. Jika argumen diperlukan, fungsi shell harus digunakan"
enzotib
@enzotib: Ya, ini benar-benar mengubah direktori, setidaknya untuk saya. Saya memperbarui jawaban saya untuk menunjukkan hasil pwd. Tidak yakin apakah ini adalah praktik terbaik, tetapi itu biasa dilakukan. Lihat tldp.org/LDP/abs/html/aliases.html untuk beberapa contoh.
Stefan Lasiewski
2
Pertama: ini tidak berfungsi di sini. Kedua: di halaman itu mereka menggunakan variabel, bukan parameter posisi. Ketiga: ABS adalah sumber umum praktik buruk.
enzotib
1
Alias ​​bekerja untuk saya di Snow Leopard tetapi tidak pada CentOS5 atau CentOS6. Saya memperbarui jawaban saya untuk menggunakan fungsi saja. Tidak ada alias.
Stefan Lasiewski
1
Tidak bekerja untuk saya. Mencoba jawaban @frabjous dan berfungsi: cd() { builtin cd "$@" && pwd; };- menggunakan shell bourne standar pada macOS (Sierra 10.12.6)
Swivel
39

Saya memilikinya di .bashrc saya, dan berfungsi dengan baik.

function cd {
    builtin cd "$@" && ls -F
    }

Sebelumnya di .bashrc saya, saya punya:, [ -z "$PS1" ] && returndan semuanya setelah baris itu hanya berlaku untuk sesi interaktif, jadi ini tidak mempengaruhi bagaimana cdberperilaku dalam skrip.

luar biasa
sumber
1
Apa yang sebenarnya [ -z "$PS1" ] && returndilakukan?
syntagma
2
[ -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 && returnkeluar dari sumber .bashrcpada titik ini, di bawah kondisi ini.
frabjous
1
Cara lain untuk memeriksa interaktivitas adalah untuk mencari idi "$-": case "$-" in *i*) ;; *) return ;; esac.
Kusalananda
@ Kusalananda & frabjous: Apakah ada kasus di mana satu harus digunakan, bukan yang lain?
Putar
1
@Swivel PS1Variabel mungkin tidak disetel atau kosong dan shell mungkin masih interaktif (tetapi tanpa prompt). Saya akan memeriksa $-untuk memastikan.
Kusalananda
13

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.

Stéphane Chazelas
sumber
4

Mengapa tidak menambahkan alias ke file .bashrc Anda?

Sesuatu seperti:

alias cdls='cd "$@" && ls'
Kenneth Aar
sumber
@don_crissti Funtion dan alias adalah hal yang berbeda. Jadi mengapa tidak?
Jodka Lemon
Ini adalah cara tercepat dan terbersih untuk melakukan apa yang diminta OP. Menurut pendapat saya, fungsi harus digunakan untuk hal-hal yang lebih rumit, sementara membuat cara pintas untuk perintah yang sering diketik adalah alias untuk apa.
Ghos3t
1
Saya mengalami masalah aneh dengan alias ini, ketika saya menggunakannya seperti ini, cdls projec2, itu akan menampilkan semua file dalam folder proyek 2 tetapi sebenarnya tidak cd ke folder itu, sebagai gantinya, itu akan tetap di folder asli.
Ghos3t
Yap, menggunakan alias hanya daftar isi dalam direktori itu, tetapi tidak benar-benar cd ke sana.
a3y3
2

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
Mendongkrak
sumber
2

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... 
Luciano Andress Martini
sumber
1

Di bash, Anda tidak dapat berulang ke alias untuk tindakan yang memerlukan parameter. Untuk ini ada fungsinya. Jadi masukkan ~/.bashrcyang berikut ini

mycd() {
  cd "$1"
  ls
}
enzotib
sumber
4
cd "$1" && lsakan lebih baik.
Gilles 'SO- stop being evil'
Untuk mengizinkan parameter untuk perintah ls, saya menggunakan function mycd {builtin cd $ 1 && ls $ 2}. Sekarang Anda dapat memanggil perintah mis mycd .. -la
Christian Schulzendorff
@ChristianSchulzendorff: lebih baik menggunakan tanda kutip: function mycd { builtin cd "$1" && ls "$2" } .
enzotib
Tidak berfungsi, saya baru mencobanya. File itu kosong, tetapi setelah menambahkan kode Anda, tidak ada yang berubah.
Hitam
0

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"
pengguna196161
sumber
0

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 lsoutput. Untuk kembali dirs sejarah hanya pop perintah ini: popd.

Saya menambahkan elsesehingga Anda akan melihat kesalahan ketika mencoba untuk pergi ke direktori yang salah.

Ctrl-C
sumber
jika Anda hanya melakukan cd - itu akan membawa Anda ke dir terakhir Anda bahwa Anda berada di.
Ian
0

Saya pikir itu baik untuk mengaktifkan lsopsi dengan cara ini karena cdtidak mengambil opsi.

cdls() {
  cd ${$#} && ls ${@:0:$#-1}
}
iBug
sumber
Umm ... cdmemang mengambil opsi.
Kusalananda
0

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
Superlexx
sumber
-1
alias cd='builtin cd $1 && ls -l && builtin cd $1'
joek
sumber
Ini tidak menambahkan apa pun yang belum dicakup jawaban lain.
jasonwryan