-s con un percorso relativo a pwd


26

Sto cercando di creare un mucchio di collegamenti simbolici, ma non riesco a capire perché questo funzioni

ln -s /Users/niels/something/foo ~/bin/foo_link

mentre questo

cd /Users/niels/something
ln -s foo ~/bin/foo_link

non è.

Credo che abbia qualcosa a che fare con il foo_linkcollegamento a foo in /Users/niels/bininvece di/Users/niels/something

Quindi la domanda è: come faccio a creare un collegamento simbolico che punta a un percorso assoluto, senza effettivamente digitarlo?

Per riferimento, sto usando Mac OS X 10.9 e Zsh.

Risposte:


33

Il modo più semplice per collegarsi alla directory corrente come percorso assoluto, senza digitare l'intera stringa del percorso sarebbe

ln -s "$(pwd)/foo" ~/bin/foo_link

Il target(primo) argomento per il ln -scomando funziona in relazione alla posizione del collegamento simbolico, non alla directory corrente. Aiuta a sapere che, in sostanza, il collegamento simbolico creato (il secondo argomento) contiene semplicemente il testo fornito per il primo argomento.

Pertanto, se si esegue quanto segue:

cd some_directory
ln -s foo foo_link

e quindi spostare quel collegamento

mv foo_link ../some_other_directory
ls -l ../some_other_directory

vedrai che foo_link cerca di puntare foonella 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

e poi passa yet_another_linka un'altra 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 link digitando

ln -s foo ~/bin/foo_link

foo_linkcontiene solo un link foo, relativo alla sua posizione. Mettere $(pwd)davanti al nome dell'argomento target aggiunge semplicemente il percorso assoluto della directory di lavoro corrente, in modo che il collegamento venga creato con un target assoluto.


"... aiuta a immaginare che il link simbolico creato contenga semplicemente testo ...." Non è questa la verità letterale?
Carattere jolly

1
È. Forse potrei cambiare immaginare di "conoscere" o "capire".
Achilleas,

Forse mi sono confuso (di nuovo). Sembra dove dici "target" intendi "fonte". Il source_file(primo) argomento è il punto in cui punta il link, che è letteralmente quello che inserisci nel comando. Il target_file(secondo) argomento diventa il nome del collegamento a meno che ciò che si inserisce non sia una directory, nel qual caso il nome del collegamento è lo stesso del nome base del source_filema inserito nella directory target_file.
Charlie Gorichanaz,

Hai ragione, ̶ Theres un errore nel RISPOSTA. pazzo come si ragione't farsi prendere ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ No, la risposta è stata giusta. Dal lnmanpage, targetè il primo argomento (dove i punti di collegamento a ), mentre il secondo argomento è semplicemente indicati come link( sourcenon è menzionato).
Achilleas,

3
In linux (gnu ln) la pagina man chiama il primo argomento targete il secondo link( man7.org/linux/man-pages/man1/ln.1.html ). Ma in BSD (incluso OS X) viene chiamato il primo sourcee il secondo target( freebsd.org/cgi/man.cgi?ln ). Abbastanza confuso.
cristoper,

5

L'uso del flag -r( --relative) farà funzionare questo:

ln -sr foo ~/bin/foo_link

4
Attenzione che -rè un GNUismo, cioè non POSIX, quindi non funzionerà nel caso OP poiché il lncomando OS X standard è basato su BSD.
jlliagre,

2

Per salvare un po 'di battitura, puoi farlo

ln -s "$PWD"/foo ~/bin/foo_link

@Freddy, dipende dalla shell. In fish o zsh, sarebbe OK. In Bourne-come gusci tra bash e con il valore di default di $ IFS, SPC sarebbe davvero un problema, ma anche TAB, NL e tutti i caratteri globbing (almeno *, ?e [...]).
Stéphane Chazelas,

@ StéphaneChazelas Sì, hai ragione e la domanda è taggata bash, quindi è generalmente una buona idea citarla. Mio male, avrei dovuto essere più specifico.
Freddy,

0

Che ne dite di:

 $ cd /Users/niels/something
 $ ln -s ./foo ~/bin/foo_link

1
No, non fa il trucco.
Niels B.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.