Ln için parametre sırasını hatırlamak için ipuçları?


64

Ben kullandım lnyıllarca sembolik bağlantıları yazmak için ama yine de yanlış uzağa etrafında parametrelerin sırasını olsun.

Bu genellikle bana yazıyor:

ln -s a b

ve sonra kendime hatırlatmak için çıktıya bakıyorum.

Her zaman a -> b, tam tersi olduğunda okuduğum gibi olmayı hayal ediyorum b -> a. Bu, sezgisel olarak sezgiseldir, bu yüzden kendimi daima ikinci olarak tahmin ediyorum.

Doğru sırayı hatırlamama yardımcı olacak herhangi bir ipucu var mı?


11
bazen o bunu yazarken outloud söylemek için yardımcı "sembolik bağlantı ave diyoruz b"
jsotola

2
İkinci parametreyi cp ile olduğu gibi yaratır ve bağlantıyı yaratırsınız. Ancak yanlış anlarsanız endişelenmeyin, çünkü mevcut bir dosyanın veya sembolik bağlantının üzerine yeni bir bağlantı yazamazsınız.
sudodus


1
Bunu "kötü adamın takma adı" olarak düşünün. Her zaman önce gerçek adı, sonra takma adları ile anılır. Ör: Tony Baloney ve Oscar Meyer. Veya bağlantınız durumunda, ln -sab "Dosya-a, Dosya-b olarak da bilinir" anlamına gelir.
Scottie H

1
ln source target. Aynı cp source target, mv source target; ...
user207421

Yanıtlar:


40

Aşağıdakileri kullanıyorum: sadece hedefin gerekli olduğu ( hedefi bilmeden nasıl çalışabileceği için) ve mevcut dizinde bağlantıyı oluşturduğu için lntek bir argüman formuna ( manpage'de listelenen 2. form ) sahiptir . İki argüman formu, tek argüman formuna bir ektir, bu nedenle hedef her zaman ilk argümandır.lnln


3
Hedef / hedef yolu olmayan formun POSIX teknik özelliklerinin bir uzantısı olduğunu unutmayın ln.
Kusalananda

1
@kusa: 1971 kılavuzunu tek argüman formunda cevabımda gördünüz mü? 1971'de orada olsaydı posix'in bir uzantısı nasıl olurdu? --- "Eğer isim2 verilirse, bağlantıda bu isim var"

@SP Ne demek istediğinizi anladığımdan emin değilim. Tarihsel bir uygulamanın bir şekilde mevcut POSIX standardını geçtiğini mi söylüyorsunuz?
Kusalananda

1
Ben de görüyorum. En azından farklı isimler, aynı argümanlar. Gnu bu argüman adlarına sahip tek kişi olduğunu bilmiyordum.

2
Burada pek çok güzel cevap vardı (özellikle @loa_in_ tarafından yapılan kafiyeli) ama bununla devam edeceğim. Parametrelerin sırasının tutarlı olduğunu (görmezden -tgeldiğini) belirttikten sonra neredeyse bir ispat gibi geliyor. " lno anki dizinde bağlantıyı yaratır. İki argüman formu bir argüman formuna bir ektir ve bu nedenle hedef daima ilk argümandır". O Çünkü mantıklı ikinci formu dikkate alındığında bu durum olacağını, bu beni hatırlamasına yardımcı olacağını düşünüyorum.
Zhro,

85

Gideceğim " lngibidir cp." Kaynak "önce gelmeli."


20
... ve benzerleri mv. mv, cpVe lntüm ikinci argüman olarak ilk argüman olarak varolan bir dosyayı ve amaçlanan hedef dosya veya dizin adını alır.
Hans-Martin Mosner

7
Bu utanç verici memcpy, strcpytersi yönde çalışmalı vb.
Arkadiusz Drabczyk

6
@ Hans-MartinMosner, sembolik bir bağlantı oluşturduğunuzda, varolan bir dosya olması gerekmez ...
ilkkachu

1
@ilkkachu Haklısın. İstisnasız kural yok :-)
Hans-Martin Mosner

1
@ArkadiuszDrabczyk Öte yandan, memcpy(dest,src,n);haritalar gibi çok iyi bir şey dest = src;. Başka bir deyişle, set ( nilk nbayt), src (ilk bayt) 'a eşittir .
Eylül'de CVn

10

Çoğu Unices lnkomutu şu şekilde belgeler:

ln source target

(Burada seçenekleri vs. atlıyorum)

Örnekler:

  • POSIX standardı

    ln [-fs] [-L|-P] source_file target_file
    
  • OpenBSD :

    ln [-fhLnPs] source [target]
    
  • NetBSD ve FreeBSD

    ln [-L | -P | -s [-F]] [-f | -iw] [-hnv] source_file [target_file]
    
  • Mac os işletim sistemi

    ln [-Ffhinsv] source_file [target_file]
    
  • Solaris

    /usr/bin/ln [-fns] source_file [target]
    
  • AIX

    ln [ -f | -n ] [ -s ] SourceFile [ TargetFile ]
    

GNU lnkılavuzu source hedefi ve target link adını çağırır .

Kelimelerin GNU seçim yok sayarak, lnyarar ör olarak semantik aynı tür izler mvve cpo içinde hedef oluşturulur budur kaynağı .

Bu nedenle,

ln -s a b

bişaret eden sembolik bağ kurar a.

Ayrıca, sembolik bağlar oluştururken , kaynağın sembolik bağın neye işaret etmesi gerektiğini temsil eden bir dize olduğunu unutmayın. Yararlı bir şeye işaret ettiğini doğrulamak için genellikle hiçbir kontrol yapılmaz:

$ ln -s "hello world" README.txt
$ ls -l
total 0
lrwxr-xr-x  1 kk  wheel  11 Sep 15 11:39 README.txt -> hello world

5
GNU belgelerini, insanların bunu yanlış yaptıkları için tamamen suçluyorum. İfadeleri uzunca anlaşılır ancak objektif olarak kafa karıştırıcı.
Konrad Rudolph

6
@KonradRudolph, Aksine, GNU cümleleri bana göre görünüyor. Yardımcı program, bir yere işaret eden bir adla bir bağlantı oluşturur. "Bağlantı adı" oldukça açıktır ve "hedef", işaret edilen bir şey için mükemmel bir tanımdır . Bir fıkra olarak, bazen hangi yolun ln -s a bişe yaradığını ve bunun GNU ifadesiyle hiçbir ilgisi olmadığını düşünmem gerekiyor, çünkü man sayfasındaki ifadelere hiç bakmadım. : D ( ln -si a bEmin olmadığında çalıştırması daha kolay , bzaten varsa şikayet edecek .)
ilkkachu

1
@KonradRudolph, teknik olarak zor bir bağlantı olması durumunda "hedef" olarak adlandırmak yanlıştır , çünkü mevcut isim değil, asıl hedef olan inode'dur. GNU milletinin ortak bir kullanıcının bu kadar ayrıntılı düşünmesi gerekmeyeceğini düşündüğünü merak ediyorum.
ilkkachu

@ Gary'in cevabının yorumlarında da belirtildiği gibi, hedefin POSIX standardında isteğe bağlı olmadığını belirtmek ilginçtir .
Zhro

@kusa: "ln -s AB --- yalnızca dosyanın adını B'ye kopyala" ile yorumunuzu biraz değiştirilmiş bir bağlamda benimsedim. Senin radikal "merhaba dünya" örneğine katılıyorum bile. "Sadece dosyanın adı 'bir dizedir. Sadece size biraz düzenlediğimi ve çok şey eklediğimi işaret etmek istiyorum.

7

Durumda bu kimse yardımcı olur: Ben bunun düşünmeye alışmış "ln neyi nerede beni ilk argüman ( "ne") mevcut dosya, ( "") ikinci yer olduğunu hatırlamak yardımcı olur", koymak (bir bağlantı). Diğer cevapların çoğundaki akıl yürütmenin aksine, bu, hafıza yardımı olarak kullanılan bir komut yazarken kendime zihinsel olarak okuyabildiğim özlü bir ifadeden başka bir şey değildir. Bu muhtemelen herkes için faydalı olmayacak, ancak bazı insanlara yardım edeceğinden şüpheliyim.

Diğer standart dosya manipülasyon komutlarının aynı kuralı kullanmasına yardımcı olur, bu yüzden cpve için aynı şeyi yapabilirim mv.


4
Bunun neden reddedildiğine dair bir fikrim var. Burada yanlış olabilecek pek bir şey yok - emri karıştırdım mı yoksa?
David Z,

Şahsen ben "nerede," ifadesinin açıklama olmadan hala net olmadığını düşünüyorum: "bağlantıyı gösteren link nedir?" (doğru) veya "bir şeye bağlanma nedir?" (yanlış). Şununla aynı: "Bağlantı nereye işaret ediyor?" (yanlış) veya "bağlantı nerede oluşturulmalı" (doğru). Yani, kendinizi ikinci olarak tahmin ediyorsanız, bu o kadar da yardımcı olmaz. Cp ve mv'yi hatırlamak da yardımcı olmalı.
125_m_125

Hepimiz bir UNIX komutunun dosya argümanlarını başka tür argümanlardan sonra eklemesini bekleriz (grep yaptığı gibi, exmaple için). ln verilen içeriğe sahip belirli türde bir dosya oluşturur. Dosya sisteminin özel bir şey yapması ve genellikle içindeki bazı kaynak dosyaların yolunu koyması ln'ye eşittir. Örneğin, ilk satırının içeriğini 1, vb. Adlı bir bağlantıda saklayan bir metin editörü yazabilirim. argüman sırasının mantıklı görünmesini sağlar.
Dannie,

@ 125_m_125 Sunulan alternatif yorumlamanın bana bir anlamı yok, ama sorun değil; Bu hafıza yardımı herkes için değil.
David Z,

6

Geçenlerde bu belirli şeyi hatırlamak için harika bir yol duydum: bir kafiye

Eski bir şey, yeni bir şey

ödünç alınmış bir şey, mavi bir şey,

ve ayakkabısında altı pense.

İlk ayet, ln argümanlarının ne olduğudur: eski bir şey ve ardından yeni dizin girişinin adı.


3
NAME    ln -- make a link
SYNOPSIS    ln name1[ name2 ]
DESCRIPTION ln creates a link to an existing file name1. 
            If name2 is given, the link has that name; 

1971'den itibaren Unix Birinci Baskı Kılavuzları .

Bir yoktur ikinci , basit, sözdizimi formu.


düzenleme: Ben adresleme vb yorumları görmek de altta çok uzun eklenmesini bkz --- TARGET yerine DOSYASINI veya FILENAME koymak buzdağı, sert ve yumuşak ait ln, bunun sadece ucu.


Yani GNU’da lnşu var:

ln [opt] FILENAME

In the 2nd form, create a link to FILENAME in the current directory.

link ismine ihtiyacınız yok. Sonra ln -s /usr/lib/modulesaldığınız bir

modules -> /usr/lib/modules

FILENAME ("hedef" veya "kaynak") ile aynı adda, bulunduğunuz yer. Seçim yok, karışıklık yok.

Eğer daha talepkar olan ve altında oluşturulan bağlantıyı istiyorsanız Şimdi başka bir isim ve / veya başka bir yerde , sen eklemek adı veya yolu olarak bu dilek. Gerçek hedef önce gelir, ekstra fantezi yeni link ismi ikinci olur.


Ya da diyorsunuz: " ls -lBağlantılar için bu ok gösterimini biliyorum . Kabuğumda bağlantımın yönünü gösterecek bir okum yok. Bu yüzden ters çevirmek zorundayım."

Bir yönde yaratırsınız, böylece diğerinde kullanabilirsiniz.

(SORU-SORU BÖLÜMÜNÜN SONU)


Başka bir düzeyde, "link" kelimesinin kendisi derin bir gizli çifte anlam taşır. Sembolik linkler daha sonra geldi, bu yüzden ilk günlerde bir link sadece bir linkti. Yumuşak ve sert, -sseçenek yoktu . Ve şimdi kaynak-hedef sembolizmini bile kullanıyorum:

mv    A B   --- move the whole file to B (dir or new name)
cp    A B   --- copy whole file (mv and cp are "the same" here)    
ln    A B   --- copy whole file MINUS data blocks (=copy only inode and name), and increase "link count" for track keeping

Bu aşamada, bağlantılar vardır, ancak sert ve yumuşak ls -ldeğildir ve oklar göstermez, çünkü (sert) bir bağlantıda yön yoktur. Unix evriminin o aşamasında bir "link", dosya sistemindeki "B" dosya adının ("B" dizin adı) "A" dosya adının işaret ettiği aynı inodu işaret ettiği anlamına geliyordu.

A ve B dosyaları birbirine “bağlantılı”, çünkü aynı blokları paylaşıyorlar. Şimdi, her rm'de, çekirdeğin kontrol etmesi gerekiyor: Bu dosyanın diskteki bloklarını silmiş / serbest mi bırakıyorum yoksa aynı bloklara bağlı başka bir dosya var mı? Bunun için bir bağlantı sayacı kullanılır.

Diyelim ki / tmp grom üzerinde büyük bir dosyayı silmek istiyor ve yapıyorsunuz ln /tmp/bigfile. Şimdi çalışma direktörünüzde büyük bir dosya var. / Tmp dosyasını temizledikten ve "orijinali" oynattıktan sonra, aynı veri bloklarını kullanmaya devam edersiniz. Ölü ya da sarkan bir bağlantı alamadım, normal bir dosyanız var. Hiçbir dosyaya işaret etmemekle birlikte, yalnızca her dir girişindeki gibi dosya sistemi engeller. Sadece şimdi "temizlik" / tmp olduğu kadar etkili değil. Boş görünüyor ve öyle, ancak bölümdeki bloklar serbest kalmıyor.

Sert bir bağlantı, cp'nin yaptığı gibi, kendi alanını maliyetlendirmemesine rağmen, dolaylı olarak yapabilir.

ln -sYukarıdaki sıraya ekleyerek :

ln -s A B   --- copy only the file's name to "B"   

Şimdi "B", yumuşak bağlantı, yalnızca bir yol adı ile bir dize vardır. Bu "yumuşak" bir bilgidir. Teknik olarak "A" ve "B" alakasızdır. Ama yine de B, saklı yol adını "A" kısayolu olarak kullanabileceğiniz yeni anlamda "bağlantı" dır . Şimdi "A'nın bağlantısı" (dönem) ve "A dosyası inode'uyla bağlantılı" değil

Her iki tür bağlantı da sadece insanları değil aynı zamanda çekirdeği / f'leri de karıştırabilir. 1971 kılavuz sayfası şunları not ediyor: "HATA: bağlantılar iki kez yedeklendi ve ayrı dosyalara sahip ayrı dosyalar olarak geri yüklendi."

Dizinlere zor bağlantılar (nadir / izin verilmez) kolayca tıkanmaya neden olabilir.

Dizinlere yumuşak bağlantılar (çok yaygın) sonsuz döngülere yol açabilir - kamu hizmetleri / çekirdek tarafından tanınması gerekir.

Bash pratik örnek

"F" normal bir dosyadan başlayarak ...

ln F Fhard

... Fhard'ı F ile aynı boyutta yapar, ancak onlar şimdi koyu kırmızı oklarla KIRMIZI görünürler ls -l --color. Yüzünden statgösteren "Bağlantılar: 2" ile bağlantılı olarak "Düğüm: xyz". Sert bağlantı F, F'yi sert bir bağlantıya dönüştürür. Her ikisi de / stay filetype "normal dosya" dır. Ancak her ikisinde de 1'in üzerinde bağlantı sayısı olan bir inode var.

   ln -s F Fsoft

... filetype "sembolik link" ile küçük bir "düzensiz" dosya "Fsoft" yapar --- boş bir dizinden bile daha fazla alan tasarrufu. Bir ls -l"F" için özel bir şey göstermez. Fsoft için, dize 'F' olduğu için gösterilen boyut 1 bayttır ve Fsoft -> Fad olarak görüntülenir. Birini tanımak için yumuşak bir bağlantıyı renklendirmeye gerek yoktur. Çünkü kısa formda eklenmiş ls -Fbir sarmal zincir elde edersiniz @:Fsoft@

Şunun ls -lgibi görünüyor:

-rw-r--r-- 2 root root 6070340 Sep 16 16:28 F
-rw-r--r-- 2 root root 6070340 Sep 16 16:28 Fhard
lrwxrwxrwx 1 root root       1 Sep 16 16:31 Fsoft -> F

Fhard, F'nin boyutuna ve tipine sahiptir.

Fsoft, F ve F adının boy büyüklüğüne ve farklı bir dosya türüne sahiptir.

Kısa ls -sF:

5932 F    5932 Fhard     0 Fsoft@

ekleme --block-size=1de aynı büyüklüklerde değildir. Fsoft "tek bayt, sıfır blok" boyutuna sahiptir. F ve Fhard paralel olarak sapma gösterir:

6074368 F  6074368 Fhard    0 Fsoft@

Fsoft'un sarkıp sarkmadığını görmek lsiçin renkleri kullanmanıza izin verir.

ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file

2

Bağlantının adının isteğe bağlı olduğunu hatırlamak gerçekten yararlıdır. Verilmezse, bağlantı hedefinin temel adı kullanılır.

ln -s /path/to/file1 file1

Bağlantı adını tamamen bırakmakla aynıdır:

ln -s /path/to/file1

Bağlantı hedefi en son belirtildiyse bu hiçbir anlam ifade etmeyecektir.


1

Sadece sağdaki Unix -> AT&T -> varış yerini düşünün:

mov %eax, %ebx  ;; AT&T style assembler syntax: %ebx register gets value of %ecx

mv foo bar    ;; foo renamed to bar

cp foo bar    ;; contents of foo go to bar

foo | bar     ;; data moves left to right in pipeline

ln abc def    ;; link to abc installed as def

"cp foo bar", "bar" anlamına gelir. "ln abc def" "abc" anlamına gelir. Sembolleri saklamış olsaydın: "foo". Sorun tam olarak bu.

@ user370539 Bu kesinlikle doğru değil; sonra ln abc def, abcve defaynı nesne; ayırt edilemezler. Dahası, operasyonun abcbağlantı sayısını arttırmaktan başka bir etkisi yoktur . Yer def. Nesneye bir işaretçi defkonuma yeni yüklenmiştir .
Kaz

@ user370539 Bağlantı sembolik ln -s abc defise, içeriğin abcbulunduğu yere yazıldığı anlamına gelir def. abchiçbir şeyi çözmek zorunda bile değil; sarkan bir bağlantı olabilir.
Kaz

Yorumunuz tam olarak ... yanlış. Öbür türlü olmalı.
rexkogitans

@ rexkogitans Amacım tutarlı olmasıdır. Düzen "yanlış" olduğunu ve tersine çevrilmesi gerekiyorsa, o zaman tüm bu komutlar için olmalıdır: mv dest src, ln [ -s ] dest src, cp dest src, ...
Kaz

0

Şahsen, ihtiyacım olduğunda X'i nerede arayacağımı bilmek yerine, X'i hatırlamaktan kaçınmayı tercih ederim . Ayrıca "üzgünümden daha güvenli" bir tutumun hayranıyım, bu yüzden yazdıklarımı dikkatlice kontrol etmeyi seviyorum, özellikle de kök olarak.

Bu durumda, cevap tam olarak kılavuzun ilk satırlarında yer almaktadır:

   ln [OPTION]... [-T] TARGET LINK_NAME
   (...)
   In the 1st form, create a link to TARGET with the name LINK_NAME.

Manpage'de yayınlanması gerekiyorsa bunu önermezdim, ama başlangıçta doğru olduğu için IMHO yazıp man lnbırakması 3 saniye değerinde .


-1

Zihinsel olarak “buna kopyala” olarak okuduğum cp'ye benzer şekilde, ln komutlarını “buna bağla” olarak okudum.


2
Bu en çok oy alan cevaba çok benziyor .
Michael,

Öyleyse, "ln -s AB", A'yı B'ye bağlar mı? Şimdi A mı -> B mi, yoksa B -> A mı? Sanırım, çoğu, kafa karışıklığının ilk aşamasını bile geçmedi.

-2

Bu şekilde hatırlıyorum: Hedefi unut. Başka bir deyişle, dir1'deysem ve burada / some / other / dir / içinde var olan file1 ile ilgili bir bağlantı oluşturmak istiyorsanız, şunu yaparım:

ln -s /some/other/dir/file1

Dir1'de file1 adında ve / some / other / dir / file1 'e işaret eden bir link alacaksınız. Ln man sayfasından:

ln [SEÇENEK] ... HEDEF (2. form) ... 2. formda, geçerli dizinde HEDEF ile bir bağlantı oluşturun.

Bunun işe yarar olduğunu sadece, sembolik bağın hedef ile aynı ada sahip olmasını istiyorsanız (ki bu muhtemelen muhtemeldir) unutmayın.


Birisi bunun neden reddedildiğini açıklayabilir mi? Ben sadece man sayfasından kopyala yapıştırdım (ve buna göre atfedilen). SE'ye nasıl yazacaklarını anlamalarında başkalarına yardımcı olacaktır. Teşekkürler.
Atlamalı Tavşan

açıklayabilirim: bu kültürel bir çatışma. Endişelenme. Diğer cevapları inceleyin, yorumlar ...

-3

@ Gary'nin cevabını genişletmek istiyorum.

Cevaplarına ek olarak: lnkomut isteğe bağlı sayıda argüman kabul edebilir, böylece tek bir çağrıda birden fazla sembolik bağ oluşturabilirsiniz (buna ihtiyacınız olduğunda kullanışlıdır).

  1. Bu bilgiyle, karşılaştığınızda ln -s foo bar baz, hangi argümanların ne anlama geldiği en mantıklı açıklaması nedir?
  2. Karşılaştığınız zaman # 1 cevabı ile, ln -s foo barhangi argümanların ne anlama geldiği en mantıklı açıklama nedir?

1
Gary'nin cevabına bir ekiniz varsa, lütfen bir düzenleme olarak önerin. Olduğu gibi, iki takip eden (varsayımsal?) Sorularınız bu "Cevap" ı ikinci bir soruya daha çok benzetiyor.
Jeff Schaller

-3

lnTek bir komutta birden fazla (sembolik) bağlantı oluşturmanıza izin veren bir sürümünü hayal edin .

Synopsis: ln -s TARGET NEW_LINK...
Example: ln -s target_file  new_link_1  new_link_2  new_link_3

Bunun bir tersini yapması o zamandan beri yapmaz, çünkü bir sembolik bağlantı TARGETbir defada yalnızca birine işaret edebilir ve normal komut satırı sözleşmesi tekrar eden kısmı komut satırının sonuna koymaktır, örneğin;grep PAT [FILE]...


-6

" öyle lsgösterir "a -> bln a b

Sadece bunun yanlış olduğunu unutma.


6
Her zaman hatırlıyorum "bir şey bir şey her zaman yanlış". Ama hangi yol yanlıştır? İşte sorun bu. Sorun o zaman, doğru anladığımda bile kendimi ikinci tahmin ediyor olurum. Çünkü aslında doğru sırayı hatırlayamıyorum!
Zhro

Sanırım ne demek istediğinizi anlıyorum: çıktısı ls -l: komut satırının link -> targetnasıl kurulacağı konusundaki fikrinizi şaşırtabilir ln. Fakat bunun pek faydası olmayacağından korkuyorum.
sudodus
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.