LINUX.ORG.RU

Почему эквивалентные цепочки комманд дают разные результаты?

 , , ,


0

0

Вот две цепочки команд:

  1. cat ./*.txt|sort -u|grep test
  2. cat ./*.txt|grep test|sort -u
    в зависимости от объёма приходящих от cat данных могут дать разные результаты.

Почему это происходит?
Я думаю что это баг.

Используемая мной для тестоа конструкция вида cat ./* |конвейер > result_file.txt приводит к тому, что конвейер начинает обрабатывать файлы с собственными результатами, что видимо и стало причиной ошибки.
Хотя раньше,много лет назад когда я наблюдал этот баг я мог делать запросы конвейером и без вывода в файл, но похоже что по крайней мере в текущем Devuan наблюдаемый мной несколько лет назад баг исправлен.

Приношу всем свои извинения за беспокойство.

★★★★★

Ответ на: комментарий от im-0

Что значит не правильно?
Один и тот же конвейер может работать правильно и не правильно в зависимости от объёма поданных на его вход данных.

Или другой вариант, одни и те же данные достаточного для сбоя объёма могут приводить к разным результатам в зависимости от того, в каком месте конвейера выполняется сортировка строк.

То есть конвейеры
cat ./*.txt|sort -u|grep test
и
cat ./*.txt|grep test|sort -u
в зависимости от объёма приходящих от cat данных могут дать разные результаты.

torvn77 ★★★★★ ()
Последнее исправление: torvn77 (всего исправлений: 4)
Ответ на: комментарий от torvn77

в зависимости от объёма приходящих от cat данных могут дать разные результаты.

Давай конкретный пример входных данных, скажи чем конкретно отличается результат в этих случаях, покажи вывод locale. А, и скажи какую точно реализацию grep и sort ты используешь.

im-0 ()
Ответ на: комментарий от im-0

А, и скажи какую точно реализацию grep и sort ты используешь.

Я с этим багом столкнулся несколько лет назад и с тех пор таких объёмных фильтраций и сортировок вроде как не делал, в общем помню только сам факт.

Давай конкретный пример входных данных,

Объём данных точно не помню, но думаю что если в сумме все фай будут 100 мегабайт то этот баг обязательно проявится.

скажи чем конкретно отличается результат в этих случаях,

Просто часть строк, которая по идее должна проходить цепочку будет потеряна, и это не обязательно конец, в чём собственно и состоит коварство бага, если бы я не писал запросы/команды в множестве вариантов, а отдал только один раз то я бы ничего и не заметил.

Если я правильно помню то впервые я столкнулся с этим когда пытался выявить все возможные строки конфигурации постпроцессоров для ArtCAM. В них нет ничего сложного, это просто файлы вида

;
;  LinuxCNC - G-Code XYZ Artcam post processor


FORMAT = [N|@|N|1.0]
LINE_NUM_START     = 0
LINE_NUM_INCREMENT = 10
LINE_NUM_MAXIMUM   = 999999
;
;Стандарт окончания строки в Linux:
;END_OF_LINE = "[10]"
;Стандарт окончания строки в Windows(Default):

FORMAT = [XMAX|@|X|+1.4]
;
; Формат и правила подстановки координаты Y и параметров на её основе.
FORMAT = [Y|@|Y|+1.4]
; Y-координата домашней точки ПРОГРАММЫ.
FORMAT = [YH|@|Y|+1.4]
; Крайние точки рельефа по координате Y
FORMAT = [YMIN|@|Y|+1.4]
FORMAT = [YMAX|@|Y|+1.4]
;
; Формат и правила подстановки координаты Z и параметров на её основе.
FORMAT = [Z|@|Z|+1.4]
; Z-координата домашней точки ПРОГРАММЫ.
FORMAT = [ZH|@|Z|+1.4]
; Безопасная высота по Z
FORMAT = [SZ|@|Z|+1.4]
; Крайние точки рельефа по координате Z
FORMAT = [ZMIN|@|Z|+1.4]
FORMAT = [ZMAX|@|Z|+1.4]
;
; Как я предпологаю,Арткамовская ось вращения R соответствует одной из следующих осей LinuxCNC:U,V,W (ещё есть оси A,B,C) 
; Но какой именно? U что-ли?
; Формат и правила подстановки координаты оси вращения R и параметров на её основе.
FORMAT = [R|@|U|+1.4]
; R-координата домашней точки ПРОГРАММЫ.
FORMAT = [RH|@|U|+1.4]
;
; Coordinated helical motion ("Arc feed")
FORMAT = [I|@|I|+1.4]
FORMAT = [J|@|J|+1.4]
;
; Формат скорости перемещения ((units|mm)/min),автоматически назначаемой Арткамом выбором из переменных 
; [FR],[FC] или [FP] соответствующих текущему инструменту или траекторий.
FORMAT = [F|@|F|1.1]
; Формат скорости быстрого перемещения (units|mm)/min
FORMAT = [FR|@|F|1.1]
; Формат скорости врезания (units|mm)/min
FORMAT = [FP|@|F|1.1]
; Формат скорости подати материала (units|mm)/min
FORMAT = [FC|@|F|1.1]
;
;
; ######## Program moves ########
;
;
; Размер рабочего стола X=700 Y=800 z=100 .
; Место для ручной смены инструмента  X=350 Y=150 z=100 .
; Место парковки портала после окончания исполнения программы  X=350 Y=800 z=100 .
; Максимальная скорость линейного перемещения станка X=Y=Z=8 м/сек.
; Параметры ПК позволяют развивать скорость до X=Y=Z=3,3 м\сек.
;
; Установка скорости БЫСТРОГО перемещения [FR] в максимальное для станка значение.
; В LinuxCNC используется S-образный график ускорения,так что резкого торможения и связанных с ним проскоков координат быть не должно.
RAPID_FEED_RATE        =  3300
;
; Задание команды изменения скорости перемещения.
; Но я поставил эти комманды непосредственно в строки и поэтому этот параметр стал не нужным и закоментирован.
;FEED_RATE_CHANGE      = "[F|#] [S|#] ( FRC )"
;
; Задание команды подъёма по Z .
RETRACT_MOVE           = "[FR] [S|#] G00 [X|#] [Y|#] [Z|#] ( RtM [F] )"
;
; Задание команды опускания по Z.
PLUNGE_RATE_MOVE       = "[FP] [S|#] G01 [X|#] [Y|#] [Z|#] ( PM [F] )"
;
; Задание в сокращённой и полной (FIRST_) форме команды быстрого перемещения.
FIRST_RAPID_RATE_MOVE  = "[F|#] [S|#] G00 [X|#] [Y|#] [Z|#] ( F_RRM )"
RAPID_RATE_MOVE        = "[F|#] [S|#] G00 [X|#] [Y|#] [Z|#]"
; 
; Задание в сокращённой и полной (FIRST_) форме команды линейной резки.
FIRST_FEED_RATE_MOVE   = "[F|#] [S|#] G01 [X|#] [Y|#] [Z|#] (F_FRM)"
FEED_RATE_MOVE         = "[F|#] [S|#] G01 [X|#] [Y|#] [Z|#]"
;
; Задание в сокращённой и полной (FIRST_) форме команды резки по дуге по часовой стрелке.
FIRST_CW_ARC_MOVE      = "[F|#] [S|#] G02 [X] [Y] [I] [J] (F_CW)"
CW_ARC_MOVE            = "[F|#] [S|#] G02 [X] [Y] [I] [J]"
;
; Задание в сокращённой и полной (FIRST_) форме команды резки по дуге против часовой стрелки.
FIRST_CCW_ARC_MOVE     = "[F|#] [S|#] G03 [X] [Y] [I] [J]  (F_CCW)"
CCW_ARC_MOVE           = "[F|#] [S|#] G03 [X] [Y] [I] [J]"
;
;
; ######## END Program moves ########
;
;
START = " "
START = " "
START = " ( Variables status: )"
START = " "
START = " ( S=[S] )"

; Переход в XY "дом" программы и остановка на безопасной высоте.
; Предполагается,что крепления заготовки вы поставили так,что шпиндель во время обработки их не заденет
; и соответсвенно любое перемещение в пределах поверхности [XMIN]-[XMAX] [YMIN]-[YMAX] [SZ] пройдёт без столкновений.
START = "G53 G0 Z100"
START = "G00 [XH] [YH]"
START = "G00 [SZ]"
; Включение основного охлаждения
START = "M8"
; Включение доплнительного охлаждения
;START = "M7"END Set up program header ########)"
START = " "
START = " "
;
;
;
TOOLCHANGE = " "
TOOLCHANGE = " "
TOOLCHANGE = " (########  Toolchange ########)"
TOOLCHANGE = " "
TOOLCHANGE = " "
TOOLCHANGE = "G40"
TOOLCHANGE = "G49"
; Переход в положение для ручной смены инструмента на максимальной высоте Z МАШИНЫ,чтобы чего не испортить.
TOOLCHANGE = "[FR]"
TOOLCHANGE = "G53 G0 100"
TOOLCHANGE = "G53 G0 X350 Y150"
; Смена инструмента
TOOLCHANGE = "T[T] M06"
; Переход в область измерения параметров компенсаций инструмента на максимальной высоте Z МАШИНЫ,чтобы чего не испортить.
TOOLCHANGE = "[FR]"
TOOLCHANGE = "G53 G0 100"
TOOLCHANGE = "G00 [XH] [YH]"
; Задание настроек инструмента,коррекция на длинну и диаметр.
; Пока просто отключаем до понимания того,как это делать.
TOOLCHANGE = "G40"
TOOLCHANGE = "G49"
; Переход в XY "дом" программы и остановка на безопасной высоте SZ.
; Предполагается,что крепления заготовки вы поставили так,что шпиндель во время обработки их не заденет
; и соответсвенно любое перемещение в пределах поверхности [XMIN]-[XMAX] [YMIN]-[YMAX] [SZ] пройдёт без столкновений.
TOOLCHANGE = "[FR]"
TOOLCHANGE = "G53 G0 100"
TOOLCHANGE = "G00 [XH] [YH]"
TOOLCHANGE = "G00 [SZ]"
; Включение основного охлаждения
TOOLCHANGE = "M8"
; Включение доплнительного охлаждения
;TOOLCHANGE = "M7"
; Включение  шпинделя,установка подачи на подачу врезания(предосторожность) и установка частоты вращения шпинделя
TOOLCHANGE = "M03 [S] [FP]"
; Пауза на 10 сек.,чтобы шпиндель успел разогнаться
TOOLCHANGE = "G04P10"
;
TOOLCHANGE = " "
TOOLCHANGE = " "
TOOLCHANGE = " (######## END  Toolchange ########)"
TOOLCHANGE = " "
TOOLCHANGE = " "
;
;
;
END = " "
END = " "
END = " (######## End of file ########)"


Задача была собрать все возможные начала строк для чего делались фильтры типа
’cat *.con | grep ’ = ‘| sort -u’
Различной изощерённости.
(Постпроцессор был сокращён так как не влезал в пост, таких постпроцессоров у арткама было весьма много)

torvn77 ★★★★★ ()
Последнее исправление: torvn77 (всего исправлений: 1)
Ответ на: комментарий от im-0

Поражаюсь тупости программистов, неужели ту думаешь что этот баг не коснётся лично тебя?

Возми образец из спойлера, сохрани в файл и растиражировав более чем на сто мегабайт проверь сам.

torvn77 ★★★★★ ()
Ответ на: комментарий от torvn77

Затем, что эти языки гораздо лучше предназначены для подобного. А башепортянки из смеси утилит, которые через пару лет просто перестанут работать, потому что поменялось дефолтное поведение одной из утилит в пайпе, вообще никак не предназначены.

gremlin_the_red ★★★ ()
Ответ на: комментарий от torvn77

Поражаюсь тупости программистов, неужели ту думаешь что этот баг не коснётся лично тебя?

Давай ты сначала прочитаешь моё сообщение ещё раз. ВНИМАТЕЛЬНО! И ответишь на все вопросы, которые я задал. Это не так сложно. А потом мы поговорим о моей тупости. Ну и тупости всех программистов, конечно же. Ведь все программисты - тупые, это все знают!

im-0 ()
Ответ на: комментарий от torvn77

Ну а если серьёзно, то поведение и grep и sort зависит от реализации (их много!), от переданных им опций, от системной локали. Дополнительно, сортировка бывает стабильной и не стабильной.

Пока ты не скажешь что ты делал, с чем, и какой получил результат, я не смогу даже приблизительно понять что конкретно пошло не так. Да, может это и был баг. Но скорее всего нет. Правду мы уже не узнаем.

im-0 ()
Последнее исправление: im-0 (всего исправлений: 1)
Ответ на: комментарий от im-0

Я сейчас у себя проверил, sort судя по всему починили, по этому приношу свли извинения, я не ожидал что починят, а вот всё ещё uniq глючит, хотя я тогда им не пользовался.

torvn77 ★★★★★ ()
Последнее исправление: torvn77 (всего исправлений: 1)
Ответ на: комментарий от im-0

Сейчас у меня так:

$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

Как локаль настроена была тогда сказать не возможно, скорее всего дефолт Debian Jessy с вторым языком в качестве русского.
В качестве материала выступали постпроцессоры с расширением *.con от арткама 2010 и возможно какого-то более раннего. Для тестов можешь сделать так, вот тут взять образец ну или надо искать арткам чтобы взять постпроцессоры от него.

torvn77 ★★★★★ ()
Ответ на: комментарий от im-0

У меня точно был Coreutils

Но в целом после перезагрузки баг не повторился, и скорее всего мой конвеер обрабатывал файл со своим выводом, так что получается что баг воспроизвести не удалось.

torvn77 ★★★★★ ()
Последнее исправление: torvn77 (всего исправлений: 1)