¿Cuál es la forma correcta de hacer enlaces simbólicos con respecto a las routes de files llenos o acortados y confiando en la expansión "token"

Enlaces Simbólicos

Me está costando entender los enlaces simbólicos. Creo que entiendo la premisa básica, esencialmente es un alias .

Sin embargo, ¿depende de qué directory de trabajo se encuentre cuando lo haga sobre cómo funciona, suponiendo que está dejando que el directory de trabajo actual juegue en la creación del enlace simbólico?

El command actual que estoy usando es ln -s

Ejemplos de escenarios

Tengo algunos proyectos en GitHub, algunos de ellos son pequeños scripts simples que he escrito y que almaceno en ~ / bin. ~ / bin está en mi variable de entorno $ PATH para acceder fácilmente a llamar a estos scripts:

 $echo $PATH /Users/me/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin 

Acabo de notar que en mi installation de git parece que /usr/local/git/bin se ha agregado a mi $ PATH. Por el momento, voy a pretender que eso no sucedió.

Por ejemplo: ( hist es un script simple que muestra las statistics en mis commands usados ​​más recientemente )

 #/bin/bash history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n10 $hist 1 115 23% l 2 58 11.6% cd 3 44 8.8% ls 4 29 5.8% git 5 14 2.8% sudo 6 13 2.6% locate 7 12 2.4% open 8 11 2.2% wc 9 10 2% dt 10 9 1.8% rm 

Si realizo esta acción:

 $cd ~/bin $pwd $/Users/me/bin $ln -s hist ~/Desktop/hist $ls -la ~/Desktop/ $ls -la | grep hist lrwxr-xr-x 1 me staff 4 Sep 15 21:15 hist -> hist $cd ~/Deskop $hist 

Las palabras de command, pero la list de hist -> hist me preocupa, no proporciona información sobre dónde está la fuente real. No estoy seguro de poder mover el file a otra parte y seguirá funcionando.

Así que recientemente he adquirido el hábito de no usar ningún token de expansión al hacer enlaces simbólicos. No significando más ~ y ~ el estilo.

Incluso tuve que comenzar a hacer esto cuando comencé a usar GitHub, y estaba haciendo repositorys de mi .bash_profile , .bashrc , y .bash_history . Se estaba convirtiendo en un montón de trabajo cada vez que hacía un cambio en mi .bash_profile para luego convertirlo en mi repository local a ~/bin , y luego ejecutar source ~/bin/.bash_profile

Preguntas

¿Cuál es el procedimiento adecuado para esto con ln -s , o es puramente una cuestión de preference, y los resultados finales siempre funcionarán de la misma manera.

La buena noticia es que aprendí sobre la bandera -F a ln así que ya no recibiré un error si presiono el nombre del file que es el destino. La bandera -F le indicará a ln que escriba sobre ella, ahorrándome time de mv el file y luego ejecutar el command ln -s .

Referencia

Esto es lo que mi ~ / bin se parece en este momento, con muchos eliminados para mantenerlo simple:

 $l total 56 lrwxr-xr-x 1 me staff 53 Sep 15 20:40 hist -> /Users/me/Documents/me/git-projects/hist/hist lrwxr-xr-x 1 me staff 57 Sep 15 20:41 lcaser -> /Users/me/Documents/me/git-projects/lcaser/lcaser lrwxr-xr-x 1 me staff 70 Sep 10 05:12 mate -> /Applications/TextMate 1.x.app/Contents/ShanetworkingSupport/Support/bin/mate lrwxr-xr-x 1 me staff 56 Sep 15 20:42 tart -> /Users/me/Documents/me/git-projects/tart/tart.sh lrwxr-xr-x 1 me staff 69 Sep 15 20:44 watchinstall -> /Users/me/Documents/me/git-projects/watchInstall/watchInstall 

Considerar:

 ln -s target linkname 

La complicación ocurre solo cuando el target está especificado por una ruta relativa. Si lo es, entonces la ruta es relativa al directory que contiene el nombre de linkname file . El directory de trabajo actual siempre se ignora.

Como ejemplo, considere

 ln -s hist ~/Desktop/hist 

Este command crea un enlace llamado hist en ~/Desktop . Como no se da ninguna ruta para el objective, el destino se interpreta como que también está en el directory ~/Desktop . En este caso, eso significa que el enlace hist apunta a sí mismo.

Como otro ejemplo, considere

 cd /var/tmp ln -s ../hist ~/Desktop/hist 

Esto creará un enlace de ~/Desktop/hist a ~/hist porque el ../ se interpreta en relación con el directory que contiene el enlace, ~/Desktop . El directory en el que nos encontramos cuando se ejecuta el command ln y el directory en el que nos encontramos cuando accedemos a /Desktop/hist son irrelevantes.

Otra sutileza

No le importa lo que usa para el target cuando se emite el command: puede ser text arbitrario. El valor del target no se interpreta hasta que se intente acceder a linkname . Considerar:

 $ ln -s "mary had a little lamb" ~/file1 $ ls -alt ~/file1 lrwxrwxrwx 1 user group 22 Sep 15 21:47 /home/user/file1 -> mary had a little lamb $ cat ~/file1 cat: /home/user/file1: No such file or directory 

Si queremos podemos luego crear ese file:

 $ echo this is a test >~/"mary had a little lamb" $ cat ~/file1 this is a test 

De nuevo, la existencia del objective solo se verifica cuando se intenta acceder al enlace.

Documentación

Este comportamiento está documentado en man ln :

Los enlaces simbólicos pueden contener text arbitrario; si se resuelve más tarde, se interpreta un vínculo relativo en relación con su directory padre.