Skąd takie polecenia ls
wiedzą, co to jest standardowe wyjście?
Wygląda na ls
to, że działa inaczej w zależności od tego, co jest docelowe. Na przykład, jeśli zrobię:
ls /home/matt/tmp
wynik to:
a.txt b.txt c.txt
Jeśli jednak to zrobię
ls /home/matt/tmp | cat
wynikiem jest (tj. nowa linia na wynik):
a.txt
b.txt
c.txt
Proces jest przekazywany deskryptorowi pliku 1 dla standardowego wejścia, prawda? Jak określa sposób sformatowania wyniku? Czy deskryptor pliku ujawnia informacje?
command-line
io-redirection
ls
tty
Mâtt Frëëman
źródło
źródło
Odpowiedzi:
Do
ls
zastosowania programuisatty()
wiedzieć, czy fd 1 jest tty lub coś innego (rura, plików, itp ...). Odman 3 isatty
:Aktualizacja: Linia 1538
ls.c
z Coreutils (git wersja 43a987e1):(
many_per_line
powinien być opisowy).źródło
Nie jest to dokładna odpowiedź, ale przykład. W skrypcie Bash możesz osiągnąć podobny efekt za pomocą
test
/[[
's-t
:Używając tego w ten sposób:
źródło
Z
ls(1)
podręcznika OpenBSD :Następnie:
[...]
źródło
Możesz wykonać
ls
w pseudo-terminalu za pomocąscript
polecenia, przesłać dane wyjściowels
do innego polecenia i uzyskać taki sam format wyjściowy, jak gdyby nie było takiego potoku strumienia standardowego, tzn. Jakby standardowe było terminalem (tty).Dla bazowego
isatty()
mechanizmu wskazał już Stéphane Gimenez zobaczyć ls.c .źródło