Arasındaki İlişki ls
vedir
ls
ve dir
benzer şekilde davranan ayrı programlardır. Açıkladı ve aşağıda başvurulan gibi, amacı dir
gibi bir komut sağlamaktır ls
çıkış bir terminale gidiyor olup olmadığına bağlı olarak değişmez kimin . Bunu yararlı dir
bir ş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
dir
bir takma ad olduğuna inanmaktadır ls
, ancak durum böyle değil. Her iki komut da diğerinin dir
takma adı değildir ve varsayılan olarak Ubuntu'da takma ad değildir. ls
ve dir
ayrı, aynı olmayan çalıştırılabilir öğeler tarafından sağlanır.
- Birçok kişi
dir
belirsiz 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. ls
uyumluluk için yaptığı gibi davranır. dir
Standart 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 ls
ve dir
farklı?
Her ikisi de ls
ve dir
dizinlerin içeriğini listeler. Varsayılan davranışlarındaki iki özel fark onları ayırt eder.
Bunu yaparken standart çıktı bir terminal, ls
dikey olarak sıralanmış sütunlar (benzerlerinde dosya listeler ls -C
). Standart çıktısı bir terminal olmadığında (örneğin, bir dosya veya boru ), ls
her satırda bir tane olan dosya adlarını listeler (benzeri ls -1
).
Standart çıktısının bir terminal olup olmadığı, dir
dosya adlarını dikey olarak sıralanmış sütunlarda (benzeri ls -C
) listeler .
Her ikisi için ls
ve dir
bu varsayılan tarafından geçersiz kılınabilir --format=
bayrak ve tarafından -1
, -C
, -m
ve -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 .
Standart çıkış listelenmesi için bir terminal ve bir dosya olduğunda içeren kontrol karakterleri , ls
baskı ?
yerine her bir kontrol karakteri (gibi ls -q
). Standart çıkışı bir terminal olmadığında ls
kontrol karakterlerini olduğu gibi yazdırır (gibi ls --show-control-chars
).
Standart çıktısının bir terminal olup olmadığı, dir
bir 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 dir
adlandırılan bir girişi listeler . Bu gibi .Documents backups
Documents\ backups
ls -b
Her ikisi için ls
ve dir
bu 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 dir
yardı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 ls
veya 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 dir
program
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, ls
cihaza 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.
ls
Aygıtın bağımsız olarak davranması makul bir şekilde yazılamamış olsa da, dir
bunu başarmak için ayrı bir yardımcı program oluşturulmuştur. Böylece dir
tarihsel compatibility-- nedeniyle garip davranır yarar değil ls
ise .
Nasıl çalıştığını görmek için ls
, dir
ve ilgili vdir
bkz yarar gereksiz kod tekrarına olmadan coreutils kaynak kodunda uygulanan ls-dir.c
, ls-ls.c
, ls-vdir.c
, ls.h
, ve ls.c
.
Mı dir
gerçekten yararlı?
Daha önce ( ) ls
borularına bağladığınızda veya bir dosyaya ( ) yönlendirdiğinizde bile çoklu sütun çıktısı oluşturmayı dilediyseniz , veya kullanabilirsiniz .less
ls | less
ls > out.txt
dir
ls -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, dir
ya da kullanabilirsiniz ls -b
.
dir
eşittir ls -Cb
, bu yüzden bu anlamda ihtiyacınız yok dir
. Ancak dir
pratikte 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
. ls
Hem 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 ls
komuttur . 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
, dir
ya 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
ls
Takma adın ( alias ls='ls --color=auto'
) yorumlanmadığını fark edeceksiniz, bunun için olanlar dir
ve vdir
yorumlanmadıkları #
için hiçbir etkisi olmaz. Yani, süre dir
, bir takma değil ls
edilir (ancak etmek dir
) .
dir
Renkli çıktılar da nasıl üretebilirim?
Renkli çıktıyı etkinleştirmek için, ana dizininizde dir
düzenleme .bashrc
yapı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 dir
takma 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 dir
ters düşüyor - çıkış cihazından bağımsız olarak aynı tür çıktılar üretmesi gerekiyor. Ancak:
- Bu
dir
takma 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
\dir
ya command dir
, dir
hala aygıttan bağımsız çıktı üretecektir. Bu, o örtüşme demek ki dir
hiç dir --color=auto
gerçekten sonu yok dir
.
dir --color
;)