Sto cercando di creare un mucchio di collegamenti simbolici, ma non riesco a capire perché funziona
ln -s /Users/niels/something/foo ~/bin/foo_link
mentre questo
cd /Users/niels/something ln -s foo ~/bin/foo_link
non lo è.
Credo abbia qualcosa a che fare con il foo_link
collegamento a foo in /Users/niels/bin
anziché in /Users/niels/something
Quindi la domanda è: come faccio a creare un collegamento simbolico che punta a un percorso assoluto, senza effettivamente digitarlo?
Come riferimento, sto usando Mac OS X 10.9 e Zsh .
Risposta
Il modo più semplice per collegarsi alla directory corrente come percorso assoluto, senza digitare lintera stringa del percorso sarebbe
ln -s "$(pwd)/foo" ~/bin/foo_link
Il target
(primo) argomento per il ln -s
Il comando funziona in relazione alla posizione del collegamento simbolico, non alla directory corrente. Aiuta a sapere che, essenzialmente, il file creat ed symlink (il secondo argomento) contiene semplicemente il testo fornito per il primo argomento.
Pertanto, se fai quanto segue:
cd some_directory ln -s foo foo_link
e poi sposta il link
mv foo_link ../some_other_directory ls -l ../some_other_directory
vedrai che foo_link
cerca di puntare a foo
nella directory in cui risiede. Funziona anche con collegamenti simbolici che puntano a percorsi relativi. Se esegui le seguenti operazioni:
ln -s ../foo yet_another_link
, quindi sposta yet_another_link
in unaltra directory e controlla dove punta, vedrai che punta sempre a ../foo
. Questo è il comportamento previsto, poiché molte volte i collegamenti simbolici potrebbero far parte di una struttura di directory che può risiedere in vari percorsi assoluti.
Nel tuo caso, quando crei il collegamento digitando
ln -s foo ~/bin/foo_link
foo_link
contiene solo un link a foo
, relativo alla sua posizione. Mettendo $(pwd)
davanti allargomento di destinazione “s name si aggiunge semplicemente la directory di lavoro corrente” s percorso assoluto, in modo che il collegamento venga creato con un obiettivo assoluto.
Commenti
Rispondi
Utilizzando -r
(--relative
) farà funzionare questo:
ln -sr foo ~/bin/foo_link
Commenti
- Attenzione che
-r
è uno GNUismo, cioè non POSIX, quindi ' non funzionerà nel caso OP come OS X standardln
è basato su BSD.
Rispondi
Per salvare alcuni digitando, puoi fare
ln -s "$PWD"/foo ~/bin/foo_link
Commenti
- @Freddy, dipende dalla shell. In fish o zsh, andrebbe bene.Nelle shell simili a Bourne che includono bash e con il valore predefinito di $ IFS, SPC sarebbe effettivamente un problema, ma anche TAB, NL e tutti i caratteri globbing (almeno
*
,?
e[...]
). - @St é phaneChazelas Sì, tu ' ha ragione e la domanda è contrassegnata con
bash
, quindi ' è generalmente un buona idea citarlo. Colpa mia, avrei dovuto essere più specifico.
Risposta
Che ne dici:
$ cd /Users/niels/something $ ln -s ./foo ~/bin/foo_link
Commenti
- No, ' non funziona.
source_file
(primo) è dove punta il collegamento, che è alla lettera ciò che inserisci nel comando. Largomentotarget_file
(secondo) diventa il nome del collegamento a meno che ciò che inserisci non sia una directory, nel qual caso il nome del collegamento è lo stesso del nome di base delsource_file
ma posizionato nella directorytarget_file
.ln
manpage,target
è il primo argomento (dove il collegamento punta a ) mentre il secondo argomento è semplicemente indicato comelink
(source
non è menzionato).target
e il secondolink
( man7.org/ linux / man-pages / man1 / ln.1.html ). Ma in BSD (incluso OS X) il primo si chiamasource
e il secondotarget
( freebsd.org/cgi/man.cgi?ln ). Abbastanza confuso.