¿Cómo hacer un "alias" para un camino largo?

95

Traté de crear un "alias" para una ruta que utilizo a menudo mientras escribo en shell. Intenté algo, pero falló:

myFold="~/Files/Scripts/Main"
cd myFold

bash: cd: myFold: No such file or directory

¿Cómo lo hago funcionar?
Sin embargo, cd ~/Files/Scripts/Mainfunciona.

bashboy
fuente

Respuestas:

120

Dado que es una variable de entorno (el alias tiene una definición diferente bash), debe evaluarlo con algo como:

cd "${myFold}"

o:

cp "${myFold}/someFile" /somewhere/else

Pero en realidad me resulta más fácil, si solo desea la facilidad de cambiar a ese directorio, crear un alias real (en uno de los basharchivos de inicio como .bashrc), para que pueda ahorrar pulsaciones de teclas:

alias myfold='cd ~/Files/Scripts/Main'

Entonces puedes usar (sin el cd):

myfold

Para deshacerse de la definición, usa unalias. La siguiente transcripción muestra todos estos en acción:

pax> cd ; pwd ; ls -ald footy
/home/pax
drwxr-xr-x 2 pax pax 4096 Jul 28 11:00 footy

pax> footydir=/home/pax/footy ; cd "$footydir" ; pwd
/home/pax/footy

pax> cd ; pwd
/home/pax

pax> alias footy='cd /home/pax/footy' ; footy ; pwd
/home/pax/footy

pax> unalias footy ; footy
bash: footy: command not found
paxdiablo
fuente
Gracias. Eso funciona. Intenté solo alias myfold = '~ / some / path' y cd myfold. Recibo un error: no existe ese directorio. Por qué ? Además, ¿es posible "desasignar" una variable de alias?
bashboy
myfold = '~ / some / path' cd "$ myfold" Falla. Por qué ?
bashboy
1
@bashboy, probablemente porque no tienes un directorio con ese nombre. ~ / some / path fue un ejemplo, debe sustituir la ruta real que desea utilizar. Lo cambiaré para usar su directorio de ejemplo para que sea más claro. En cuanto a cómo anular la asignación de un alias, utilice el comando unalias. También actualicé la respuesta con una transcripción, incluido el uso de ese comando.
paxdiablo
¿Cómo conservaría este alias en diferentes sesiones de terminal? Cuando abro una nueva pestaña e intento usar este alias, no funciona.
goldisfine
4
@goldisfine, vea mi paréntesis in one of the bash startup files like .bashrc. Poner el alias en un archivo de inicio adecuado asegurará que esté disponible para todas las sesiones.
paxdiablo
74

Hay una opción de shell cdable_vars:

cdable_vars
Si se establece, cdse asume que un argumento del comando incorporado que no es un directorio es el nombre de una variable cuyo valor es el directorio al que cambiar.

Podrías agregar esto a tu .bashrc:

shopt -s cdable_vars
export myFold=$HOME/Files/Scripts/Main

Observe que reemplacé la tilde con $HOME; las comillas impiden la expansión de tilde y Bash se queja de que no hay un directorio ~/Files/Scripts/Main.

Ahora puedes usar esto de la siguiente manera:

cd myFold

No es $necesario. Ese es el punto, en realidad, como se muestra en otras respuestas, cd "$myFold"funciona sin la opción de shell. cd myFoldtambién funciona si la ruta en myFoldcontiene espacios, no se requieren comillas.

Por lo general, esto incluso funciona con el autocompletado de pestañas como la _cdfunción en bash_completionverifica si cdable_varsestá configurada, pero no todas las implementaciones lo hacen de la misma manera, por lo que es posible que tenga que bash_completionvolver a buscar en su .bashrc(o editar /etc/profilepara configurar la opción de shell).


Otros shells tienen opciones similares, por ejemplo, Zsh ( cdablevars).

Benjamin W.
fuente
1
¿Existe un equivalente de esto para ZSH?
Ryan Stull
1
@RyanStull setopt cdablevarsparece que podría serlo, pero no sé nada de zsh.
Benjamin W.
@JohnMee Revertiré su edición, ya que a) la opción se llama de manera diferente en zsh (sin guión bajo) b) la pregunta etiquetada solo Bash yc) enlace al manual de Bash. Sin embargo, agregaré un párrafo para mencionar las otras conchas.
Benjamin W.
1
¡Qué gran respuesta! Muchas gracias por elcdable_vars
Lucas P.
1
@Vladislav Tenga en cuenta que eso rompe la finalización cdproporcionada por bash-completamiento, que usa la _cdfunción ( complete -o nospace -F _cd cd). Agregar -va eso (para completar en variables) funciona, pero puede tener efectos secundarios no deseados; para mí, muestra mi entorno completo cuando finalizo la pestaña.
Benjamin W.
10

Quizás sea mejor usar enlaces

Enlace suave

Enlace simbólico o suave (archivos o directorios, más flexible y autodocumentado)

#      Source                            Link
ln -s /home/jake/doc/test/2000/something /home/jake/xxx

Enlace duro

Enlace fijo (solo archivos, menos flexible y no autodocumentado)

#    Source                            Link
ln /home/jake/doc/test/2000/something /home/jake/xxx

Cómo crear un enlace a un directorio

Sugerencia : si no necesita ver el enlace en su casa, puede comenzar con un punto. ; luego estará oculto de forma predeterminada y luego podrá acceder a él como

cd ~/.myHiddelLongDirLink
Mahmoud Bahnasy
fuente
9

Puede agregar las rutas que desee a la tabla hash de su bash:

hash -d <CustomName>=<RealPath>

Ahora podrás hacerlo cd ~<CustomName>. Para hacerlo permanente, agréguelo a su script bashrc .

Tenga en cuenta que esta tabla hash está destinada a proporcionar un caché para que bash no necesite buscar contenido cada vez que se ejecuta un comando, por lo que esta tabla se borrará en eventos que invaliden el caché, por ejemplo, modificando $PATH.

Rodrigo Martins de Oliveira
fuente
2
Creo que solo funcionará en zshpero no en bash.
sergej
Esta es la mejor respuesta en mi humilde opinión, pero es cierto que zshsolo funciona, al menos en mi sistema Ubuntu.
John Stewart
6

En primer lugar, debe eliminar las comillas:

bashboy@host:~$ myFolder=~/Files/Scripts/Main

Las comillas evitan que el shell expanda la tilde a su significado especial de ser su $HOMEdirectorio.

A continuación, podría utilizar $myFolderun entorno una variable de shell:

bashboy@host:~$ cd $myFolder
bashboy@host:~/Files/Scripts/Main$

Para crear un alias , debe definir el alias:

alias myfolder="cd $myFolder"

Luego puede tratar esto como un comando:

bashboy@host:~$ myFolder
bashboy@host:~/Files/Scripts/Main$
David W.
fuente
En realidad, no es una variable de entorno a menos que usted export.
Keith Thompson
1
@KeithThompson De acuerdo, es solo una variable de shell . Pero no desea exportarlo porque no quiere que afecte posiblemente a los procesos secundarios. Usted lo define de esta manera en su .bashrcarchivo de recursos o en cualquier otro que utilice, y se definirá en el shell inmediato, pero no en los scripts de shell.
David W.
Prefiero estas soluciones porque funciona con la finalización automática
Vassilis
5

Primero, necesita $acceder al valor de "myFold" para que el código de la pregunta funcione:

cd "$myFold"

Para simplificar esto, crea un alias en ~/.bashrc:

alias cdmain='cd ~/Files/Scripts/Main'

No olvide obtener .bashrcuna vez para que el alias esté disponible en la sesión actual de bash:

source ~/.bashrc

Ahora puede cambiar a la carpeta usando:

cdmain
hek2mgl
fuente
4

Otra opción sería utilizar un enlace simbólico. es decir:

ln -s ~/Files/Scripts/Main ~/myFold

Después de eso, puede realizar operaciones para ~/myFold, como:

cp some_file.txt ~/myFold

que pondrá el archivo en formato ~/Files/Scripts/Main. Puede eliminar el enlace simbólico en cualquier momento con rm ~/myFold, que mantendrá el directorio original.

D VJ
fuente
Una desventaja: si es cd myFoldasí pwd, mostrará que está en myFold. Esto es un factor decisivo para mí porque los comandos relativos con el control de fuente p4 dependen del directorio actual.
User5910
1
@ User5910 - usepwd -P
dvj
2

pero también es posible un alias real para un directorio, intente

 myScripts="~/Files/Scripts/Main"
 alias myScripts="cd $myScripts"

De esta manera tiene una convención de nomenclatura común (para cada par de directorio / alias), y si necesita copiar algo del directorio actual a myScripts, no tiene que pensar en ello.

IHTH

shellter
fuente
1

Las respuestas anteriores que probé no permiten la expansión automática (autocompletado) de los subdirectorios del directorio con alias.

Sin embargo, si empuja el directorio al que desea asignar un alias en la dirspila ...

$ pushd ~/my/aliased/dir

... luego puede escribir dirs -vpara ver su posición numérica en la pila:

 0  ~/my/aliased/dir
 1  ~/Downloads
 2  /media/usbdrive

y consúltelo usando ese número para la mayoría, si no todos los comandos que esperan un parámetro de directorio:

 $ mv foo.txt ~0  

Incluso puede utilizar Tabpara mostrar los subdirectorios inmediatos del directorio "alias":

 $ cd ~0/<Tab>
 child_dir1    child_dir2
chb
fuente
-1

Pon la siguiente línea en tu myscript

set myFold = '~/Files/Scripts/Main'

En el uso terminal

source myscript
cd $myFold
Chayan Pathak
fuente