Rozważ następujący plik wejściowy:
1
2
3
4
Bieganie
{ grep -q 2; cat; } < infile
nic nie drukuje. Spodziewałbym się, że to wydrukuje
3
4
Mogę uzyskać oczekiwany wynik, jeśli zmienię go na
{ sed -n 2q; cat; } < infile
Dlaczego pierwsze polecenie nie wypisuje oczekiwanego wyniku?
Jest to widoczny plik wejściowy i zgodnie ze standardem w OPCJACH :
-q
Quiet. Nothing shall be written to the standard output, regardless of
matching lines. Exit with zero status if an input line is selected.
i dalej, w części UŻYWANIE APLIKACJI (podkreśl moje):
Ta
-q
opcja umożliwia łatwe określenie, czy wzorzec (lub łańcuch) istnieje w grupie plików. Podczas przeszukiwania kilku plików zapewnia poprawę wydajności ( ponieważ może wyjść, gdy tylko znajdzie pierwsze dopasowanie ) [...]
Teraz, zgodnie z tym samym standardem (we wstępie , w obszarze PLIKI WEJŚCIOWE )
Gdy standardowe narzędzie odczytuje widoczny plik wejściowy i kończy się bezbłędnie, zanim osiągnie koniec pliku, narzędzie musi upewnić się, że przesunięcie pliku w otwartym opisie pliku jest właściwie ustawione tuż za ostatnim bajtem przetworzonym przez narzędzie [. ..]
tail -n +2 file
(sed -n 1q; cat) < file
...
Drugie polecenie jest równoważne pierwszemu tylko wtedy, gdy plik jest widoczny.
Dlaczego grep -q
zużywa cały plik?
Ma gnu grep
to znaczenie (choć Kusalananda właśnie potwierdził, że to samo dzieje się na OpenBSD)
grep
to rozwidlenie czegoś zwanego FreeGrep , jeśli ktoś się zastanawia.