Vous pouvez utiliser la complétion de tabulation. Par défaut sur de nombreuses distributions Linux, bash est configuré de sorte que lorsque vous appuyez sur la touche [TAB], vous obtenez une liste de correspondances possibles, ou s'il n'y a qu'une seule correspondance, tout est rempli. Pour cd, il s'agit normalement d'une liste de sous-répertoires du répertoire de travail actuel. Vous pouvez remplacer cela, mais je suggère plutôt de créer un alias, comme jd
pour "jump directory":
alias jd=cd
puis, définissant les "signets" que vous souhaitez compléter pour jd. Regardez la page de manuel bash pour beaucoup plus d'options (y compris la génération automatique des résultats à la volée à partir d'une commande ou d'une fonction), mais le moyen le plus simple est juste une liste de mots, avec -W
:
complete -W "/ srv / www ~ / tmp ~ / work" jd
Maintenant, tapez jd
et appuyez sur [TAB], et vous verrez vos "signets". Tapez n'importe quelle partie ambiguë, puis appuyez sur [TAB] pour terminer. (Dans ce qui précède, le ~
s se développe dans mon répertoire personnel, donc le premier [TAB] me donne un /
, et si je frappe w
et [TAB] à nouveau, /srv/www
est rempli.)
Bien sûr, mettez cela ~/.bash_profile
pour le faire persister.
Ou, nous pouvons prendre cela au niveau suivant. Créez un répertoire ~/.shortcuts
- en commençant par un point, il sera masqué et ne créera pas votre joli répertoire personnel propre - et remplissez-le avec des liens symboliques vers vos répertoires souhaités. Ensuite, mettez ceci dans votre ~ / .bash_profile:
_list_shortcuts()
{
COMPREPLY=($( compgen -W "$( ls ~/.shortcuts )" -- ${COMP_WORDS[COMP_CWORD]} ))
}
jd()
{
cd -P ~/.shortcuts/$1
}
complete -F _list_shortcuts jd
Cela définit une complétion légèrement plus compliquée dans la _list_shortcuts
construction de la liste des noms, et fait jd
être une fonction plutôt qu'un simple alias, car nous voulons qu'il agisse différemment de juste cd
. Le -P
drapeau lui cd
permet de résoudre les liens symboliques, de sorte que tout devient une magie transparente. Vos noms de raccourcis n'ont même pas à correspondre aux cibles.
Donc:
$ ls -l ~/.shortcuts/
total 0
lrwxrwxrwx. 1 mattdm mattdm 16 Dec 17 19:44 tmp -> /home/mattdm/tmp
lrwxrwxrwx. 1 mattdm mattdm 17 Dec 17 19:44 WORK -> /home/mattdm/work
lrwxrwxrwx. 1 mattdm mattdm 8 Dec 17 19:44 www -> /srv/www
$ jd tmp
$ pwd
/home/mattdm/tmp
$ jd WORK
/home/mattdm/work
Et, pour une dose supplémentaire de fantaisie, faites la jd
liste de tous vos raccourcis lorsqu'ils sont exécutés sans aucun paramètre:
jd()
{
if [[ -z "$1" ]]; then
(cd ~/.shortcuts; stat -c '%N' *)
else
cd -P ~/.shortcuts/$1
fi
}
Remarque: j'utilise compgen -W $( cmd )
au lieu de compgen -C 'cmd'
car ce dernier ne fonctionne jamais pour moi et je ne comprends pas pourquoi. Cela pourrait être une nouvelle question pour moi. :)