ls
zwraca dane wyjściowe w kilku kolumnach, podczas gdy ls|cat
zwraca dane identyczne z bajtami ls -1
dla katalogów, które próbowałem. Nadal widzę wiele ls -1
odpowiedzi ls -1|wc -l
. Czy jest jakiś powód, aby preferować ls -1
? Dlaczego ...|cat
zmienia wyjście ls
?
19
n=0; for i in .* *; do ((n++)) ; done ; echo $n
(upuść. *, jeśli nie chcesz liczyć tych). lub:ls -1d ./.* ./* | grep '^\./' | wc -l
(ponieważ nazwy plików nie mogą zawierać „/”)ls
dane wyjściowe na terminalu zwykle domyślnie zawierają kody kolorów. W przypadku danych wyjściowych do terminala kolor jest zazwyczaj domyślnie wyłączony. W GNU jest to--color={always,auto,never}
IIRC. Jeśli kolor jest zawarty w jednym, ale nie w innym, wówczas wyniki mogą wyglądać identycznie na ekranie, ale nie są identyczne bajtowo (kody kolorów stanowią część wyniku ls).Odpowiedzi:
ls
sprawdza, czy wyjście trafia do terminala. Jeśli dane wyjściowe nie trafiają do terminala, to-1
jest to ustawienie domyślne. (To może być zmieniona przez jednego z-C
,-m
lub-x
opcji).Tak więc, gdy
ls
jest używany w potoku i nie zastąpiłeś go inną opcją,ls
użyje-1
. Możesz na tym polegać, ponieważ takie zachowanie jest wymagane przez POSIXSpecyfikacja POSIX
POSIX wymaga
-1
domyślnie, gdy dane wyjściowe nie trafiają do terminala:Specyfikacja POSIX :
Te trzy opcje, które zastępują domyślny format jednokolumnowy to:
Dokumentacja GNU
Z podręcznika GNU ls :
Przykłady
Utwórzmy trzy pliki:
Gdy dane wyjściowe trafiają do terminala, GNU
ls
decyduje się na użycie formatu wielokolumnowego:Gdy dane wyjściowe trafiają do potoku, specyfikacja POSIX wymaga, aby domyślna była jedna kolumna:
Trzy wyjątki, które zastępują domyślne zachowanie
-m
dla pojedynczej kolumny, dotyczą rozdzielania przecinkiem,-C
sortowania kolumn i-x
sortowania według kolumn:źródło
-1
wartości domyślnej, z wyjątkiem sytuacji, gdy dane wyjściowe trafiają do terminala (lub innych warunków)Dlaczego potokowanie standardowego wyjścia zmienia zachowanie
ls
? Ponieważ tak zostało zaprojektowane. POSIX Specyfikacja mówi:co jest w rzeczywistości dwuznaczne co do domyślnego zachowania (gdy nie jest określone przez opcję taką jak
-l
lub-1
) z wyjściem do terminala, a dokumentacja GNU Coreutils mówiMożesz więc zobaczyć, że wyjście do pliku będzie działało tak samo jak wyjście do potoku; to jest jeden wpis w wierszu, tak jakby
-1
został określony.ls
pisze do terminala, oczekuje, że człowiek patrzy na wynik. Ludzie wolą otrzymywać informacje w minimalnej niezbędnej liczbie wierszy, aby rzeczy nie przewijały się na ekranie.ls
pisze do potoku, oczekuje, że inny program odczyta dane wyjściowe. O wiele łatwiej jest programowi odczytać dane, które mają jedną wartość w wierszu, niż próbować parsować kolumny (ponieważ nazwy plików mogą zawierać spacje).ls -1
pisanie do pliku lub potoku? Nie.źródło
Podczas potokowania ls, ls nie może określić, ile kolumn faktycznie ma konsola (niezależnie od polecenia po prawej stronie). Czyni to po prostu według własnego wyboru, czyli innymi słowy, takie jest zachowanie niestabilne i może ulec zmianie w przyszłych wersjach.
Natomiast
ls -1
został stworzony w celu zliczania lub pisania skryptów, więc jego zachowanie jest stabilne.źródło