Comment définir un alias par répertoire?

18

Supposons que vous ayez un alias go, mais que vous souhaitiez qu'il fasse différentes choses dans différents répertoires?

Dans un répertoire, il doit s'exécuter cmd1, mais dans un autre répertoire, il doit s'exécutercmd2

Soit dit en passant, j'ai déjà un alias pour passer aux répertoires ci-dessus, est-il donc possible d'ajouter l' goaffectation d'alias à l' fooalias?

alias "foo=cd /path/to/foo"

Travailler en bash (?) Sur OSX.

B Seven
la source
1
C'est à cela que servent les makefiles.
itsbruce

Réponses:

16

Il n'est pas complètement sûr de ce que vous demandez, mais un alias se développe simplement à ce qui est dans l'alias. Si vous avez deux alias, vous pouvez ajouter les différentes commandes, même des alias.

alias "foo=cd /path/to/foo; go"
alias "foo2=cd /path/to/foo2; go"

Dans toute autre situation, vous pouvez spécifier une fonction dans votre .bashrc

function go ()
{
    if [ "$PWD" == "/path/to/foo" ]; then
       cmd1
    elif [ "$PWD" == "/path/to/go" ]; then
       cmd2
    fi;
}

Si vous avez plus de choix, vous pouvez mieux utiliser une structure de cas.

Bernhard
la source
4

J'ai l'impression que vous êtes très "orienté répertoire" et, dans ce cas, cela pourrait mieux correspondre à votre mentalité.

(Mais pour être honnête, je pense que c'est une mauvaise idée, vous voudriez que les commandes soient globales.)

Dans .bashrc, mettez alias go="./.cmd"(alors source ~/.bashrc).

Ensuite, dans chacun de ces répertoires, mettez un script appelé .cmd, puis chmod +x .cmd, gofaites votre truc.

Emanuel Berg
la source
2
C'est beaucoup de travail ... voici le cas d'utilisation: lors de l'exécution de tests, je veux alias rspec-all pour exécuter certains tests. Mais quels tests dépendent du projet. Et cela est déterminé par le répertoire.
B Seven
2
Ce que je peux voir, vous avez deux options, soit utiliser une fonction (comme @Bernhard décrit ci-dessus), et une branche en fonction du répertoire (comme il l'a dit), ou, vous pouvez mettre les paramètres dans les répertoires. À bien y penser, il ne doit pas nécessairement s'agir de scripts, vous pouvez simplement placer un fichier ( touch .TESTNO; echo 2 > .TESTNO) dans chaque répertoire, puis, dans votre fonction, rechercher ce fichier et créer une branche en fonction du numéro de test du fichier .TESTNO contient. Bien que cela ne soit pas du tout difficile, vous ne pouvez probablement pas utiliser d'alias pour cela; vous devez utiliser une fonction.
Emanuel Berg
2

Je travaille sur un projet qui accomplit exactement cela. Découvrez-le: localalias .

Voici une démo:

entrez la description de l'image ici

Assez drôle, j'ai utilisé gocomme exemple dans la démo. Je n'ai pas montré de changement de répertoire (quelque chose que je devrais changer dans la démo) mais les fonctions avec la lacommande sont en effet locales au répertoire dans lequel elles sont définies.

Bryan Bugyi
la source
1
function go() {
  if [ ! -e "./.cmd1" ]
    then command go -a $1
    else command go -b $1
  fi
}

Une chose similaire, mais en supposant que "go" est une commande dont vous souhaitez des fonctionnalités différentes dans un répertoire spécifique.

deuxième planète
la source
1

Si vous ajoutez la fonction suivante à votre .bashrc

function cd () { 
  builtin cd "$@" && [[ -f .aliases ]] && . .aliases
  return 0
}

Chaque fois que vous cd dans un répertoire avec un fichier .aliases, il sera obtenu.

Attention à la sécurité si d'autres peuvent créer des fichiers sur votre machine.

Avec cette astuce, les alias ne sont jamais supprimés, mais vous pouvez écrire autant de code que vous le souhaitez dans la fonction.

ondir utilise cette astuce et a une tonne de cloches et de sifflets.

http://swapoff.org/ondir.html#download

teknopaul
la source
Bien que je pense que c'est intelligent, il semble que ce soit dangereux car cela dépend .bashrc. (Cela ne fonctionnera pas cron, par exemple).
ctbrown
Je ne suis pas sûr que bashrc soit dangereux. Je crois que c'est l'endroit standard / correct pour les alias. C'est dans la nature des environnements qu'ils sont différents. Donnez la question, un environnement différent est ce qui est requis. Rien ne vous empêche de rechercher un utilisateur .bashrc dans cron si vous voulez que cron ait un environnement similaire . NB cron devrait toujours se comporter différemment d'un shell interactif en raison de l'utilisation d'isatty et de chums.
teknopaul
Certes, bashrc lui-même n'a rien de dangereux. Le problème est que vous n'avez aucun moyen de vous assurer que le processus qui passe au répertoire source bashrc. C'est une chose si c'est votre session interactive. Il en va tout autrement si ce répertoire est partagé entre des utilisateurs et des processus qui peuvent ou non utiliser le shell bash. .bash_aliases est l'emplacement préféré pour les alias bash sur certains systèmes.
ctbrown