pnd'ye göre yolu olan ln -s


26

Bir sürü sembolik bağ kurmaya çalışıyorum ama bunun neden işe yaradığını çözemiyorum

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

bu süre

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

değil.

Bunun yerine foo_linkfoo ile bağlantı kurmakla ilgisi olduğuna inanıyorum /Users/niels/bin./Users/niels/something

Öyleyse asıl soru, gerçekte yazmadan, mutlak bir yola işaret eden sembolik bir bağlantıyı nasıl oluşturabilirim?

Başvuru için Mac OS X 10.9 ve Zsh kullanıyorum.

Yanıtlar:


33

Geçerli dizine mutlak bir yol olarak bağlanmanın en kolay yolu, tüm yol dizesini yazmadan

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

targetİçin (ilk) argüman ln -skomutu sembolik bağlantının konumu değil, mevcut dizinine göre çalışır. Temelde, oluşturulan sembolik bağlantının (ikinci argüman) , ilk argüman için sağladığınız metni tuttuğunu bilmek yardımcı olur .

Bu nedenle, aşağıdakileri yaparsanız:

cd some_directory
ln -s foo foo_link

ve sonra bu bağlantıyı hareket ettir

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

Eğer göreceksiniz foo_link çalışır işaret edecek foodizinde o ikamet olduğunu. Bu aynı zamanda göreli yollar gösteren sembolik bağlantıları ile çalışır. Aşağıdakileri yaparsanız:

ln -s ../foo yet_another_link

ve sonra yet_another_linkbaşka bir dizine gidin ve nereye işaret ettiğini kontrol edin, daima işaret ettiğini görürsünüz ../foo. Amaçlanan davranış budur, çünkü çoğu zaman sembolik bağlantılar, çeşitli mutlak yollarda bulunabilecek bir dizin yapısının bir parçası olabilir.

Senin durumunda, yazarken bağlantıyı oluştururken

ln -s foo ~/bin/foo_link

foo_linksadece konumuna göre bir bağlantı tutar foo. $(pwd)Hedef bağımsız değişkenin adının önüne koymak , geçerli çalışan yöneticinin mutlak yolunu ekler, böylece bağlantı mutlak bir hedefle oluşturulur.


“... yaratılan sembolik bağlantının sadece metni tuttuğunu hayal etmeye yardımcı olur ....” Bu gerçek değil mi?
Joker

1
Bu. Belki de "bilmek" veya "anlamak" için hayal edebiliyorum .
Achilleas

Belki kendimi karıştırdım (yine). "Hedef" dediğin yerde "kaynak" demek istiyorsun. source_file(İlk) argüman aynen komuta girdiğiniz budur, bağlantının nereye puandır. target_fileNe girmek bağlantı ismi basename aynıdır ve bu durumda bir dizin, olmadıkça (ikinci) bağımsız değişken bağlantının adı olur source_fileama dizinde yerleştirilir target_file.
Charlie Gorichanaz

Haklısın, ̶ ̶t̶h̶e̶r̶e̶'̶s̶ bir hata, The ̶a̶n̶s̶w̶e̶r̶.̶ deli nasıl didn'to olsun yakalandı ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ Hayır, cevap haklıydı. Tarafından lnman, target(bağlantı noktası ilk parametre için ikinci bağımsız değişken ise) sadece olarak ifade edilir link( sourcesözü değildir).
Achilleas

3
Linux'ta (gnu ln) man sayfası ilk argümanı targetve ikincisini link( man7.org/linux/man-pages/man1/ln.1.html ) çağırır . Ancak BSD'de ( OS X dahil), ilk sourceve ikinci target( freebsd.org/cgi/man.cgi?ln ) denir . Oldukça kafa karıştırıcı.
cristoper

5

-r( --relative) İşaretini kullanmak bu işi yapacaktır:

ln -sr foo ~/bin/foo_link

4
Bunun -rbir GNUism, yani POSIX olmadığına dikkat edin , standart OS X lnkomutu BSD tabanlı olduğundan OP durumunda çalışmaz .
jlliagre

2

Yazmak için bazı işlemleri yapabilirsiniz.

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

@ Freddy, kabuğa bağlıdır. Balık veya zsh'de, sorun olmaz. Bourne benzeri bash $ ve IFS varsayılan değeri ile dahil kabukları, SPC gerçekten de TAB, NL ve tüm globbing karakterleri (en azından bir sorun olurdu ama içinde *, ?ve [...]).
Stéphane Chazelas

@ StéphaneChazelas Evet, haklısınız ve soru etiketlendi bash, bu yüzden genellikle alıntı yapmak iyi bir fikir. Benim hatam, daha spesifik olmalıydım.
Freddy,

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.