Uproszczone wyjaśnienie
Podobnie jak wiele narzędzi, nie jest to coś osobliwego dla jednego programu, grep
zmienia standardowe wyjście między buforowaniem liniowym a buforowaniem pełnym . W pierwszym przypadku biblioteka C buforuje dane wyjściowe w pamięci, dopóki bufor przechowujący te dane nie zostanie wypełniony lub nie zostanie do niego dodany znak przesunięcia wiersza (lub program zakończy się czysto), po czym wywołuje write()
zapis zawartości bufora. W tym drugim przypadku tylko bufor w pamięci zapełniający się (lub program kończy się czysto) wyzwala write()
.
Bardziej szczegółowe wyjaśnienie
To jest dobrze znane, ale nieco błędne wyjaśnienie. W rzeczywistości standardowe wyjście nie jest buforowane liniowo, lecz inteligentnie buforowane w bibliotece GNU C i bibliotece BSD C. Standardowe wyjście jest także zaczerwieniona podczas czytania standardowego wejścia wyczerpuje swój bufor w pamięci (pre-odczytu wejścia) i biblioteka C ma zadzwonić read()
, aby pobrać trochę więcej wejście i to czyta początek nowej linii. (Jednym z powodów jest zapobieganie zakleszczeniu, gdy inny program łączy się z oboma końcami filtra i oczekuje, że będzie w stanie działać linia po linii, naprzemiennie między zapisem do filtra a odczytem z niego; jak „koprocesowanie” w GNU awk
na przykład.)
Wpływ biblioteki C.
grep
i inne narzędzia to robią - lub ściślej mówiąc, biblioteki, których używają, robią to, ponieważ jest to zdefiniowana funkcja programowania w języku C - w oparciu o to, co wykrywają jako standardowe wyjście. Jeśli (i tylko jeśli) nie jest to urządzenie interaktywne, wybierają pełne buforowanie, w przeciwnym razie wybierają inteligentne buforowanie. Potok jest uważany za urządzenie nieinteraktywne, ponieważ definicja bycia urządzeniem interaktywnym, przynajmniej w świecie Unixa i Linuksa, jest w istocie isatty()
wywołaniem zwracającym wartość true dla odpowiedniego deskryptora pliku.
Obejścia, aby wyłączyć pełne buforowanie
Niektóre narzędzia, takie jak grep
takie idiosynkratyczne, jak --line-buffered
ta, zmieniają tę decyzję, która, jak widać, jest źle nazwana. Ale znikomo niewielka część programów filtrujących, których można użyć, faktycznie ma taką opcję.
Mówiąc bardziej ogólnie, można użyć narzędzi, które zagłębiają się w określone elementy wewnętrzne biblioteki C i zmieniają jej proces decyzyjny (które mają problemy z bezpieczeństwem, jeśli program, który ma zostać zmieniony, ma ustawiony UID, a także są specyficzne dla poszczególnych bibliotek C, i faktycznie są specyficzne dla programów napisanych lub ułożonych warstwowo na języku C) lub takie narzędzia ptybandage
, które nie zmieniają wewnętrznych elementów programu, ale po prostu wstawiają pseudo-terminal jako standardowe wyjście, aby decyzja była „interaktywna”, aby wpływać na to.
Dalsza lektura
cat
łączy pliki. Co próbujesz zrobić, dołączając do niegocat
?