Недетермінована поведінка Грепа в поєднанні з Море


1

Що ви очікуєте після цього:

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

Швидше за все, не це:

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

Я теж хвилювався, тому я провів пару перевірок здорового стану:

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

врожайність в 100 разів

ace4f37f3a1433e29696a535c0b79f2c *-

Те саме для

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

і

d8753d755025a1119cd2910c6f5cb0de *-

Отже more, grepі md5sumдобре працюйте самі. Також труба раніше md5sumне є проблемою, оскільки

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

підтверджує питання. fcЩо стосується результатів, я не знаходжу різниці. diffІнфінг їх позначає невидимі відмінності, підтверджені шестигранним редактором, що це відмінності в закінченнях рядків у, здавалося б, випадкових місцях (і відрізняються від файлу до файла).

Проблема все ще спостерігається, але рідше - у цьому прикладі:

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

врожайний

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

Зараз у мене не вистачає ідей, в чому може бути причина. Я б не переймався цим, якби не втрачав жодних дійсних рядків у таких випадках:

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

Це дає

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

Для відтворення подібних проблем ви можете використовувати цей файл

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

Ще трохи інформації

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.

Чому це відбувається?

Оновлення: проблема також усувається, замінивши moreце 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.

Чому ви використовуєте більше таким чином і чого саме намагаєтесь досягти?
qasdfdsaq

Я не пам'ятаю, чому я спочатку використовував more. Однак я помітив, що в деяких випадках more | grepце швидше, ніж grep. У будь-якому випадку, чи не зовсім несуттєво, чому я використовую more(а не cat, чи grep, або що інше) стосовно мого питання, Чому комбінація інструментів командного рядка поводиться недетерміновано?
Берс

Я думаю, що це актуально, тому що більше не призначене для використання таким чином. Я здогадуюсь тому, що ви більше використовуєте те, що він не розроблений для функціонування, він відкидає або повертається в неправильний час або неправильно визначає параметри вашого терміналу, оскільки терміналу немає. Я би не здивувався програмі, що поводиться недетерміновано, коли її документальне поведінка "не визначено"
qasdfdsaq

Ой. Ви думаєте, той факт, що moreочікує, що термінальний вхід в кінці екрана (коли вихід не буде перенаправлений), може заважати виводу? І явна випадковість, в основному, є результатом позиції у вікні віртуального терміналу? Це насправді може мати сенс.
Берс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.