Considera il seguente file di input:
1
2
3
4
In esecuzione
{ grep -q 2; cat; } < infile
non stampa nulla. Mi aspetto che stampi
3
4
Posso ottenere l'output previsto se lo cambio in
{ sed -n 2q; cat; } < infile
Perché il primo comando non stampa l'output previsto?
È un file di input ricercabile e secondo lo standard in OPZIONI :
-q
Quiet. Nothing shall be written to the standard output, regardless of
matching lines. Exit with zero status if an input line is selected.
e più in basso, in USO DELL'APPLICAZIONE (sottolineare il mio):
L'
-q
opzione fornisce un mezzo per determinare facilmente se esiste o meno un modello (o una stringa) in un gruppo di file. Durante la ricerca di più file, fornisce un miglioramento delle prestazioni ( perché può uscire non appena trova la prima corrispondenza ) [...]
Ora, per lo stesso standard (in Introduzione , sotto INPUT FILES )
Quando un'utilità standard legge un file di input ricercabile e termina senza errori prima che raggiunga la fine del file, l'utilità deve assicurarsi che l'offset del file nella descrizione del file aperto sia posizionato correttamente dopo l'ultimo byte elaborato dall'utilità [. ..]
tail -n +2 file
(sed -n 1q; cat) < file
...
Il secondo comando è equivalente al primo solo quando il file è ricercabile.
Perché grep -q
consuma l'intero file?
Questo è gnu grep
importante (anche se Kusalananda ha appena confermato che lo stesso accade su OpenBSD)
grep
è un fork di qualcosa chiamato FreeGrep , se qualcuno si chiede.