ln -s cu o cale relativă la pwd

Încerc să creez o grămadă de legături simbolice, dar nu pot să-mi dau seama de ce funcționează acest lucru

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

în timp ce aceasta

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

nu este.

Cred că are ceva de-a face cu foo_link conectarea la foo în /Users/niels/bin în loc de /Users/niels/something

Deci, întrebarea este: cum creez o legătură simbolică care indică o cale absolută, fără a o tasta de fapt?

Pentru referință, folosesc Mac OS X 10.9 și Zsh .

Răspuns

Cel mai simplu mod de a face legătura cu directorul curent ca o cale absolută, fără a tasta întregul șir de cale ar fi

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

Argumentul target (primul) pentru ln -s comanda funcționează relativ la locația legăturii simbolice, nu la directorul dvs. curent. Vă ajută să știți că, în esență, creatorul ed link simbolic (al doilea argument) conține pur și simplu textul pe care îl furnizați pentru primul argument.

Prin urmare, dacă faceți următoarele:

cd some_directory ln -s foo foo_link 

și apoi mutați acel link

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

veți vedea că foo_link încearcă să indice spre foo în directorul în care se află. Acest lucru funcționează și cu legături simbolice care indică căi relative. Dacă faceți următoarele:

ln -s ../foo yet_another_link 

și apoi mutați yet_another_link într-un alt director și verificați unde indică, veți vedea că indică întotdeauna ../foo. Acesta este comportamentul intenționat, deoarece de multe ori legăturile simbolice ar putea face parte dintr-o structură de directoare care poate locui pe diferite căi absolute.

În cazul dvs., când creați linkul tastând

ln -s foo ~/bin/foo_link 

foo_link deține doar un link către foo, relativ la locația sa. Punerea $(pwd) în fața numelui argumentului țintă adaugă pur și simplu directorul de lucru curent „s cale absolută, astfel încât linkul să fie creat cu o țintă absolută.

Comentarii

  • " … ajută la imagina că link-ul simbolic creat pur și simplu conține text …. " Isn ' nu acesta este adevărul literal?
  • Este. Poate că aș putea schimba imaginați-mă în " știu " sau " înțelege ".
  • Poate m-am confundat (din nou). Se pare că spui " target " vrei să spui " sursă ". Argumentul source_file (primul) este punctul către care indică legătura, care este textual ceea ce introduceți pe comandă. Argumentul target_file (al doilea) devine numele link-ului, cu excepția cazului în care ceea ce introduceți este un director, caz în care numele link-ului este același cu numele de bază al source_file, dar plasat în directorul target_file.
  • Y̶o̶u̶ ' ̶r̶e̶ ̶r̶i̶g̶h̶t̶, ̶ ̶t̶h̶e̶r̶e̶ ' Š o greșeală în ̶a̶n̶s̶w̶e̶r̶.̶ nebun cum se v- ' t fi prins ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ Nu, răspunsul a fost dreapta. Prin ln pagina de manual, target este primul argument (unde legătura indică către ) în timp ce al doilea argument este pur și simplu denumit link (source nu este menționat).
  • În linux (gnu ln) pagina manual apelează primul argument target și al doilea link ( man7.org/ linux / man-pages / man1 / ln.1.html ). Dar în BSD (inclusiv OS X) primul se numește source și al doilea target ( freebsd.org/cgi/man.cgi?ln ). Destul de confuz.

Răspuns

Utilizarea -r (--relative) steagul va face acest lucru:

ln -sr foo ~/bin/foo_link 

Comentarii

  • Feriți-vă că -r este un GNUism, adică non POSIX, astfel încât ' să nu funcționeze în cazul OP ca OS X standard ln este bazată pe BSD.

Răspuns

Pentru a salva unele tastând, puteți face

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

Comentarii

  • @Freddy, depinde de shell. La pește sau zsh, ar fi OK.În shell-urile de tip Bourne, inclusiv bash și cu valoarea implicită de $ IFS, SPC ar fi într-adevăr o problemă, dar și TAB, NL și toate caracterele globulare (cel puțin *, ? și [...]).
  • @St é phaneChazelas Da, tu ' este corect și întrebarea este etichetată cu bash, deci ' este, în general, o idee bună să o citez. Păcatul meu, ar fi trebuit să fiu mai specific.

Răspuns

Ce zici:

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

Comentarii

  • Nu, nu ' nu face truc.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *