Considérez le fichier d'entrée suivant:
1
2
3
4
Fonctionnement
{ grep -q 2; cat; } < infile
n'imprime rien. Je m'attendrais à ce qu'il s'imprime
3
4
Je peux obtenir la sortie attendue si je la change en
{ sed -n 2q; cat; } < infile
Pourquoi la première commande n'imprime-t-elle pas la sortie attendue?
C'est un fichier d'entrée recherché et selon la norme sous OPTIONS :
-q
Quiet. Nothing shall be written to the standard output, regardless of
matching lines. Exit with zero status if an input line is selected.
et plus bas, sous UTILISATION DE L'APPLICATION ( mettez l' accent sur le mien):
L'
-qoption permet de déterminer facilement si un modèle (ou une chaîne) existe ou non dans un groupe de fichiers. Lors de la recherche de plusieurs fichiers, il offre une amélioration des performances ( car il peut se fermer dès qu'il trouve la première correspondance ) [...]
Maintenant, selon le même standard (dans Introduction , sous INPUT FILES )
Lorsqu'un utilitaire standard lit un fichier d'entrée recherché et se termine sans erreur avant d'atteindre la fin du fichier, l'utilitaire doit s'assurer que l'offset de fichier dans la description du fichier ouvert est correctement positionné juste après le dernier octet traité par l'utilitaire [. ..]
tail -n +2 file
(sed -n 1q; cat) < file
...
La deuxième commande est équivalente à la première uniquement lorsque le fichier est recherché.
Pourquoi grep -qconsomme tout le fichier?
C'est gnu grepsi cela importe (bien que Kusalananda vient de confirmer que la même chose se produit sur OpenBSD)
grepest un fork de quelque chose appelé FreeGrep , si quelqu'un se demande.