Come posso creare un alias per cd e ls?


32

Spesso eseguo il lscomando dopo aver eseguito il cdcomando. Come posso creare un alias (come cs) per questa operazione?

Risposte:


35

A partire dal Bash Tips and Tricks: 'cd' con stile :

Infine, voglio mostrarti come scrivere il tuo sostituto personalizzato per il comando 'cd'.

Ti ritrovi a digitare sempre la stessa cosa quando cambi in una directory? Probabilmente almeno elenchi i file lì ogni volta, forse così tanto che le tue mani digitano automaticamente 'ls' dopo ogni 'cd'.

Bene, provando ogni modo che mi viene in mente, si scopre che c'è solo un modo per raggiungere correttamente l'obiettivo che stiamo cercando. Dobbiamo creare una funzione shell.

Le funzioni della shell fanno parte della programmazione della shell. Come nei linguaggi di programmazione compilati, le funzioni forniscono una sorta di modularizzabilità procedurale. È possibile creare una funzione generica per eseguire un bit di logica o calcolo spesso utilizzato con parametri diversi. In questo caso, il parametro è la directory di lavoro corrente.

Eccone uno semplice:

function cs () {
    cd $1
    ls
}

Come osserva correttamente @geirha , la suddetta funzione fallirà se provi a passare a una directory con uno spazio nel suo nome:

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

Dovresti invece usare la seguente funzione:

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

Una volta aggiunto quel codice al tuo ~/.bashrc, dovresti essere in grado di farlo:

hello@world:~$ cs Documents/
example.pdf tunafish.odt
hello@world:~/Documents$

1
Ciò fallirà per le directory contenenti spazi bianchi. Vedi il commento alla risposta di dv3500ea.
geirha,

24

Puoi usare il builtincomando in bash:

function cd() {
    new_directory="$*";
    if [ $# -eq 0 ]; then 
        new_directory=${HOME};
    fi;
    builtin cd "${new_directory}" && ls
}

2
Questo è piuttosto elegante. Ho avuto una soluzione simile a @Florian nel mio .bashrc per molto tempo, ma questo è molto più soddisfacente per quando dimentico che i colleghi non hanno il mio alias "cs" sui loro computer.
dino,

Mi piace questa risposta al meglio. Per qualche motivo, non è possibile utilizzare gli alias per sovrascrivere il comando, quindi è necessario eseguire una funzione come questa risposta. : D
trusktr,

Ma per quanto riguarda i comandi non integrati? Ad esempio, quanto sopra non funzionerà per sovrascrivere il comando ls. C'è qualche parola chiave da usare al posto di "builtin"?
trusktr,

utilizzare il percorso completo per questo, ad esempio:function ls() { /usr/bin/ls $* }
OneOfOne

Ho avuto problemi a ridefinire cdperché rvmcambia anche la mia cddefinizione. Vedere stackoverflow.com/a/19941991/1601989
DavidG

16

Utilizzare una funzione anziché un alias:

cs() { cd "$1" && ls; }

5
+1, poiché questa versione si interromperà se 'cd' fallisce.
Htorque,

9

Grazie Florian Diesch per la punta dell'uso di una funzione. Non posso usare cscome nome perché c'è un cscomando nel pacchetto csound , quindi l'ho usato lc.

Ho aggiunto questo a ~/.bash_aliases( nano ~/.bash_aliases):

function lc () {
    cd $1;
    ls 
}

Il terminale deve essere resetperché questo abbia effetto.


8
La $1mancata citazione in questo modo farà fallire se la directory contiene spazi bianchi. Inoltre, è necessario verificare il valore restituito di cd; se fallisce (es. permesso negato), non ha senso eseguire ls. lc() { cd "$@" && ls; }
geirha,

1

Come espansione a questa funzione: cs() { cd "$1" && ls; }, si consiglia di passare tutti gli argomenti della funzione per cdutilizzando $@, invece di "$1"come tale: cs() { cd $@ && ls; }.


1

Ho avuto problemi a ridefinire cdperché rvmcambia anche la mia cddefinizione. Vedi https://stackoverflow.com/a/19941991/1601989 . Non volevo davvero usarlo builtinperché questo saltava qualunque cosa stesse rvmfacendo.

Ho aggiunto quanto segue al mio .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
}

E poi dopo la rmvriga in .bashrc:

alias cd='cdd'
# Use bash built in completion for cd to allow for filenames to be used
complete -r cd
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.