ls komutu alıcıya bağlı olarak farklı çalışıyor


12

Komutlar lsstdout'unun ne olduğunu nasıl biliyor?

lsHedef stdout'un ne olduğuna bağlı olarak farklı çalışıyor gibi görünüyor . Örneğin, eğer:

ls /home/matt/tmp 

sonuç:

a.txt b.txt c.txt

Ancak yaparsam

ls /home/matt/tmp | cat

sonuç (yani sonuç başına yeni satır):

a.txt
b.txt
c.txt

İşlem stdout için bir dosya tanımlayıcı 1 geçirilir değil mi? Sonucun nasıl formatlanacağını nasıl belirler? Dosya tanımlayıcı bilgileri gösteriyor mu?


İlgili unix.stackexchange.com/q/157285/4671 , unix.stackexchange.com/q/63108/4671 ve muhtemelen diğerleri. Popüler bir konu gibi görünüyor. Bu, bunlardan birinin bir kopyası olabilir.
Faheem Mitha

Yanıtlar:


22

lsProgramın kullandığı isatty()fd 1 TTY veya başka bir şey (boru, dosya, vb ...) olup olmadığını bilmek. Gönderen man 3 isatty:

int isatty(int fd);

TARİFİ olup fonksiyon testleri bir terminal atıfta açık bir dosya tanımlayıcıdır
isatty()fd


Güncelleme:ls.c coreutils'den 1538 Satırı (git revizyon 43a987e1):

  if (isatty (STDOUT_FILENO))
    {
      format = many_per_line;
      /* See description of qmark_funny_chars, above.  */
      qmark_funny_chars = true;
    }

( many_per_linekendini tanımlayıcı olmalıdır.)


8

Tam bir cevap değil, bir örnekleme. Bir Bash komut size benzer etkiyi elde edebilirsiniz test/ [['s -t:

-t FD True if FD is opened on a terminal.

Bu şekilde kullanmak:

bash-4.2$ where() { [[ -t 1 ]] && echo 'my output goes to TTY' || echo 'my output is redirected'; }

bash-4.2$ where
my output goes to TTY

bash-4.2$ where | cat
my output is redirected

bash-4.2$ where > test.file
bash-4.2$ cat test.file
my output is redirected

6

OpenBSD ls(1) kılavuzundan :

Varsayılan olarak, ls, standart çıktıya satır başına bir giriş listeler; istisnalar terminallerde veya -C, -m veya -x seçenekleri belirtildiğinde yapılır.

Daha sonra:

-1 (`` one '' sayısal basamağı.) Çıkışı her satıra bir giriş olmaya zorlar. Çıkış bir terminale olmadığında bu varsayılan değerdir.

[...]

-C Kuvvet çok sütunlu çıkış; çıkış bir terminale olduğunda bu varsayılan değerdir.


1

Komutu lskullanarak bir sözde terminalde çalışabilir script, çıkışını lsbaşka bir komuta yönlendirebilir ve stdout akışında böyle bir borulama yokmuş gibi aynı çıktı biçimini alabilirsiniz, örneğin stdout bir terminal (tty) gibi.

Altta yatan İçin isatty()zaten Stéphane Gimenez tarafından işaret mekanizma bkz ls.c .

ls -G /
ls -G / | cat
script -q /dev/null ls -G / | sed $'s/\r$//g' | cat

# tty | cat
# script -q /dev/null tty | cat
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.