Nicht deterministisches Verhalten von Grep in Verbindung mit More

308
bers

Was erwarten Sie danach?

for /l %i in (1,1,100) do @more some.bbl | grep a | md5sum 

Höchstwahrscheinlich nicht das:

ec3ecb76408d4225ff23a25d0596e00f *- 13cfd899b90b9cd7aedb406a785e8eac *- 737e8898a65657f1a2ce8012ff1ffe82 *- d4095243e56a7da3b31a352423a5417a *- 319db7810e677414ca1609238bdeba6f *- 31e626a8ce0732fda1fa7499c8b13dfa *- 006fe390f923d50348d65d0bbefa64d8 *- 77708f62cb2d61a45788a656d0979aee *- cda10a9ab71c2bce4df069c479241349 *- b01b71dc7dca11808ca989c4985513ca *- c22a6f8b1cac9a93c4fe10b07a9f483a *- 0b04f4b24f3f183270eb7414f4f86e3d *- 5a2f8b8ad482ae8f70b7ce3384a7c9e2 *- beccdbe737b48c02b48c4524cd89eede *- a16fec5238cfe8dfff6b403ff943a8ca *- ec0cd2edc0009abd14119915a8b563f4 *- 1e78f0012ca09aeade169f815415da40 *- ... 

Ich war auch besorgt, also habe ich ein paar Gesundheitsprüfungen durchgeführt:

for /l %i in (1,1,100) do @more some.bbl | md5sum 

ergibt 100 mal

ace4f37f3a1433e29696a535c0b79f2c *- 

Gleiches für

for /l %i in (1,1,100) do @grep a some.bbl | md5sum 

und

d8753d755025a1119cd2910c6f5cb0de *- 

Also more, grepund md5sumfunktioniert gut von selbst. Auch das Rohr vorher md5sumist kein Problem, da

for /l %i in (1,1,100) do @more some.bbl | grep a > out%i md5sum out* 

bestätigt das Problem. fcBei den Ausgängen finde ich keinen Unterschied. diffWenn Sie diese Einstellungen verwenden, werden unsichtbare Unterschiede sichtbar, die von einem Hex-Editor als Unterschiede in den Zeilenenden an scheinbar zufälligen Stellen (und von Datei zu Datei) bestätigt wurden.

Das Problem wird immer noch gesehen, in diesem Beispiel jedoch seltener:

for /l %i in (1,1,100) do @more some.bbl | grep "[a-z]" | md5sum 

nachgeben

b135bcfe0bcfb7f1c43fe1905164c31e *- b135bcfe0bcfb7f1c43fe1905164c31e *- b135bcfe0bcfb7f1c43fe1905164c31e *- b135bcfe0bcfb7f1c43fe1905164c31e *- ef23817185d41987c11cb1fc4371bb76 *- b135bcfe0bcfb7f1c43fe1905164c31e *- b135bcfe0bcfb7f1c43fe1905164c31e *- b135bcfe0bcfb7f1c43fe1905164c31e *- e398e63b60cee3e271967f01350068f1 *- b135bcfe0bcfb7f1c43fe1905164c31e *- b135bcfe0bcfb7f1c43fe1905164c31e *- b135bcfe0bcfb7f1c43fe1905164c31e *- ... 

Jetzt laufen mir die Ideen aus, was der Grund sein könnte. Mir würde das nicht viel bedeuten, wenn ich in solchen Fällen keine gültigen Zeilen verlieren würde:

for /l %i in (1,1,100) do @more "some.bbl" | grep "\}$" | wc -l 

Das gibt

249 249 249 248 255 253 252 248 251 ... 

Um ähnliche Probleme zu reproduzieren, können Sie diese Datei verwenden

for /l %i in (1,1,200) do @echo XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX>> some.bbl 

Weitere Informationen

C:\>ver  Microsoft Windows [Version 6.1.7601]  C:\>more /h  Displays output one screen at a time.  MORE [/E [/C] [/P] [/S] [/Tn] [+n]] < [drive:][path]filename ...  C:\>grep --ver  GNU grep 2.6.3  Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.  C:\>md5sum --ver  md5sum (GNU coreutils) 8.15 Packaged by Cygwin (8.15-1) Copyright (C) 2012 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.  Written by Ulrich Drepper, Scott Miller, and David Madore. 

Warum passiert dies?

Aktualisieren: Das Problem verschwindet auch durch das Ersetzen morevon dieser cat:

C:\>cat --ver  cat (GNU coreutils) 8.15 Packaged by Cygwin (8.15-1) Copyright (C) 2012 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.  Written by Torbjörn Granlund and Richard M. Stallman. 
1
Warum verwenden Sie mehr auf diese Weise und was genau möchten Sie erreichen? qasdfdsaq vor 9 Jahren 0
Ich kann mich nicht erinnern, warum ich anfangs "more" verwendet habe. Ich habe jedoch festgestellt, dass in einigen Fällen "mehr | grep ist schneller als "grep". Ist es nicht völlig irrelevant, warum ich "more" (und nicht "cat" oder "grep" oder was auch immer) in Bezug auf meine Frage verwende? Weg? bers vor 9 Jahren 0
Ich denke, es ist relevant, weil nicht beabsichtigt ist, auf diese Weise mehr zu verwenden. Meine Vermutung ist, dass Sie mehr in einer Weise verwenden, in der es nicht dafür ausgelegt ist, zu funktionieren, dass es zur falschen Zeit fälscht oder zurückkehrt oder Ihre Terminalparameter falsch erkennt, weil es kein Terminal gibt. Ich wäre nicht überrascht, wenn ein Programm sich nicht deterministisch verhält, wenn das dokumentierte Verhalten "undefiniert" ist. qasdfdsaq vor 9 Jahren 0
Oh. Sie glauben also, dass die Tatsache, dass "more" eine Terminal-Eingabe am Ende eines Bildschirms erwartet (wenn die Ausgabe nicht umgeleitet wird), die Ausgabe beeinträchtigen könnte? Und die scheinbare Zufälligkeit ergibt sich im Wesentlichen aus der Position auf einem virtuellen Terminalfenster? Das könnte tatsächlich Sinn machen. bers vor 9 Jahren 0

0 Antworten auf die Frage