Risposte:
Un link simbolico in realtà memorizza il percorso fornito letteralmente, come una stringa¹. Ciò significa che il tuo link ~/mylinkcontiene " ." (un carattere). Quando accedi al collegamento, quel percorso viene interpretato in relazione alla posizione del collegamento, anziché a dove ti trovavi quando hai creato il collegamento.
Invece, è possibile memorizzare il percorso effettivo desiderato nel collegamento:
ln -s "$(pwd)" ~/mylink
utilizzando la sostituzione dei comandi per inserire l'output di pwd(il nome della directory di lavoro) nella riga di comando. lnvede il percorso completo e lo memorizza nel tuo link simbolico, che indicherà quindi il posto giusto.
¹ Più o meno.
Dovresti usare:
ln -s "$(cd . && pwd)" ~/mylink
o:
ln -s "$(pwd -P)" ~/mylink
per ottenere il risultato giusto per la directory di lavoro corrente. Può essere cambiato mentre ci lavoravi come in questa domanda .
$PWD(il percorso che ha usato per arrivarci), piuttosto che $(pwd -P)(il percorso canonico alla directory corrente). Se $PWDnon punta più alla directory corrente, non si può dire che lo $(pwd -P)farà neanche nel prossimo minuto.
"$PWD"avere ancora il vecchio valore se la directory corrente viene spostata. PWDimpostato solo quando cdo inizializzato dalla shell.
cd non è garantito che la chiamata $ PWD o l'output di pwd un percorso alla directory corrente. Stai cercando di proteggerti da qualcosa che non è probabile che accada, ma nella prima soluzione, non è necessariamente efficace, e nella seconda, sta cambiando il comportamento.
mv dopo che fai ln, allora si finisce nella stessa situazione. D'altra parte, se lo ha fatto cd /long/logical/path/to/some/directory, non si desidera che il collegamento punti /vg0/lv1/user2/app4(il percorso canonico) in quanto il collegamento punterà al posto sbagliato quando /long/logical/path/to/some/directorypunta verso un altro luogo.
"$PWD"in shell POSIX e~0inzsh.