40 votes

Peut-on aliaser ',,' par '..'?

Parfois, quand je veux changer pour le répertoire parent, je tape par erreur cd ,, au lieu de cd ... Est-ce qu'il y a un moyen de faire en sorte que bash considère ces commandes comme étant les mêmes ? Je n'utilise jamais de virgules dans mes commandes. Idéalement, j'aimerais définir l'alias ,, comme étant équivalent à ... Quand j'ai essayé cela, ça n'a pas fonctionné. Pourquoi ça n'a pas marché ? Comment puis-je aborder ce problème autrement ?

$ alias ,,=..
$ cd ,,
-bash: cd: ,,: Aucun fichier ou dossier de ce type

58voto

BenjiWiebe Points 8464

Les alias ne sont pas destinés à faire cela, mais vous pouvez créer une fonction appelée cd qui est une enveloppe pour le véritable cd. Celle-ci fonctionne pour moi! Il suffit de la placer dans votre .bash_profile ou votre fichier de profil de choix.

cd () { if [ "$1" = ",," ]; then builtin cd ..; else builtin cd "$@"; fi; }

Ou, avec des commentaires et une mise en forme jolie :

cd ()
{
  if [ "$1" = ",," ]; then  # si le premier argument est ",,"...
    builtin cd ..           # appeler le cd intégré avec ".." à la place...
  else
    builtin cd "$@"         # sinon appeler le cd intégré avec les arguments originaux
  fi
}

MODIFICATION

Merci @derobert d'avoir souligné que if then else est mieux ici que && ||. De plus, je viens de réaliser (*facepalm*) que cette implémentation ne fonctionnera que si tout argument non relatif au chemin (c'est-à-dire -L -P) n'est pas le premier argument. Donc, attention, si vous avez pour habitude de taper cd -L ,, cela ne vous aidera pas. Et cela est non trivial à gérer correctement, je pense.

44voto

styrofoam fly Points 1816

ZSH:

Si vous utilisez zsh, alias -g ,,=".." est ce dont vous avez besoin, mais cela va provoquer l'expansion de ",," partout, et pas seulement lorsqu'il est utilisé avec cd.

D'après man zshbuiltins:

Si le drapeau -g est présent, définissez un alias global; les alias globaux sont toujours étendus même s'ils ne se trouvent pas en position de commande.

BASH:

Si vous êtes limité à bash (comme la question est taggée avec bash), lisez ce qui suit :

Ceci est une solution purement par alias, comme demandé, cependant cela fera plus que nécessaire, ce qui pourrait frustrer l'utilisateur (voir l'avertissement à la fin de mon post).

En citant man bash:

Si le dernier caractère de la valeur de l'alias est un espace, alors le mot de commande suivant l'alias est également vérifié pour l'expansion de l'alias.

Il suffit donc de créer un alias pour cd avec un espace supplémentaire (pour permettre l'expansion de son argument suivant) et ensuite d'aliaser ,, vers ... Voici ce que cela donne :

alias cd='cd '
alias ,,='..'

Cela donne exactement ce dont vous avez besoin.

Veuillez noter que ceci est correct non seulement pour bash (et son implémentation des alias), mais pour tous les shells conformes à POSIX. En citant un exemple de man 1p alias (le manuel ne décrit pas explicitement cette fonctionnalité, seulement à travers un exemple) :

  1. Configurez nohup pour qu'il puisse gérer un argument qui est lui-même un nom d'alias :

           alias nohup="nohup "

Avertissement : Comme @PeterCordes l'écrit dans son commentaire, cela provoquera automatiquement l'expansion d'autres alias lorsqu'ils sont écrits après cd. Cela peut vous obliger à écrire cd \grep si vous voulez changer de répertoire vers un nommé grep, mais que votre grep est un alias pour grep --color=auto. Sans le backslash, cd renverra une erreur "trop d'arguments" (vous ne pouvez pas faire cd vers deux répertoires en même temps) !.

29voto

Matt Joiner Points 1559

Les alias doivent être le premier mot d'une commande. De plus, l'alias doit être substitué à un mot donc pas d'espaces).

Manuel de Référence Bash : Aliases

Les alias permettent de substituer une chaîne de caractères à un mot lorsqu'il est utilisé comme le premier mot d'une commande simple.

Vous pourriez alias à la fois .. et ,, pour être cd ...

$ alias ..="cd .."
$ alias ,,="cd .."
$ cd /tmp && pwd
/tmp
$ ,, && pwd
/

3voto

Crazyaussie21 Points 11

Une autre façon de faire en sorte que .. change le répertoire est d'activer la fonction autocd de Bash :

shopt -s autocd 

Cela changera automatiquement le répertoire lorsque vous entrez son nom :

~$ /tmp
cd /tmp
/tmp$ 

Vous devez quand même créer un alias pour ,,, mais cela peut être fait simplement avec alias ,,=..

2voto

Doctor Dao Points 29

Il existe déjà une application un script pour cela : https://github.com/shyiko/commacd (aucun lien avec Stanley Shuyiko).

commacd exporte trois commandes : , (pour avancer), ,, (pour reculer) et ,,, (reculer+avancer) :

Toutes les trois cherchent d'abord une correspondance par préfixe. Seulement en l'absence de résultats, elles basculeront vers une recherche par sous-chaîne (correspondance floue).

Pour répondre à votre question, le script aliasse les virgules à trois fonctions qu'il définit :

alias ,=_commacd_forward
alias ,,=_commacd_backward
alias ,,,=_commacd_backward_forward

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X