ln -s con un percorso relativo a pwd

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

  • " … aiuta a immaginare che il collegamento simbolico creato contenga semplicemente del testo …. " Isn ' Questa è la verità letterale?
  • Lo è. Forse potrei cambiare imaginare in " sapere " o " capire ".
  • Forse mi sono (di nuovo) confuso. Sembra che dove dici " target " intendi " sorgente ". Largomento source_file (primo) è dove punta il collegamento, che è alla lettera ciò che inserisci nel comando. Largomento target_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 del source_file ma posizionato nella directory target_file.
  • Y̶o̶u̶ ' ̶r̶e̶ ̶r̶i̶g̶h̶t̶, ̶ ̶r̶he̶ ' s un errore nella RISPOSTA. pazzesco come esso didn ' t farsi prendere ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ No, la risposta è stata giusto. Secondo la ln manpage, target è il primo argomento (dove il collegamento punta a ) mentre il secondo argomento è semplicemente indicato come link (source non è menzionato).
  • In linux (gnu ln) il pagina man chiama il primo argomento target e il secondo link ( man7.org/ linux / man-pages / man1 / ln.1.html ). Ma in BSD (incluso OS X) il primo si chiama source e il secondo target ( freebsd.org/cgi/man.cgi?ln ). Abbastanza confuso.

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 standard ln è 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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *