Risposte:
Un link simbolico in realtà memorizza il percorso fornito letteralmente, come una stringa¹. Ciò significa che il tuo link ~/mylink
contiene " .
" (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. ln
vede 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 $PWD
non 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. PWD
impostato solo quando cd
o 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/directory
punta verso un altro luogo.
"$PWD"
in shell POSIX e~0
inzsh
.