¿Se puede alias ',,' a '..'?

41

A veces, cuando quiero cambiar al directorio principal, escribo por error en cd ,,lugar de cd ... ¿Hay alguna manera de hacer que bash considere que estas declaraciones son las mismas? Nunca uso comas en mis comandos. Idealmente, me gustaría poner un alias ,,a ... Cuando intenté esto, no funcionó. ¿Por qué no funcionó esto? ¿De qué otra forma puedo abordar este problema?

$ alias ,,=..
$ cd ,,
-bash: cd: ,,: No such file or directory
kilojulios
fuente
66
Un alias es un programa para ejecutar, no un argumento para el programa; por lo que $ ,,se queja, tales como: bash: ..: Is a directory. (En otras palabras, no es un ejecutable.)
jpaugh
55
@jpaugh: Una forma más clara de decir eso es: la expansión de alias solo ocurre en la primera "palabra" de un comando. Entonces, como dices, solo funciona para los nombres de comandos, no para los argumentos. (Y ni siquiera pudiste alias 'cd ,,'='cd ..'. Bueno, podrías, pero tendrías que ejecutarlo como cd\ ,,si fuera una sola palabra.)
Peter Cordes
55
Considera zsh. Tiene alias globales, así alias -g ,,=..y cd ,,funciona como se espera que lo haga.
muru
1
Pensamiento lateral: find / -type d -exec ln -s .. {}/,, \;... ;-)
Toby Speight
2
Imho: no hagas esto. Usar alias para ocultar errores tipográficos es una mala práctica. Esos errores pueden terminar en código copiado o screencasts. No funcionará en otros hosts o cuentas. Y dicha modificación (dependiendo de cómo se implemente) podría causar otros errores inesperados y difíciles de depurar. Mi sugerencia: si escribe mal un comando, simplemente escríbalo de nuevo ;-).
jjmontes

Respuestas:

45

ZSH:

Si está usando zsh alias -g ,,=".."es lo que necesita, pero esto hará que ",," se expanda a todas partes, no solo cuando se use con cd.

De man zshbuiltins:

Si la -g bandera está presente, defina un alias global; los alias globales se expanden incluso si no ocurren en la posición del comando.

GOLPETAZO:

Si está restringido a bash(ya que la pregunta está etiquetada con ), lea lo siguiente:

Esta es una solución de alias puro, según lo solicitado, sin embargo , esto hará más de lo necesario, posiblemente frustrando al usuario (vea la advertencia al final de mi publicación).

Citando man bash:

Si el último carácter del valor de alias está en blanco, entonces la siguiente palabra de comando que sigue al alias también se verifica para la expansión de alias.

Por lo tanto, es suficiente alias cdcon un espacio adicional (para permitir la expansión de su próximo argumento) y luego alias ,,a ... Mira eso

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

da exactamente lo que necesitas.

Tenga en cuenta que esto es correcto no solo para bash(y su aliasimplementación), sino para todos los shells compatibles con POSIX. Citando un ejemplo de man 1p alias(el manual no describe esta característica explícitamente, solo a través de un ejemplo):

  1. Configure nohup para que pueda lidiar con un argumento que en sí mismo es un nombre de alias:

           alias nohup="nohup "

Advertencia: como @PeterCordes escribe en su comentario, automáticamente hará que otros alias se expandan cuando se escriban después cd. Puede requerir que escriba cd \grepsi desea cambiar el directorio a uno con nombre, greppero su grepes un alias para grep --color=auto. Sin la barra invertida, cdse informará de un error de "demasiados argumentos" (¡no puede hacerlo cden dos directorios a la vez!).

mosca de espuma de poliestireno
fuente
22
Es un truco inteligente pero desagradable. No me gustaría hacer eso; demasiado fácil para que te muerda accidentalmente. por ejemplo, si tiene un alias para un comando que normalmente ejecuta y desea cdingresar a un directorio de su código fuente. U otras colisiones entre sus alias y nombres de directorio comunes. Me cd drgustaría ampliar cd disown -rpara mí, con este alias. De todos modos, es mucho mejor anular builtin cdcon una función para cosas como esta, IMO.
Peter Cordes
8
+1 para la solución de alias puro (aprendí algo). Al mismo tiempo, estoy de acuerdo con el comentario de Peter. Creo que debería agregarse algún tipo de advertencia explícita a su respuesta.
Kamil Maciorowski
58

Los alias no están destinados a hacer esto, pero puede crear una función llamada cdque sea un contenedor para lo real cd. ¡Esta funciona para mí! Simplemente colóquelo en su .bash_profilearchivo de perfil o de su elección.

cd () { if [ "$1" = ",," ]; then builtin cd ..; else builtin cd "$@"; fi; }

O, con comentarios y formato bonito:

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
}

EDITAR

Gracias @derobert por señalar que if then elsees mejor aquí que && ||. Además, me acabo de dar cuenta ( * facepalm *) de que esta implementación solo funcionará si los argumentos que no son de ruta (es decir -L -P) no son el primer argumento. Así que ten cuidado, si tienes la mala costumbre de escribir, cd -L ,,esto no te ayudará. Y eso no es trivial de manejar correctamente, creo.

BenjiWiebe
fuente
16
@BenjiWiebe Creo que la versión de "comentarios y formato bonito" sería mejor con un if-then-else.
zwol
Wow amigos, muchas buenas ideas. Veo que está utilizando la función de edición para encargarse de las correcciones necesarias. No pasé mucho tiempo probándolo. :)
BenjiWiebe
1
Alternativamente, simplemente sobrescriba $1antes de ejecutar el incorporado:cd () { [ "$1" = ",," ] && set .. ; cd "$@"; }
Toby Speight
1
@TobySpeight set .. "${@:2}", o pierdes algo después del primer argumento.
chepner
8
Además, técnicamente ..no tiene que ser el primer argumento; cden bashpuede tomar una variedad de opciones ( -P, -L, -@, -e).
chepner
29

Los alias deben ser la primera palabra de un comando. Además, el alias debe ser sustituido por una palabra, por lo tanto, sin espacios).

Manual de referencia de Bash: alias

Los alias permiten que una cadena se sustituya por una palabra cuando se usa como la primera palabra de un comando simple.

Podrías alias ambos ..y ,,ser cd ...

$ alias ..="cd .."
$ alias ,,="cd .."
$ cd /tmp && pwd
/tmp
$ ,, && pwd
/
Steven
fuente
Eso es exactamente lo que hago! : D estos dos puntos / comas son mucho más fáciles de escribir quecd ..
rav_kr
10
+1, esa no es una mala idea en absoluto. Otra forma de hacerlo .. en Bash es con la shopt -s autocdque le permite cambiar a cualquier directorio simplemente ingresando su nombre. Por supuesto que sigues siendo el alias para,,
ilkkachu
Yo también :-)
joeytwiddle
3

Otra forma de ..cambiar el directorio es habilitar la autocd función de Bash :

shopt -s autocd 

Eso cambiará automáticamente el directorio cuando ingrese el nombre de uno:

~$ /tmp
cd /tmp
/tmp$ 

Todavía tiene que crear un alias, ,,pero eso se puede hacer con soloalias ,,=..

ilkkachu
fuente
2

Ya hay una aplicación con un script para eso: https://github.com/shyiko/commacd (sin afiliación con Stanley Shuyiko).

commacdexporta tres comandos: ,(para saltar hacia adelante), ,,(hacia atrás) y ,,,(hacia atrás + adelante):

Los tres intentan hacer coincidir por prefijo primero. Solo si no se encuentran resultados, recurrirán a la coincidencia de subcadena (difusa)

Para responder a su pregunta, el script alias comas a tres funciones que define:

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