Myślę, że mogę przeoczyć względnie podstawową kwestię dotyczącą powłoki. Dane wyjściowe z polecenia ls domyślnie rozdzielają dane wyjściowe nowymi wierszami, ale powłoka wyświetla dane wyjściowe w jednym wierszu.
Czy ktoś może mi to wytłumaczyć? Zawsze zakładałem, że dane wyjściowe były po prostu oddzielone spacjami, ale teraz, gdy widzę dane wyjściowe oddzielone znakami nowej linii, oczekiwałbym, że dane wyjściowe będą wyświetlane w osobnych wierszach.
Przykład:
cpoweradm@debian:~/lpi103-4$ ls text*
text1 text2 text3
od pokazuje, że dane wyjściowe są oddzielone znakami nowej linii:
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
Jeśli nowe linie są obecne, to dlaczego dane wyjściowe nie są wyświetlane jako:
text1
text2
text3
ls
. Jest użyteczny, ale wyraźnie niespójny i zaskakujący. Pamiętaj jednak, że niektóre polecenia, które generują kolorowe wydruki, usuwają kolory również podczas pipowania.ls
zawsze drukuje po jednym w wierszu ilc
zawsze drukuje w kolumnach.dpkg -l
wykorzysta całą szerokość ekranu, ale jeśli drukuje na rurze, zakłada, że terminal ma szerokość 80 kolumn , i skraca wyjście, aby dopasować je w razie potrzeby.Twoje odkrycie podkreśla główny powód, dla którego analizowanie wyników
ls
jest zawsze złym pomysłem. Zobacz wiki Grega, by uzyskać pełne wyjaśnienie .Pomyśl o swoim problemie na odwrót. Zauważyłeś, że ls czasami robi, a czasami nie drukuje znaków nowej linii między danymi wyjściowymi. Do użytku w skryptach lub po wymuszeniu
-1
flagi. Jedna nowa linia na końcu każdego pliku. Co nie ma gwarancji, że każda nowa linia reprezentuje nową nazwę pliku . W rzeczywistości, jeśli nazwa pliku zawiera nowy wiersz, wynik działania ls będzie absolutnie niemożliwy do parsowania. Rozważ te nazwy plików:Gdy masz
ls -1
katalog z tym, dostaniesz coś, co wyglądało tak:Czy naturalnie nie założyłbyś, że są cztery pliki? Podobnie skrypty analizujące dane wyjściowe ls. W rzeczywistości istnieją trzy pliki, jeden z trudną nazwą, ale nie byłbyś w stanie tego zrozumieć na podstawie danych wyjściowych ls. *
* Chyba że użyjesz
-l
flagi i zauważysz, że wynik został zablokowany, ale twoje skrypty nadal dławią się.źródło
ls
,-b
opcja może pomóc. Zmienia nową linię w\n
itp.