Î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
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 standardln
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.
source_file
(primul) este punctul către care indică legătura, care este textual ceea ce introduceți pe comandă. Argumentultarget_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ă alsource_file
, dar plasat în directorultarget_file
.ln
pagina de manual,target
este primul argument (unde legătura indică către ) în timp ce al doilea argument este pur și simplu denumitlink
(source
nu este menționat).target
și al doilealink
( man7.org/ linux / man-pages / man1 / ln.1.html ). Dar în BSD (inclusiv OS X) primul se numeștesource
și al doileatarget
( freebsd.org/cgi/man.cgi?ln ). Destul de confuz.