¿Puedo usar cd ../ .. como nombre de alias?

11

Estoy usando Windows y Ubuntu en paralelo y hago cosas de consola en ambos.

En Windows puedo hacer un

C:\Users\Thomas>cd..\..
C:\>

Sin embargo, en Linux esto no funciona, ni con barras invertidas ni con barras diagonales.

21:17:10 $ cd../..
bash: cd../..: No such file or directory

Como a menudo cometo ese error, he tratado de definir un alias .bash_aliasespara esa situación:

alias cd../..='cd ../..'
alias cd..\..='cd ../..'

Cuando comienzo una nueva fiesta, me sale

21:16:26 $ bash
bash: alias: `cd../..': invalid alias name

¿Cómo configuraría alias cd..\..y cd../..correctamente?

El cd..\..parece tener problemas con el personaje de escape:

21:39:43 $ cd..\..
bash: cd....: command not found

No funciona, incluso si defino otro alias para cd.....

Thomas Weller
fuente
2
No puedes Un comando, alias o nombre de archivo no puede contener el /carácter. La \ versión, por otro lado, debería funcionar bien.
fkraiem
@fkraiem: Parece que la versión de barra diagonal inversa tiene problemas como carácter de escape Se actualizó la pregunta.
Thomas Weller
Oh por cierto. De man bash: Los caracteres /, $, `y = y cualquiera de los metacaracteres de shell o los caracteres de comillas enumerados anteriormente pueden no aparecer en un nombre de alias.
fkraiem
Maldición. Lo intenté man aliasy no existía. Si das eso como respuesta, lo aceptaré.
Thomas Weller
Los alias son una cosa, las funciones de shell son otra. Echa otro vistazo.
alexis

Respuestas:

10

/y se \encuentran entre los caracteres que no pueden aparecer en un nombre de alias Bash. De man bash:

Los caracteres /, $`, y =cualquiera de los metacaracteres de shell o los caracteres de comillas enumerados anteriormente pueden no aparecer en un nombre de alias.

Como solución alternativa, puede cambiar a Zsh, que permite ambos:

% grep 'alias.*cd' .zshrc 
alias cd../..='cd ../..'
alias cd..\\..='cd ../..'
% pwd
/Users/firas
% cd../..
% pwd
/ 
% cd
% pwd
/Users/firas
% cd..\..
% pwd
/
fkraiem
fuente
12

No puedes usar barras en un nombre de alias. Sin embargo, Bash los permite en los nombres de funciones, por lo que puede hacer que sea una función:

cd../.. () { cd ../..; }

No puede usar barras invertidas en un alias o nombre de función. El carácter de barra diagonal inversa cita el siguiente carácter, por lo que cd..\..se analiza como cd...., mucho antes de que esa cadena se busque como un nombre de comando. Si desea llamar a un comando llamado cd..\.., tiene que escribir cd..\\.., 'cd..\..'o algo equivalente. Además, un nombre de comando que se citó de alguna manera no se considera para la búsqueda de alias, por lo que nunca puede usar un nombre de alias que contenga una barra diagonal inversa. Bash tampoco permite barras invertidas en los nombres de las funciones. Como cd..\..se analiza como cd...., puede definir una función llamada cd....(como arriba).

Si usa el cdcomando, tendrá que escribir el espacio después de él, como cualquier otro comando. Pero puede guardar la escritura al no escribir cden absoluto. Establezca la autocdopción con la siguiente línea en ~/.bashrc:

shopt -s autocd

Luego puede escribir un nombre de directorio en la línea de comando, y "ejecutar" ese directorio cambiará a él.

~/some/sub/directory$ ../..
~/some$ 
Gilles 'SO- deja de ser malvado'
fuente
Si hago shoptesto, probablemente extrañaré esa funcionalidad en Windows pronto :-)
Thomas Weller
Um, eso no es cierto. Las barras se aceptan en los nombres de funciones bash.
alexis
@alexis Ah, cierto, puedes usar barras en bash. Fijo, gracias.
Gilles 'SO- deja de ser malvado'
@ThomasW. Por supuesto que lo harás. autocdfue una de las razones por las que cambié a zsh, cuando bash no lo tenía. La única forma decente de usar Windows es instalar Cygwin de todos modos, completo con zsh.
Gilles 'SO- deja de ser malvado'
5

"¿No puedes usar barras en un alias o nombre de función "? Eso es nuevo para mí. He estado usando la siguiente función de shell durante años en Linux y OS X bash, y nunca tuve ningún problema:

function ../.. { cd ../..; echo "$PWD"; }

Naturalmente, también cd../..es un buen nombre de función. Se puede usar una barra oblicua en un nombre de función de shell.

En cuanto a la versión de barra diagonal inversa, no puede incrustarla en un alias o nombre de función, pero no tiene que: Cuando escribe cd..\.., bash interpreta la barra diagonal inversa como un escape e intenta ejecutar el resultado cd..... Así que defina eso y podrá hacer todo lo que buscaba. De nada.

function cd.... { cd ../..; } 
alexis
fuente
2

Si desea mantener los alias, ¿por qué no simplemente hacer lo siguiente?

alias   ..='cd ..'
alias  ...='cd ../../' 
alias ....='cd ../../../'

O, si usted necesita ir camino de regreso:

alias   .3='cd ../../../' 
alias   .4='cd ../../../../'
alias   .5='cd ../../../../../'
# how far back do you need to go on a normal basis..?

No tengo idea de qué tan bien eso te ayuda a mantenerte mentalmente sincronizado con tu cerebro de Windows, pero esto todavía parece una manera simple de hacerlo. (Al menos para aquellos de nosotros que tenemos la suerte de no tener que preocuparnos por cómo se hacen las cosas en Windows).

jon
fuente