Ls çıktısının yeni satırları var, ancak tek satırda görüntüleniyor. Neden?


41

Sanırım kabuk konusunda nispeten temel bir noktaya değiniyor olabilirim. Dan Çıktı ls yenisatırlar sahip hazır ayırır çıkışı tarafından komuta, ama kabuk görüntüler tek bir satırda çıktı.

Bunu bana açıklayan var mı? Çıktının sadece boşluklarla ayrıldığını her zaman düşünmüştüm, ancak şimdi çıktının yeni satırlarla ayrıldığını gördüğümde çıktının ayrı satırlarda görüntülenmesini beklerdim.

Örnek:

cpoweradm@debian:~/lpi103-4$ ls text*
text1  text2  text3

od çıktının yeni satırlarla ayrıldığını gösterir:

cpoweradm@debian:~/lpi103-4$ ls text* | od -c
0000000   t   e   x   t   1  \n   t   e   x   t   2  \n   t   e   x   t
0000020   3  \n
0000022

Yeni satırlar varsa, neden çıktı şu şekilde görünmüyor:

text1 
text2
text3

Yanıtlar:


44

Çıktıyı lsboruladığınızda farklı davranır.

Bu gerçek bilgi dokümantasyonunda gizlidir :

Standart çıktı bir terminal ise, çıktı sütunlar halinde (dikey olarak sıralanır) ve kontrol karakterleri soru işaretleri olarak çıkarılır; Aksi takdirde, çıktı satır başına bir tane listelenir ve kontrol karakterleri olduğu gibi verilir.

Kanıtlamak için koşmayı deneyin

ls

ve sonra

ls | less

Bu, çıktının satır başına bir dosya olmasını garanti altına almak istiyorsanız, aktarılmakta mı yoksa yönlendirilmekte mi olduğuna bakılmaksızın çalıştırmanız gerektiği anlamına gelir.

ls -1

( -1bir numara)

Veya ls | lessçalıştırarak sütunlarda çıktı almak için zorlayabilirsiniz .

ls -C

( -Cbir C harfidir)


6
@ theconnorpower: Bu oldukça spesifik ls. Yararlı, ancak açıkça tutarsız ve şaşırtıcı. Ancak, renkli çıktı üreten bazı komutların da borularda kullanıldığında renkleri çıkartacağını unutmayın.
Mikel

5
@connorpower: Trivia: Unix'in mucitleri Plan9'u yazmaya devam etti. Plan9'da, lsher zaman satır başına bir tane yazdırır ve lcher zaman sütunlarda yazdırır.
Mikel

2
@conconpower: Terminalin boyutunu okuyan ve çıktılarını buna göre ayarlayan programlar da var; örneğin Debian dpkg -l, ekranın tüm genişliğini kullanacak, ancak bir boruya yazdırılıyorsa terminalin 80 sütun genişliğinde olduğunu varsayar ve çıktıyı gerektiğinde sığdırmak için kısaltır.
Mikel

1
@Mikel Plan9'daki ls / lc farklarını duymak ilginç. Detaylı cevap için teşekkürler.
zod90

1
Bir program çıktısının bir dosyaya mı yönlendirileceğini veya bir kabuğa mı gidileceğini nasıl belirleyebilir?
user2820379

4

Keşfiniz, çıktısını ayrıştırmanın lsher zaman kötü bir fikir olmasının birincil sebebini vurgular . Tam bir açıklama için Greg'in wiki'sine bakın .

Sorununuzu tersten düşünün. Bazen çıktıları arasında yeni satırlar yazdırdığını ve bazen oluşturmadığını fark ettiniz. Komut dosyalarında veya -1bayrak tarafından zorla kullanıldığında kullanılır . Her dosyanın sonunda bir yeni satır. Orada ne her satır yeni bir dosya adını temsil hiçbir garantisi . Aslında, eğer bir dosya ismi bir satırsonu içeriyorsa, ls çıktısı kesinlikle ayrıştırılamaz olacaktır. Bu dosya adlarını göz önünde bulundurun:

file1
file2\nfile3
file4

ls -1İçinde onunla bir dizin olduğunda , şuna benzeyen bir şey alırsınız:

file1
file2
file3
file4

Doğal olarak dört dosya olduğunu varsaymaz mıydınız? Öyleyse, ls'nin çıktısını ayrıştıran herhangi bir komut dosyası olurdu. Gerçekte, biri zor bir isim olan üç dosya var, ancak bunu ls'nin çıktısından anlayamazsınız. *

* -lBayrağı kullanıp çıktığınızın farkedilmediğini fark etmediyseniz, ancak senaryolarınız yine de boğulacaktı.


3
Eğer varsa gerçekten çıkışını ayrıştırmak zorunda ls, -bopsiyon yardımcı olabilir. Newline'ı \nvs.'ye çevirir .
Mikel
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.