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

41

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 ,,to ... 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
kilojoules
la source
6
Un alias est un programme à exécuter, pas un argument pour le programme; donc $ ,,se plaindre, en tant que tel: bash: ..: Is a directory. (En d'autres termes, ce n'est pas un exécutable.)
jpaugh
5
@jpaugh: Une façon plus claire de le dire est la suivante: l'expansion des alias ne se produit que sur le premier "mot" d'une commande. Comme vous le dites, cela ne fonctionne que pour les noms de commande, pas pour les arguments. (Et vous ne pourriez même pas alias 'cd ,,'='cd ..'. Eh bien, vous pourriez, mais vous devriez l'exécuter cd\ ,,pour en faire un mot.)
Peter Cordes
5
Considérez zsh. Il a des alias globaux, donc alias -g ,,=..et cd ,,fonctionne comme vous le souhaitez.
Muru
1
Pensée latérale: find / -type d -exec ln -s .. {}/,, \;... ;-)
Toby Speight Le
2
Mon dieu: ne fais pas ça. Utiliser des alias pour couvrir les erreurs typographiques est une mauvaise pratique. Ces erreurs peuvent aboutir à du code copié-collé ou à des screencasts. Cela ne fonctionnera pas sur d'autres hôtes ou comptes. Et une telle modification (en fonction de la manière dont elle est mise en œuvre) pourrait provoquer d'autres erreurs inattendues et difficiles à déboguer. Ma suggestion: si vous tapez une commande avec une faute de frappe, tapez-la simplement à nouveau ;-).
Jjmontes

Réponses:

45

ZSH:

Si vous en zsh alias -g ,,=".."avez besoin, c’est ce dont vous avez besoin, mais cela entraînera l’extension de ",," partout, pas seulement avec cd.

De man zshbuiltins:

Si le -g drapeau 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(comme la question est marquée avec ), lisez ce qui suit:

C'est une solution purement alias, comme demandé, mais cela fera plus que nécessaire, voire frustrer l'utilisateur (voir l'avertissement à la fin de mon message).

Citant man bash:

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

Par conséquent , assez de pour alias cdavec un espace supplémentaire (pour permettre l' expansion de son argument suivant) puis 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 aliasimplémentation), mais pour tous les shells compilant POSIX. 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, d' autres alias se développeront automatiquement lorsqu'ils seront écrits après cd. Il se peut que vous deviez écrire cd \grepsi vous voulez changer de répertoire en un nommé grepmais que votre nom grepsoit un alias grep --color=auto. Sans la barre oblique inverse, cdsignalera une erreur "trop ​​d'arguments" (vous ne pouvez pas utiliser cddeux répertoires à la fois) !.

mouche en polystyrène
la source
22
C'est un hack intelligent mais méchant. Je ne voudrais pas faire ça trop facile pour que cela vous morde accidentellement. Par exemple, si vous avez un alias pour une commande que vous exécutez couramment et que vous souhaitez insérer cddans un répertoire de son code source. Ou d'autres collisions entre vos alias et les noms de répertoires communs. Comme cd drélargirait cd disown -rpour moi, avec cet alias. Quoi qu'il en soit, il est préférable de remplacer la fonction intégrée cdavec une fonction pour ce genre de choses, IMO.
Peter Cordes
8
+1 pour la solution pure-alias (j'ai appris quelque chose). Dans le même temps, je suis d'accord avec le commentaire de Peter. Je pense qu’une sorte d’avertissement explicite devrait être ajouté à votre réponse.
Kamil Maciorowski
58

Les alias ne sont pas conçus pour cela, mais vous pouvez créer une fonction appelée cdencapsuleur pour le réel cd. Celui-ci fonctionne pour moi! Il suffit de le mettre dans votre .bash_profileou 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
}

MODIFIER

Merci @derobert pour nous avoir signalé que if then elsec’est mieux 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 (ie -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.

BenjiWiebe
la source
16
@BenjiWiebe Je pense que la version "commentaires et jolie mise en forme" serait meilleure avec un if-then-else.
dimanche
Wow les gens, beaucoup de bonnes idées. Je vois que vous utilisez la fonction d'édition pour prendre en charge les corrections nécessaires. Je n'ai pas passé beaucoup de temps à le tester. :)
BenjiWiebe
1
Alternativement, écrasez-le simplement $1avant d'exécuter les fonctions intégrées:cd () { [ "$1" = ",," ] && set .. ; cd "$@"; }
Toby Speight le
1
@TobySpeight set .. "${@:2}", ou vous perdez quoi que ce soit après le premier argument.
Chepner
8
En outre, techniquement, ..le premier argument n'est pas nécessaire. cden bashpeut prendre une variété d'options ( -P, -L, -@, -e).
Chepner
29

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 mot lorsqu'il est utilisé comme premier mot d'une commande simple.

Vous pouvez alias les deux ..et ,,être cd ...

$ alias ..="cd .."
$ alias ,,="cd .."
$ cd /tmp && pwd
/tmp
$ ,, && pwd
/
Steven
la source
Cest exactement ce que je fais! : D ces deux points / virgules sont beaucoup plus faciles à taper quecd ..
rav_kr
10
+1, ce n'est pas une mauvaise idée du tout. Une autre façon de le faire .. dans Bash consiste à shopt -s autocdchanger de répertoire en saisissant simplement son nom. Bien sûr, vous avez toujours le pseudonyme de,,
ilkkachu le
Moi aussi :-)
joeytwiddle
3

Une autre façon de ..modifier le répertoire consiste à activer la autocd fonctionnalité de Bash :

shopt -s autocd 

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

~$ /tmp
cd /tmp
/tmp$ 

Vous devez toujours faire un alias pour ,,mais cela peut être fait avec justealias ,,=..

ilkkachu
la source
2

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

commacdexporte 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
Docteur Dao
la source