Comment créer un alias pour cd et ls?

32

J'exécute fréquemment la lscommande après avoir exécuté la cdcommande. Comment créer un alias (comme cs) pour cette opération?

dv3500ea
la source

Réponses:

35

De Bash Trucs et Astuces: « cd » avec un style :

Enfin, je veux vous montrer comment écrire votre propre remplacement personnalisé pour la commande 'cd'.

Vous trouvez-vous toujours en train de taper la même chose lors de la modification d'un répertoire? Vous avez probablement au moins la liste des fichiers à chaque fois, peut-être à un point tel que vos mains tapent automatiquement "ls" après chaque "cd".

En essayant de toutes les manières possibles, il s’avère qu’il n’ya qu’une façon d’atteindre correctement le but recherché. Nous devons créer une fonction shell.

Les fonctions shell font partie de la programmation shell. Comme dans les langages de programmation compilés, les fonctions offrent une sorte de modularité procédurale. On peut créer une fonction générique pour exécuter un bit de logique souvent utilisé ou un calcul avec différents paramètres. Dans ce cas, le paramètre est le répertoire de travail en cours.

Voici un simple:

function cs () {
    cd $1
    ls
}

Comme @geirha le note correctement, la fonction ci-dessus échouera si vous essayez de basculer vers un répertoire avec un espace dans son nom:

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

Vous devriez plutôt utiliser la fonction suivante:

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

Une fois que vous avez ajouté ce code à votre ~/.bashrc, vous devriez pouvoir le faire:

hello@world:~$ cs Documents/
example.pdf tunafish.odt
hello@world:~/Documents$
Isaïe
la source
1
Cela échouera pour les répertoires contenant des espaces. Voir le commentaire de la réponse de dv3500ea.
geirha
24

Vous pouvez utiliser la builtincommande dans bash:

function cd() {
    new_directory="$*";
    if [ $# -eq 0 ]; then 
        new_directory=${HOME};
    fi;
    builtin cd "${new_directory}" && ls
}
OneOfOne
la source
2
C'est assez lisse. J'ai eu une solution similaire à @ Florian dans mon .bashrc pendant très longtemps, mais c'est beaucoup plus satisfaisant pour quand j'oublie que mes collègues n'ont pas mon alias 'c' sur leurs ordinateurs.
dino
J'aime cette réponse le meilleur. Pour une raison quelconque, vous ne pouvez pas utiliser d'alias pour écraser la commande. Vous devez donc créer une fonction comme celle-ci. : D
trusktr
Mais qu'en est-il des commandes non intégrées? Par exemple, ce qui précède ne fonctionnera pas pour écraser la commande ls. Y a-t-il un mot-clé à utiliser au lieu de "intégré"?
trusktr
utilisez le chemin complet pour cela, par exemple:function ls() { /usr/bin/ls $* }
OneOfOne
J'ai eu du mal à redéfinir cdparce rvmque ma cddéfinition aussi. Voir stackoverflow.com/a/19941991/1601989
DavidG
16

Utilisez une fonction au lieu d'un alias:

cs() { cd "$1" && ls; }
Florian Diesch
la source
5
+1, car cette version s'arrêtera si 'cd' échoue.
Htorque
9

Merci Florian Diesch pour le conseil d'utiliser une fonction. Je ne peux pas utiliser csle nom car il y a une cscommande dans le package csound , alors j'ai utilisé lc.

J'ai ajouté ceci à ~/.bash_aliases( nano ~/.bash_aliases):

function lc () {
    cd $1;
    ls 
}

Le terminal doit être resetpour que cela entre en vigueur.

dv3500ea
la source
8
Ayant $1non cotées comme ça va le faire échouer si le répertoire contient des espaces blancs. En outre, vous devriez vérifier la valeur de retour de cd; en cas d'échec (par exemple, autorisation refusée), il est inutile d'exécuter le programme ls. lc() { cd "$@" && ls; }
geirha
1

Comme une extension à cette fonction: cs() { cd "$1" && ls; }, vous pouvez passer tous les arguments de la fonction à cdl'aide au $@lieu de en "$1"tant que tel: cs() { cd $@ && ls; }.


la source
1

J'ai eu du mal à redéfinir cdparce rvmque ma cddéfinition aussi. Voir https://stackoverflow.com/a/19941991/1601989 . Je ne voulais pas vraiment utiliser builtinparce que cela ferait sauter tout ce qui rvmse fait.

J'ai ajouté ce qui suit à mon .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
}

Et puis après la rmvligne dans le .bashrc:

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