borulu ls -1 ile aynı mıdır?


19

lsbirkaç sütunda çıktı döndürür, oysa ben denedim dizinleri ls|catile bayt-özdeş çıktı döndürür ls -1. Hâlâ ls -1cevapların içinde olduğunu görüyorum ls -1|wc -l. Tercih etmek için bir sebep var mı ls -1? Neden ...|catçıktısını değiştiriyor ls?


1
dosya adları yeni satırlar içerebilir, bu nedenle bunları birkaç kez sayabilirsiniz ... bunun yerine posixly yapabilirsiniz: n=0; for i in .* *; do ((n++)) ; done ; echo $n(bu sayıları saymak istemiyorsanız. * 'ı bırakın). veya: ls -1d ./.* ./* | grep '^\./' | wc -l (dosya adları '/'
içeremediğinden

3
lsbir terminale çıkış genellikle varsayılan olarak renk kodları içerir. Terminale olmayan bir çıktıda, renk varsayılan olarak devre dışıdır. --color={always,auto,never}GNU'da bu IIRC'dir. Birine renk eklenir ancak diğeri dahil edilmezse, çıktılar ekranda aynı görünebilir, ancak baytla aynı değildir (renk kodları ls çıkışının bir parçasını oluşturur).
CVn

@ MichaelKjörling Sanırım bunu bir cevap olarak yazmalısınız.
200_success

@ MichaelKjörling Bu dikkate almadığım ilginç bir şey. Her zaman renk ve sütun çıkışı vb.
rubystallion

@rubystallion Kulağa hoş bir soru gibi geliyor.
CVn

Yanıtlar:


26

lsçıkışın bir terminale gidip gitmediğini test eder. Çıkış bir terminale gitmiyorsa -1, varsayılan değer budur. (Bu biri tarafından geçersiz kılınabilir -C, -mveya -xseçenekleri.)

Böylece, lsbir boru hattında kullanıldığında ve başka bir seçenekle geçersiz kılmadığınızda ls, kullanacaktır -1. Bu davranış POSIX için gerekli olduğundan buna güvenebilirsiniz

POSIX Özellikleri

-1Çıkış bir terminale gitmediğinde POSIX varsayılan olarak gerektirir :

POSIX spesifikasyonu :

Varsayılan biçim, standart çıktıya satır başına bir giriş listelemek olmalıdır; istisnalar terminallerde veya -C, -m veya -x seçeneklerinden biri belirtildiğinde yapılır. Çıktı bir terminale ise, biçim uygulama tanımlıdır.

Varsayılan tek sütun biçimini geçersiz kılan üç seçenek şunlardır:

-C
Harmanlama sırasına göre, girişleri sütunlara göre sıralanmış şekilde çok metinli sütun çıktısı yazın. Metin sütunlarının ve sütun ayırıcı karakterlerin sayısı belirtilmedi, ancak çıktı aygıtının yapısına göre uyarlanmalıdır. Bu seçenek uzun format çıktısını devre dışı bırakır.

-m
Akış çıktı biçimi; yol adları, <comma> karakteri ve ardından <space> karakteri ile ayrılmış olarak listelenir. Liste sonlandırıcı olarak ve sonraki liste girişi için bir satırda yer olmadığında ayırıcı diziden sonra <newline> karakteri kullanın. Bu seçenek uzun format çıktısını devre dışı bırakır.

-x
Çoklu metin sütunu çıktısının sütunlar yerine aşağı sıralanmış girişlerle üretilmesi dışında -C ile aynıdır. Bu seçenek uzun format çıktısını devre dışı bırakır.

GNU Belgeleri

Gönderen GNU manuel ls :

'-1'
'--format = tek sütunlu'
Satır başına bir dosya listele. Standart çıkış terminal olmadığında bu ls için varsayılan değerdir . Bir dosya adı içindeki yeni satır karakterlerinin doğrudan çıktısını bastırmak için -b ve -q seçeneklerine de bakın. [Vurgu eklendi]

Örnekler

Üç dosya oluşturalım:

$ touch file{1..3}

Çıktı bir terminale gittiğinde, GNU lsçok sütunlu bir format kullanmayı seçer:

$ ls
file1  file2  file3

Çıktı bir boru hattına gittiğinde, POSIX spesifikasyonu varsayılan olarak tek sütunun olmasını gerektirir:

$ ls | cat
file1
file2
file3

Varsayılan tek sütun davranışını geçersiz kılan üç istisna -m, virgülle ayrılmış, -Csıralanan sütunlar ve -xsıralanan sütunlar içindir:

$ ls -m | cat
file1, file2, file3
$ ls -C | cat
file1  file2  file3
$ ls -x | cat
file1  file2  file3

"POSIX, çıkış bir terminale gittiğinde varsayılan olarak -1 gerektirir:" ... ancak tırnak, çıkış terminale (veya diğer koşullara) -1
gitmesi

@muru Bunu yakaladığınız için teşekkürler! Yanıt güncellendi.
John1024

Her bulutun gümüş bir astarı var. Cevabınız benimkinin gönderilmesinden önce kabul edildiğinden, korkak bir pizza şapkası aldım!
G-Man,

@ G-Man Çok iyi. Ve yakışıklı bir şapka!
John1024

9
  • Standart çıkışın borulaması neden davranışını değiştirir ls? Çünkü bu şekilde tasarlandı. POSIX Şartname diyor ki:

    Varsayılan biçim, standart çıktıya satır başına bir giriş listelemek olacaktır; istisnalar terminallere veya biri olduğunda -C, -mya da -xseçenekleri belirtilir. Çıktı bir terminale ise, biçim uygulama tanımlıdır.

    (Böyle bir seçeneğin belirttiği değilken hangi varsayılan davranışı hakkında aslında belirsiz -lveya -1bir terminal için çıkış ile) ve GNU coreutils dokümantasyon diyor

    Standart çıktı bir terminalse, çıktı sütunlardadır (dikey olarak sıralanır) ve kontrol karakterleri soru işareti olarak çıkarılır; aksi takdirde, çıktı her satıra bir tane olarak listelenir ve kontrol karakterleri olduğu gibi verilir.

    Böylece bir dosyaya çıktının bir boruya çıktının aynısı olacağını görebilirsiniz; yani her satırda bir giriş -1belirtilmiş gibi.

  • Neden bu şekilde tasarlandı? (Birisi bazı tasarım notları bulamazsa) kesin olarak bilmek mümkün olmayabilir, ancak sanırım:
    • Bir lsterminale yazarken, bir insanın çıktıya bakmasını bekler. İnsanlar gereken minimum sayıda satırda bilgi almayı tercih ederler, bu yüzden şeyler ekranda kaymaz.
    • Bir lsboruya yazarken, başka bir programın çıktıyı okumasını bekler. Bir program için satır başına bir değer olan verileri okumak, sütunları ayrıştırmaya çalışmaktan daha kolaydır (dosya adları boşluk içerebileceğinden).
  • ls -1 Bir dosyaya veya pipoya yazarken tercih etmek için herhangi bir neden var mı ? Hayır.

-4

Ls boruları oluştururken, ls konsolun gerçekte ne kadar sütuna sahip olduğunu belirleyemez (sağ taraf komutundan bağımsız olarak). Bu yüzden ls sadece kendi seçimine göre yapar, ya da başka bir deyişle, bu davranış kararsızdır ve gelecekteki sürümlerde değişebilir.

Buna karşılık, ls -1genel olarak sayma veya komut dosyası oluşturma amacıyla oluşturulmuştur, bu nedenle davranışı sabittir.


9
Diğer yanıtların söylediği gibi, bu davranış POSIX için gereklidir, bu nedenle dengesiz çağırmak yanlıştır.
Henrik - Monica'ya zarar
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.