Bagaimana saya bisa membuat alias untuk cd dan ls?

32

Saya sering menjalankan lsperintah setelah menjalankan cdperintah. Bagaimana saya bisa membuat alias (seperti cs) untuk operasi ini?

dv3500ea
sumber

Jawaban:

35

Dari Bash Tips and Tricks: 'cd' dengan gaya :

Akhirnya, saya ingin menunjukkan kepada Anda bagaimana menulis pengganti kustom Anda sendiri untuk perintah 'cd'.

Apakah Anda selalu mengetik hal yang sama saat berganti menjadi direktori? Anda mungkin setidaknya daftar file di sana setiap kali, mungkin begitu banyak sehingga tangan Anda secara otomatis mengetik 'ls' setelah setiap 'cd'.

Nah, dengan mencoba segala cara yang dapat saya pikirkan, ternyata hanya ada satu cara untuk mencapai tujuan yang kita cari dengan benar. Kita harus membuat fungsi shell.

Fungsi Shell adalah bagian dari pemrograman shell. Seperti dalam bahasa pemrograman yang dikompilasi, fungsi menyediakan semacam modularizability prosedural. Seseorang dapat membuat fungsi generik untuk melakukan logika atau komputasi yang sering digunakan dengan parameter yang berbeda. Dalam hal ini, parameternya adalah direktori kerja saat ini.

Ini yang sederhana:

function cs () {
    cd $1
    ls
}

Seperti dicatat oleh @geirha dengan benar , fungsi di atas akan gagal jika Anda mencoba untuk beralih ke direktori dengan spasi di namanya:

$ cs A\ B/
-bash: cd: A: No such file or directory
<current directory listing>  

Anda sebaiknya menggunakan fungsi berikut:

function cs () {
    cd "$@" && ls
    }

Setelah menambahkan kode itu ke kode Anda ~/.bashrc, Anda seharusnya dapat melakukan ini:

hello@world:~$ cs Documents/
example.pdf tunafish.odt
hello@world:~/Documents$
Yesaya
sumber
1
Itu akan gagal untuk direktori yang berisi spasi putih. Lihat komentar untuk jawaban dv3500ea.
geirha
24

Anda dapat menggunakan builtinperintah di bash:

function cd() {
    new_directory="$*";
    if [ $# -eq 0 ]; then 
        new_directory=${HOME};
    fi;
    builtin cd "${new_directory}" && ls
}
OneOfOne
sumber
2
Ini sangat apik. Saya punya solusi yang mirip dengan @Florian di .bashrc saya untuk waktu yang sangat lama, tetapi ini jauh lebih memuaskan ketika saya lupa bahwa kolega tidak memiliki alias 'cs' di komputer mereka.
dino
Saya suka jawaban ini yang terbaik. Untuk beberapa alasan, Anda tidak bisa menggunakan alias untuk menimpa perintah, jadi Anda harus membuat fungsi seperti jawaban ini. : D
trusktr
Tapi bagaimana dengan perintah non-builtin? Sebagai contoh, hal di atas tidak akan berfungsi untuk menimpa perintah ls. Apakah ada beberapa kata kunci untuk digunakan daripada "builtin"?
trusktr
gunakan path lengkap untuk itu, contoh:function ls() { /usr/bin/ls $* }
OneOfOne
Saya mengalami masalah mendefinisikan ulang cdkarena rvmmengubah cddefinisi saya juga. Lihat stackoverflow.com/a/19941991/1601989
DavidG
16

Gunakan fungsi alih-alih alias:

cs() { cd "$1" && ls; }
Florian Diesch
sumber
5
+1, karena versi ini akan berhenti jika 'cd' gagal.
htorque
9

Terima kasih Florian Diesch untuk tip menggunakan fungsi. Saya tidak bisa menggunakan csnamanya karena ada csperintah dalam paket csound , jadi saya gunakan lc.

Saya menambahkan ini ke ~/.bash_aliases( nano ~/.bash_aliases):

function lc () {
    cd $1;
    ls 
}

Terminal perlu agar resetini berlaku.

dv3500ea
sumber
8
Memiliki tanda $1kutip seperti itu akan membuatnya gagal jika direktori tersebut berisi spasi putih. Anda juga harus memeriksa nilai pengembalian cd; jika gagal (mis. izin ditolak), tidak ada gunanya menjalankan ls. lc() { cd "$@" && ls; }
geirha
1

Sebagai perluasan fungsi ini: cs() { cd "$1" && ls; }, Anda mungkin ingin lulus semua argumen fungsi untuk cdmenggunakan $@bukan "$1"seperti: cs() { cd $@ && ls; }.


sumber
1

Saya mengalami masalah mendefinisikan ulang cdkarena rvmmengubah cddefinisi saya juga. Lihat https://stackoverflow.com/a/19941991/1601989 . Saya tidak benar-benar ingin menggunakannya builtinkarena itu akan melompati apa pun rvmyang dilakukan.

Saya menambahkan yang berikut ini ke .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
}

Dan kemudian setelah rmvbaris di .bashrc:

alias cd='cdd'
# Use bash built in completion for cd to allow for filenames to be used
complete -r cd
DavidG
sumber