web-dev-qa-db-fra.com

Est-ce que "," peut être associé à ".."?

Parfois, lorsque je veux changer de répertoire parent, je tape par erreur cd ,, au lieu de cd ... Est-ce que je peux faire en sorte que ces déclarations soient les mêmes? Je n'utilise jamais de virgule dans mes commandes. Idéalement, je voudrais alias ,, à ... Quand j'ai essayé ça, ça n'a pas marché. Pourquoi ça n'a pas marché? Comment puis-je aborder ce problème?

$ alias ,,=..
$ cd ,,
-bash: cd: ,,: No such file or directory
41
kilojoules

ZSH:

Si vous utilisez zshalias -g ,,="..", c'est ce dont vous avez besoin, mais cela entraînera le développement de "," partout, pas seulement lorsqu'il est utilisé avec cd.

De man zshbuiltins:

Si l'indicateur -g est présent, définissez un alias global; Les alias globaux sont développés même s'ils ne se trouvent pas en position de commandement.

FRAPPER:

Si restreint à bash (car la question est étiquetée avec bash ), lisez ce qui suit:

Ceci est une solution pure-alias, comme demandé, cependant cela fera plus que nécessaire frustrant éventuellement l'utilisateur (voir l'avertissement à la fin de mon message).

Citer man bash:

Si le dernier caractère de la valeur de l'alias est vide, la commande suivante Word suivant l'alias est également vérifiée pour le développement de l'alias.

Par conséquent, il suffit d'alias cd avec un espace supplémentaire (pour permettre le développement de son argument suivant), puis d'alias ,, à ... Regarde ça

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

donne exactement ce dont vous avez besoin.

Notez que ceci est correct non seulement pour bash (et son implémentation alias), mais pour tous les shells POSIX-compilant. Citant un exemple de man 1p alias (le manuel ne décrit pas cette fonctionnalité explicitement, mais uniquement à travers un exemple):

  1. Configurez Nohup pour qu'il puisse traiter un argument qui est lui-même un nom d'alias:

           alias Nohup="Nohup "
    

Avertissement: Comme @PeterCordes écrit dans son commentaire, cela entraînera automatiquement d'autres alias à se développer lorsqu'ils sont écrits après cd. Vous devrez peut-être écrire cd \grep si vous souhaitez modifier le répertoire en un nom nommé grep, mais votre grep est un alias pour grep --color=auto. Sans la barre oblique inversée, cd signalera l'erreur "trop ​​d'arguments" (vous ne pouvez pas cd dans deux répertoires à la fois)! !.

45
styrofoam fly

Les alias ne sont pas censés faire cela, mais vous pouvez créer une fonction appelée cd qui est un wrapper pour la vraie cd. Celui-ci fonctionne pour moi! Il suffit de le mettre 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 un joli formatage:

cd ()
{
  if [ "$1" = ",," ]; then  # if first argument is ",,"...
    builtin cd ..           # call the builtin cd with ".." instead...
  else
    builtin cd "$@"         # else call builtin cd with original arguments 
  fi
}

EDIT

Merci à @derobert pour avoir souligné que if then else est meilleur ici que && ||. De plus, je viens de me rendre compte ( * facepalm *) que cette implémentation ne fonctionnera que si des arguments autres que le chemin d'accès (à savoir -L -P) ne sont pas le premier argument. Soyez donc averti, si vous avez la mauvaise habitude de taper cd -L ,,, cela ne vous aidera pas. Et ce n’est pas trivial de le gérer correctement, je pense.

58
BenjiWiebe

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

Manuel de référence Bash: Alias ​​

Les alias permettent de substituer une chaîne à un Wordlorsqu'elle est utilisée comme premier Wordd'une commande simple.

Vous pouvez également alias .. et ,, pour être cd ...

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

Un autre moyen de modifier le répertoire .. consiste à activer la fonctionnalité autocd de Bash :

shopt -s autocd 

Cela changera automatiquement le répertoire lorsque vous en saisirez le nom:

~$ /tmp
cd /tmp
/tmp$ 

Vous devez toujours créer un alias pour ,,, mais vous pouvez le faire avec seulement alias ,,=...

3
ilkkachu

Il y a déjà une application un script pour cela: https://github.com/shyiko/commacd (aucune affiliation avec Stanley Shuyiko).

commacd exporte trois commandes: , (pour sauter en avant), ,, (en arrière) et ,,, (en arrière + en avant):

Tous les trois essaient de faire correspondre par préfixe en premier. Seulement si aucun résultat n'est trouvé, ils se replieront en correspondance de sous-chaîne (floue)

Pour répondre à votre question, le script aliases virgules à trois fonctions qu’il définit:

alias ,=_commacd_forward
alias ,,=_commacd_backward
alias ,,,=_commacd_backward_forward
2
Doctor Dao