Podrías usar tabulación completa. De manera predeterminada en muchas distribuciones de Linux, bash está configurado para que cuando presione la tecla [TAB], se le dé una lista de posibles coincidencias, o si solo hay una coincidencia, se completará. Para cd, normalmente es una lista de subdirectorios del directorio de trabajo actual. Podrías sobrescribir eso, pero te sugiero que hagas un alias, como jd
"jump directory":
alias jd=cd
y luego, definiendo los "marcadores" que desea como finalizaciones para jd. Mire la página de manual de bash para ver muchas más opciones (incluida la generación automática de los resultados sobre la marcha desde un comando o función), pero la forma más fácil es solo una lista de palabras, con -W
:
complete -W "/ srv / www ~ / tmp ~ / work" jd
Ahora, escriba jd
y presione [TAB], y verá sus "marcadores". Escriba cualquier parte ambigua y luego presione [TAB] para completar. (En lo anterior, la ~
s se expande a mi directorio de inicio, por lo que la primera [TAB] me da un /
, y si presiono w
y [TAB] nuevamente, /srv/www
se completa.)
Por supuesto, pon esto ~/.bash_profile
para que persista.
O podemos llevar esto al siguiente nivel. Haga un directorio ~/.shortcuts
, comenzando con un punto, estará oculto y no desordenará su directorio de inicio limpio y agradable, y llénelo con enlaces simbólicos a sus directorios deseados. Luego, pon esto en tu ~ / .bash_profile:
_list_shortcuts()
{
COMPREPLY=($( compgen -W "$( ls ~/.shortcuts )" -- ${COMP_WORDS[COMP_CWORD]} ))
}
jd()
{
cd -P ~/.shortcuts/$1
}
complete -F _list_shortcuts jd
Esto define una finalización un poco más complicada en la función _list_shortcuts
para construir la lista de nombres, y hace que jd
sea una función en lugar de un simple alias, ya que queremos que actúe de manera diferente a solo cd
. La -P
bandera cd
hace que resuelva los enlaces simbólicos, por lo que todo se vuelve magia transparente. Sus nombres de acceso directo ni siquiera tienen que coincidir con los objetivos.
Entonces:
$ 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
Y, para una dosis extra de fantasía, haga una jd
lista de todos sus atajos cuando se ejecute sin ningún parámetro:
jd()
{
if [[ -z "$1" ]]; then
(cd ~/.shortcuts; stat -c '%N' *)
else
cd -P ~/.shortcuts/$1
fi
}
Nota: uso en compgen -W $( cmd )
lugar de compgen -C 'cmd'
porque este último nunca funciona para mí y no entiendo por qué. Esa podría ser una nueva pregunta mía. :)