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?

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$

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
}

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


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.


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; }.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.