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

62

Terminalde dir ve ls komutlarını kullanma arasındaki farkı bulmaya çalışıyorum. Bir dizindeki dosyaları görüntülemenin geleneksel UNIX yöntemi olduğunu ve dir penceresinin komut istemi eşdeğeri olduğunu biliyorum, ancak her iki komut da terminalde çalışıyor.

dir yazıyorsam, dizindeki dosyaları ve klasörleri gösterir ve ls yazıyorsam, içerik vurgulaması dışında da aynı şeyi yapar. Her iki komut da seçenekleri kabul eder (örn.% Co_de% ve ls -a , hem dosya ve klasörleri hem de gizli dosyaları döndürür.

Peki, farkın ne olduğunu ve neden dir -a ve dir neden kullanıldığını bilen var mı?

    
sordu BretD 13.02.2012 19:15

5 cevap

59

dir ve ls , coreutils parçası ve dir hemen hemen aynıdır. Sadece farklı varsayılan seçeneklerle ls .

  

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

info dir diyor ki:

  

dir , ls -C -b değerine eşittir; Yani, varsayılan dosyalar listelenir   sütunlar halinde, dikey olarak sıralanır ve özel karakterler temsil edilir   backslash kaçış dizileri tarafından.

Oh ve ayrıca vdir var! info vdir diyor ki:

  

vdir , ls -l -b değerine eşittir; Yani, varsayılan dosyalar   uzun formatta listelenir ve özel karakterler tarafından temsil edilir   ters eğik çizgi dizileri.

Büyük olasılıkla dir , geriye dönük uyumluluk veya geçmişe dayalı nedenlerden dolayı var.

    
verilen cevap Rinzwind 13.02.2012 19:33
38

ls ile% co_de Arasındaki İlişki%

dir ve ls , benzer şekilde davranan ayrı programlardır. Aşağıda açıklandığı ve referans verildiği gibi, dir 'nın amacı, bir terminale gidip gitmediğine bağlı olarak çıkışı değişmeyen dir gibi bir komut sağlamaktır. Bunu başarmak için, ls değeri, hem bir terminalde görüntülemek hem de bir dosyaya veya boruya yazmak için makul ve kullanışlı bir şekilde biçimlendirmelidir.

dir hakkında iki yaygın yanlış anlama var:

  • Birçok kişi dir 'si dir adlı takma addır, ancak durum böyle değildir. Komut, diğerinin takma adıdır ve varsayılan olarak Ubuntu'da ls bir takma ad değildir. dir ve ls ayrı, aynı olmayan yürütülebilirler tarafından sağlanır.
  • Birçok kişi,% co_de yüzdesinin belirsiz tarihsel nedenlerden dolayı veya bazı standart veya başka bir işletim sistemi ile uyumluluk sağladığına inanmaktadır. Bu da öyle değil. dir , uyumluluk için yaptığı gibi davranır. dir , standart bir Unix komutu olmadığı için uyumlu olması gerekmez, geliştiricilerin kendi içinde değerli olduğunu düşündükleri şekilde davranır. kendi hakkı ve belki de tercih edilebilir.

Tamam, ancak tam olarak ls ve dir nasıl değişiyor?

Her ikisi de ls ve dir dizinlerin içeriğini listeler. Varsayılan davranışlarında iki belirgin farklılık onları ayırt eder.

  1. standart çıktı bir terminal olduğunda, ls dikey olarak sıralanmış sütunlarda dosya adlarını listeler ( dir gibi). Standart çıktısı bir terminal değilse (örneğin, bir dosya veya boru ), ls listeleri Satır başına bir dosya isimleri ( ls -C gibi).

    Standart çıktısı bir terminal olsun ya da olmasın, ls , dikey olarak sıralanmış sütunlarda dosya adlarını listeler ( ls -1 gibi).

    Hem dir hem de ls -C için bu varsayılanlar ls bayrağı ve dir , --format= , -1 ve -C bayrağı tarafından geçersiz kılınabilir. % seçenekleri. 10.1.4 Genel çıktı biçimlendirmesine bakın. Ayrıntılar için //gnu.org/software/coreutils/manual/">GNU coreutils başvuru kılavuzu .

  2. Standart çıkışı bir terminal ise ve listelenecek bir dosya adı kontrol karakterlerini içerir , -m print% co_de Her kontrol karakteri yerine% ( -x gibi). Standart çıkışı bir terminal olmadığında, --format= , kontrol karakterlerini olduğu gibi basar ( ls gibi).

    Standart çıktısının bir terminal olup olmadığı, ? 'in bir kontrol karakteriyle veya bir kabuk içine girildiğinde özel olarak yorumlanacak başka bir karakterle karşılaştığında, karakterler için ters eğik çizgi dizileri basar. Bu, boşluk gibi nispeten yaygın karakterler de içerir. Örneğin, ls -q ls adlı ls --show-control-chars adlı bir girişi listeler. Bu dir gibidir.

    Hem dir hem de Documents backups için, bu varsayılanlar GNU coreutils başvuru kılavuzundaki dosya adları "> 10.1.7 Dosya adlarını biçimlendirme . Bu, Documents\ backups , ls -b , ls ve diğerlerini içerir.

Kaynaklar : Çağırma ve dir çağırma , GNU coreutils başvuru kılavuzu .

Neden dir ?

var?

Ayrı bir -b yardımcı programının gerekçesi, 4.5 Arabirimler için 4.5 Standartlar GNU kodlama standartları . Geliştiricilerin gerekçelerini anlamak için bu bölümün tamamını okumanızı öneririm, ancak burada -q / --quoting-style= için uygulanabilir olan açıklar şunlardır:

  

Lütfen bir yardımcı programın davranışını, kullanılan adlara bağlı olarak yapmayın.   çağır ....

     

Bunun yerine, bir çalışma zamanı seçeneği veya derleme anahtarı veya her ikisini de kullanın.   alternatif davranışlardan birini seçin ....

     

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

     

Uyumluluk, belirli programların türüne bağlı olmasını gerektirir   çıkış aygıtı. % Co_de% veya dir öğesinin bunu yapmadığı takdirde felaket olur   tüm kullanıcıların beklediği şekilde.Bazı durumlarda, biz ek   bağlı olmayan tercih edilen bir alternatif sürümü ile program   çıkış aygıtı tipi. Örneğin, çok benzer bir dir programı sağlıyoruz   Varsayılan çıktı biçimi her zaman çok sütunlu olduğu için ls   biçimi.

GNU Projesi, teknik açıdan, bir programın ne tür bir cihaza yazdığına bağlı olarak farklı çıktılar üretmesini istenmeyen bir durum olarak görmektedir (en azından programın varsayılan konfigürasyonunda). Bazı yardımcı programlar için, dir dahil olmak üzere, cihazla ilişkili çıktı, uyumluluk açısından gereklidir ve dolayısıyla kullanıcıların beklediği şekilde çalışır. Bazı kullanıcılar özellikle bu cihaza bağlı davranışları tercih ederler.

ls 'si cihazdan bağımsız davranmak için makul bir şekilde yazılmazken, bunu başarmak için ayrı bir sh yardımcı programı oluşturuldu. Bu nedenle, dir , tarihsel uyumluluk nedenlerinden dolayı garip davranan bir yardımcı program değildir. ls , .

Gereksiz kod çoğaltması olmadan ls , ls ve ilgili dir yardımcı programının coreutils kaynak kodunda nasıl uygulandığını görmek için, bkz. dir , ls , ls , dir ve vdir .

ls-dir.c değeri gerçekten yararlı mı?

ls-ls.c 'yi% co_de ( ls-vdir.c ) değerine aktardığınızda veya bir dosyaya ( ls.h ) yönlendirdiğinizde bile ls.c çok sütunlu çıktı ürettiyseniz dir veya ls .

Dilediyseniz, less ile gösterilen bir dosya adını doğrudan kopyalayıp için endişelenmeden bir komutun parçası olarak kullanabilirsiniz. ls | less veya ls > out.txt kullanabilirsiniz. .

dir , ls -C değerine eşdeğerdir; bu nedenle, ls değerine ihtiyacınız yoktur. Ancak dir , uygulamada genellikle yararlı olan (ancak yaygın olarak bilinmeyen) seçeneklerin bir kombinasyonunu sağlar.

Neden ls -b (hatta dir ) değerinden renklendirilmiş çıktı alıyorsunuz, ancak ls -Cb değil?

Çoğu Ubuntu kullanıcısı, dir çalıştıran dir adlı bir takma ada sahip. % Co_de% hem takma ad olarak hem de harici bir komut olduğunda, diğer ad basit, etkileşimli komutlarda önceliğe sahiptir.

Alias ​​tanımları art arda genişletilmez - ls alias'ın ls -Cb ile çağırdığı harici dir komutu. 6.6 Takma Adlara bakın. Diğer adların nasıl çalıştığı hakkında daha fazla bilgi için bash / manual / "> Bash başvuru kılavuzu .

ls , ls --color=auto veya ls (ve ls gibi diğer bazı komutlar) 'a geçtiğinde, ls çıkışı bir terminal olsa da renk kullanır, aksi halde değil.

Ubuntu'da varsayılan olarak, kullanıcı hesapları --color=auto ile oluşturulur:

# 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

ls takma adın ( dir ) uncommented olduğunu görürsünüz, vdir ve grep için olanlar --color=auto ile yorumlandılar, bu nedenle bunlar hiçbir etkisi olmayacak. Yani, ~/.bashrc bir takma ad değilken, ls (ancak alias ls='ls --color=auto' değerine değil) .

dir öğesinin de renkli çıktı üretmesini nasıl sağlayabilirim?

Renkli çıktıyı vdir ile etkinleştirmek için, ana dizininizde # değerini düzenleyin ve dir öncüsünü kaldırarak ls satırını kaldırın. Değişiklikten sonra kabuklarda, dir bir takma ad olacaktır.

Geçerli kabuktaki değişikliği istiyorsanız, takma ad tanımını komut olarak çalıştırabilirsiniz veya dir dosyasını çalıştırarak dir kaynağına ulaşabilirsiniz.

Bu, muhtemelen, .bashrc 'nin ana noktasına karşı çıkıyor - çıktı aygıtından bağımsız olarak aynı çıktıyı üretmesi gerekiyor. Ancak:

  • Bu #alias dir='dir --color=auto' takma adını yapmak için yararlı bulursanız kesinlikle bunu yapmalısınız.
  • Harici komut olarak çağrıldığında, örneğin komut dosyalarında veya # veya dir dosyasını çalıştırarak diğer adı geçersiz kılarsanız, .bashrc hala aygıttan bağımsız çıktı üretecektir. Bu, . ~/.bashrc ile dir arasındaki takma adın dir koptuğunu söylemektir.
verilen cevap Eliah Kagan 29.04.2015 18:15
4
  

dir 'nin geriye dönük olarak yalnızca olduğunu düşünmeye eğilimliydim   uyumluluk .

     

GNU Coreutils 'den:

     
    

dir, ls-C -b'ye eşdeğerdir; Yani, varsayılan dosyalar sütunlarda listelenir, dikey olarak sıralanır ve özel karakterler temsil edilir     backslash kaçış dizileri tarafından.

  
     

Bu arada, ls çıkışı varsayılan olarak renklendirmiyor: Bu   Çünkü çoğu dağıtım birimi ls - ls --color=auto   % Co_de%. Bir test için /etc/profile.d yazıp unalias ls değerini deneyin:   renksiz ol.

Kaynak: Renan 'in Arasındaki fark nedir? “Dir” ve “ls” ?

    
verilen cevap Zlatan 14.09.2013 18:40
2

Kısa Cevap: Yok, dir , @Rinzwind'in dediği gibi ls 'nin takma addır. ls , varsayılan olarak --color ' sine sahiptir

    
verilen cevap Francisco Valdez 13.02.2012 19:26
2

Şüphe edildiğinde, type ls ile type dir değerini karşılaştırın (ayrıca bkz. ls ve la arasındaki fark):

$ 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+"[email protected]"}
}
$ echo command ls $LS_OPTIONS ${1+"[email protected]"}
command ls -N --color=tty -T 0

Fark ls 'ye kadar farklı seçeneklere kayıyor, benim durumumda --color=tty en görünür olacak, sisteminiz farklı olabilir.

    
verilen cevap user2394284 22.12.2016 22:45

Etiketlerdeki diğer soruları oku