'Dir' ve 'ls' terminal komutları arasındaki fark?


74

Terminalde dirve lskomutları kullanarak arasındaki farkı bulmaya çalışıyorum . Ben bir dizinde dosyaları görüntülemek için geleneksel UNIX yöntemi olduğunu biliyorum ve bu dirwindows komut istemi eşdeğerdir, ancak her iki komut terminalde çalışır.

Ben yazarsanız diro dizindeki dosya ve klasörleri görüntüler ve ben yazarsanız lsiçeriğin vurgulama dışında aynı işi yapar. Her iki komut da seçenekleri kabul eder (yani ls -a, dir -aher ikisi de tüm dosyaları, klasörleri ve gizli dosyaları döndürür).

Yani kimse fark nedir ve neden hem biliyor mu dirve lskullanılır?


7
dir --color;)
Rinzwind

3
Sadece bu sorunun aldığı cevaba göre şaşırdığımı söylemek istedim. Sanırım bunu merak eden tek kişi ben değildim :)
BretD

3
Antik çağlardan gelen komutlar her zaman eski
inekleri ahşaptan

Yanıtlar:


70

dirve lsbunlar sadece farklı varsayılan seçeneklerle aynıdır coreutilsve dirneredeyse aynıdır ls.

GNU Çekirdek Araçları, GNU işletim sisteminin temel dosya, kabuk ve metin işleme araçlarıdır. Bunlar, her işletim sisteminde var olması beklenen temel yardımcı programlardır.

info dir diyor:

direşittir ls -C -b; diğer bir deyişle, varsayılan olarak dosyalar sütunlarda listelenir, dikey olarak sıralanır ve özel karakterler ters eğik çizgi kaçış dizileri ile gösterilir.

Oh ve orada da var vdir! info vdirdiyor:

vdireşittir ls -l -b; yani, varsayılan olarak dosyalar uzun formatta listelenir ve özel karakterler ters eğik çizgi kaçış dizileri ile temsil edilir.

Büyük olasılıkla dirgeriye dönük uyumluluk için veya tarihsel nedenlerden dolayı var.


Muhtemelen diğerinin takma adı olduğunu düşünüyordum. Sebep, Windows kullanıcılarının evde daha çok hissetmelerini sağlamak olduğunu düşünmüştüm lol Ayrıntılı cevap için teşekkür ederim!
BretD

4
alias dirgerçekte ne olduğunu görmek için yazın . aliasTüm diğer adları görmek için yazın .
user606723

2
@ user606723, 'alias dir' 11.10’da görünmüyor (en azından benim için). 'Takma adın' sistem genelinde değil, yalnızca yerel kullanıcı takma ayarlarını gösterdiğine inanıyorum.
James,

type dirne olduğunu görmek için bir tür yazın (bir takma ad, bir komut, bir bash işlevi ...)
ychaouche

49

Arasındaki İlişki lsvedir

lsve dirbenzer şekilde davranan ayrı programlardır. Açıkladı ve aşağıda başvurulan gibi, amacı dirgibi bir komut sağlamaktır lsçıkış bir terminale gidiyor olup olmadığına bağlı olarak değişmez kimin . Bunu yararlı dirbir şekilde başarmak için , çıktısını hem terminalde görüntülemek hem de dosyaya veya boruya yazmak için makul ve yararlı olacak şekilde biçimlendirmeniz gerekir.

Hakkında iki yaygın yanılgı vardır dir:

  • Birçok insan dirbir takma ad olduğuna inanmaktadır ls, ancak durum böyle değil. Her iki komut da diğerinin dirtakma adı değildir ve varsayılan olarak Ubuntu'da takma ad değildir. lsve dirayrı, aynı olmayan çalıştırılabilir öğeler tarafından sağlanır.
  • Birçok kişi dirbelirsiz tarihsel nedenlerden dolayı ya da bazı standart ya da başka bir işletim sistemi ile uyum sağlamak için var olduğuna inanmaktadır . Bu da böyle değil. lsuyumluluk için yaptığı gibi davranır. dirStandart bir Unix komutu olmadığı için uyumlu olması gerekmiyor, geliştiricilerin kendi haklarına göre değerli ve belki de tercih edilen bir şekilde değerlendirebilecekleri alternatif bir davranış sergiliyorlar.

Tamam, ama tam olarak nasıl lsve dirfarklı?

Her ikisi de lsve dirdizinlerin içeriğini listeler. Varsayılan davranışlarındaki iki özel fark onları ayırt eder.

  1. Bunu yaparken standart çıktı bir terminal, lsdikey olarak sıralanmış sütunlar (benzerlerinde dosya listeler ls -C). Standart çıktısı bir terminal olmadığında (örneğin, bir dosya veya boru ), lsher satırda bir tane olan dosya adlarını listeler (benzeri ls -1).

    Standart çıktısının bir terminal olup olmadığı, dirdosya adlarını dikey olarak sıralanmış sütunlarda (benzeri ls -C) listeler .

    Her ikisi için lsve dirbu varsayılan tarafından geçersiz kılınabilir --format=bayrak ve tarafından -1, -C, -mve -xözellikle kısaltmak bayrakları, --format=seçenekleri. Detaylar için GNU coreutils başvuru el kitabındaki 10.1.4 Genel çıktı formatlama bölümüne bakın .

  2. Standart çıkış listelenmesi için bir terminal ve bir dosya olduğunda içeren kontrol karakterleri , lsbaskı ?yerine her bir kontrol karakteri (gibi ls -q). Standart çıkışı bir terminal olmadığında lskontrol karakterlerini olduğu gibi yazdırır (gibi ls --show-control-chars).

    Standart çıktısının bir terminal olup olmadığı, dirbir kontrol karakteriyle veya bir kabuğa girildiğinde özel olarak yorumlanacak herhangi bir karakterle karşılaştığında, karakterler için ters eğik çizgi dizileri yazdırır. Bu, boşluklar gibi nispeten yaygın karakterleri bile içerir. Örneğin, olarak diradlandırılan bir girişi listeler . Bu gibi .Documents backupsDocuments\ backupsls -b

    Her ikisi için lsve dirbu varsayılanlar, 10.1.7'de listelenen bayraklar tarafından geçersiz kılınabilir . GNU coreutils başvuru el kitabındaki dosya adlarını biçimlendirme . Bunlar arasında -b, -q, --quoting-style=ve bazı diğerleri.

Kaynaklar : GNU coreutils başvuru el kitabında , çağrı ve yönetim çağrısı .

Neden var dir?

Ayrı bir diryardımcı programın gerekçesi, genel olarak GNU kodlama standartlarının 4.5 . Ben uygulanabilir şekilde vurgular bütün bölüm geliştiricilerin akıl anlamak için bu okuma tavsiye ederim, ama burada ls/ dir:

Bir yardımcı program davranışı onu çağırmak için kullanılan isim bağlıdır yapmayın ....

Bunun yerine, alternatif davranışlar arasında seçmek için bir çalışma zamanı seçeneği veya derleme anahtarı veya her ikisini kullanmak ....

Aynı şekilde, çıkış cihazının türüne bağlıdır bir komut satırı programı davranışını yapmayın lütfen ....

Uyumluluk, belirli programların çıkış aygıtı türüne bağlı olmasını gerektirir. Tüm kullanıcıların beklediği şekilde yapsa lsveya yapmasaydı feci olurdu sh. Bu durumlarda bazı durumlarda, programı çıkış aygıtı türüne bağlı olmayan tercih edilen alternatif bir sürümle tamamlıyoruz. Örneğin, varsayılan çıktı biçiminin her zaman çok sütun biçiminde olması dışında bir dirprogram sağlarız ls.

GNU Projesi, bir yardımcı programın ne tür bir cihaza yazdığına (en azından yardımcı programın varsayılan yapılandırmasında) bağlı olarak, farklı bir çıktı üretmesi için bir teknik açıdan arzu edilmez. Bazı araçlar için, lscihaza bağlı çıktı dahil olmak üzere uyumluluk için gereklidir ve bu nedenle kullanıcıların beklediği gibi çalışır. Bazı kullanıcılar ayrıca bu cihaza bağlı davranışı özellikle tercih eder.

lsAygıtın bağımsız olarak davranması makul bir şekilde yazılamamış olsa da, dirbunu başarmak için ayrı bir yardımcı program oluşturulmuştur. Böylece dirtarihsel compatibility-- nedeniyle garip davranır yarar değil lsise .

Nasıl çalıştığını görmek için ls, dirve ilgili vdirbkz yarar gereksiz kod tekrarına olmadan coreutils kaynak kodunda uygulanan ls-dir.c, ls-ls.c, ls-vdir.c, ls.h, ve ls.c.

dirgerçekten yararlı?

Daha önce ( ) lsborularına bağladığınızda veya bir dosyaya ( ) yönlendirdiğinizde bile çoklu sütun çıktısı oluşturmayı dilediyseniz , veya kullanabilirsiniz .lessls | lessls > out.txtdirls -C

Eğer dilediğiniz bir dosyayı doğrudan gösteren birls dosyayı kopyalayıp alıntı yapmaktan endişe duymadan komutun bir parçası olarak kullanabilirsiniz, dirya da kullanabilirsiniz ls -b.

direşittir ls -Cb, bu yüzden bu anlamda ihtiyacınız yok dir. Ancak dirpratikte genellikle yararlı olan seçeneklerin bir birleşimini sağlar (hakkında geniş ölçüde bilinmese de).

Neden ls(hatta ls -Cb) renklendirilmiş çıktı alıyorum dir?

Çoğu Ubuntu kullanıcısı lsçalışan bir takma adı kullanır ls --color=auto. lsHem diğer ad hem de harici bir komut olarak mevcut olduğunda , diğer ad basit, etkileşimli komutlarda öncelikli olur.

Diğer ad tanımları özyinelemeli olarak genişletilmez - takma adın çağırdığı harici lskomuttur . Bkz 6.6 Takma Ad içinde Bash referans kılavuzuna adlar nasıl çalıştığı konusunda daha fazla bilgi için.ls--color=auto

Geçirilen zaman ls, dirya da vdir(ve, gibi diğer bazı komutlar grep), --color=autoçıkış ama aksi halde, bir terminal olduğunda renk kullanır.

Ubuntu'da varsayılan olarak, kullanıcı hesapları şununla yaratılır ~/.bashrc:

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

lsTakma adın ( alias ls='ls --color=auto') yorumlanmadığını fark edeceksiniz, bunun için olanlar dirve vdiryorumlanmadıkları #için hiçbir etkisi olmaz. Yani, süre dir, bir takma değil lsedilir (ancak etmek dir) .

dirRenkli çıktılar da nasıl üretebilirim?

Renkli çıktıyı etkinleştirmek için, ana dizininizde dirdüzenleme .bashrcyapın ve #alias dir='dir --color=auto'satır satırını kaldırarak satırın açıklamasını kaldırın #. Değişimden sonra başlayan kabuklarda dirtakma ad olacaktır.

Geçerli kabuktaki değişikliği istiyorsanız, takma ad tanımını komut olarak çalıştırabilir veya .bashrcçalıştırarak kaynak yapabilirsiniz . ~/.bashrc.

Bu tartışmasız ana noktaya dirters düşüyor - çıkış cihazından bağımsız olarak aynı tür çıktılar üretmesi gerekiyor. Ancak:

  • Bu dirtakma adı oluşturmayı yararlı bulursanız , kesinlikle yapmanız gerekir.
  • Eğer çalıştırarak takma geçersiz kılarsanız komut örneğin, bir dış komut olarak adlandırılan veya zaman \dirya command dir, dirhala aygıttan bağımsız çıktı üretecektir. Bu, o örtüşme demek ki dirhiç dir --color=autogerçekten sonu yok dir.

Kalite cevabı, ancak bir ToC veya TL kullanabilirsiniz; DR; :)
Kevin

5

dirSadece geriye dönük uyumluluk için orada olduğunu düşünme eğiliminde olurdum .

Gönderen GNU coreutils :

dir ls-C-b'ye eşittir; yani, varsayılan olarak dosyalar sütunlarda listelenir, dikey olarak sıralanır ve özel karakterler ters eğik çizgi kaçış dizileri ile gösterilir.

Bu arada, lsvarsayılan olarak çıktı renklendirmek değildir: bu en dağıtımlar takma nedeni lsile ls --color=autode /etc/profile.d. Bir test için, unalias lsyazıp deneyin ls: renksiz olacaktır.

Kaynak: Renan 'ın cevabı için ‘dir’ ve ‘ls’ arasındaki fark nedir ?


Her ne kadar dirolduğu değil geriye dönük uyumluluk için sağlanır --ve lsaslında olduğu --Bu cevabı (ve alıntıların cevap) düzgün sık gözlenen renklendirme farkını açıklayan yanı sıra iki komutları arasındaki teknik farkı devlet yoktur. Yani +1.
Eliah Kagan

3

Şüphe durumunda, type lsvs ile karşılaştır type dir(ayrıca ls ve la arasındaki farklara bakın ):

$ type dir
dir is aliased to `ls -l'

$ type ls
ls is aliased to `_ls'

$ type _ls
_ls is a function
_ls ()
{
    local IFS=' ';
    command ls $LS_OPTIONS ${1+"$@"}
}
$ echo command ls $LS_OPTIONS ${1+"$@"}
command ls -N --color=tty -T 0

Fark, farklı seçeneklerden kaynaklanıyor ls, benim durumumda --color=ttyen görünür olan sisteminiz farklı olabilir.


2
Bu, varsayılan bir Ubuntu kullanıcı yapılandırması gibi görünmüyor. Kullandığım Ubuntu sistemlerinden hiçbirinin, bir yorumlu satırda bile lsdenilen bir işlev için bir takma adı olduğunu sanmıyorum . OpenSuSE (en azından bazı sürümleri) için varsayılan gibi görünüyor, ancak bu sohbeti değerlendirerek , bu dosyayı (oradan bağlantılı) ve en son openSUSE'yi kullandığım zamanki (belki de yanlış) hafızam. _ls.bashrc
Eliah Kagan

2
@EliahKagan: Bunu tahmin ettin, OpenSuse kullanıyorum! Dediğim gibi, sonuç farklı olacak, ancak yöntem iyi olmalı.
user2394284

2

Kısa Cevap: Yok, dirdaha aynı kaynak kodu ls, lsikili sahip --colorvarsayılan olarak. (1 satır kod fark)


7
dirolduğu değil bir takma ad ls. Bunlar ayrı ikili olduğu /usr/binaçıklandığı gibi bu, farklı davranır Rinzwind 'ın cevabı . Bunu takma adlarla başarabilirsiniz, ancak bu şekilde elde edilemez . GNU Coreutils kullanan tüm sistemlerde ayrı dirve lsikili dosyalar görünür . Kanıt gerekiyorsa koşun . cmp /bin/ls /bin/dir
Eliah Kagan

2
bir süre önce bir takma addı ve sadece yazarak takma ad listesinde listelendiğini görebiliyordunuz alias, şimdi dir için derlenmiş yeni bir ikili dosya. Sen onun kodunu indirebilirsiniz: git clone git://git.sv.gnu.org/coreutils. Sadece bir satır kod ls-dir.c değişti ve bu tesisimiz: int ls_mode = LS_MULTI_COL;. Teknik olarak bir takma ad değil, pratikte LS'dir ancak farklı varsayılan seçeneklerle (1 kod satırı).
Francisco Valdez

1
Evet, dirbir lsfarklı varsayılan seçeneklerle ama . dirve lsGNU Coreutils kullanan dağıtımlarda her zaman ayrı ikili dosyalar olmuştur. Bazı dağıtımlar ayrıca adlandırılmış bir diğer ad dirtanımlayabilir (tanımlanmış olabilir) (varolan komutla aynı adı taşıyan takma adları tanımlamak oldukça yaygındır). Ancak bunlar ayrı ayrı çalıştırılabilir. Kabuk takma adını (hiç bir dosya olmayan) ve benzer kaynak kodlu ayrı bir çalıştırılabilir dosya arasında ayrım yapmak, bilgiçlik tasvir edici değildir. Bunun Ubuntu'da dirbir takma ad olduğunu söylemek hem yanlış hem de yanıltıcıdır ls.
Eliah Kagan

Evet, sana katılıyorum, ancak bu durumda, benzer kaynak kod değil, aynı kaynak kod. Bir takma adın sadece listelenen herhangi bir şey olduğunu söylersek, o aliaszaman elbette bir takma ad değildir.
Francisco Valdez

3
Aynı kaynak kodu değil. Dediğiniz gibi, "bir satır kaynak değiştirildi." Ve aynı kaynak olsaydı, o zaman hala bir takma ad olmayacaktı. Unix benzeri bir sistemde, takma adlara benzeyen ancak takma adlar aramak için acemilerle (ve deneyimli kullanıcılara saldırmakla) çok kafa karıştırıcı olan birçok şey var. Sembolik linkler, hard linkler, özdeş dosyalar, benzer dosyalar, sarmalayıcı komut dosyaları, kabuk yerleşik uygulamalarını gizleyen çalıştırılabilir dosyalar ve senkronize edilmiş dosyalar (örn. UbuntuOne ile), takma adlara önemli ölçüde benzerdir, ancak bunlar takma ad değildir.
Eliah Kagan
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.