LINUX.ORG.RU

сравнить вывод из программы и файл

 ,


0

1

нужно проверить совпадает ли вывод из моей программы и определенный файл(который поступает ей сначала на вход)

#!/bin/bash

for file in *example*  
do
        set OUT = $(./my_bin  < $file) #<---тут присваиваем переменной вывод из моей программы
        set DIFF = $(diff $OUT $file)
        if [[ $DIFF -eq 0 ]]
        then
                echo "successfull"
        else
                echo "error"
        fi
done

bash -x выдает что

+ set OUT = /*какой-то вывод*/
+ set DIFF = diff file1.txt
+ [[ '' -eq 0 ]]
и у меня все время successfull выводится. т.е. diff как то странно возвращает значение, по идее, должен возвращать 0 если файлы идентичны

★★

Последнее исправление: xperious (всего исправлений: 4)

А почему бы не перенаправить вывод команды во временный файл, а потом сделать diff?

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

так без set не работает же

$ A="Cool"
$ echo "$A"
Cool


Пробелы убери до и после равно.

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

ну как то без лишних файлов хотелось...

Смотря какого объема будет вывод.

diff $OUT $file
if [[ $DIFF -eq 0 ]]

Тут совсем всё плохо.
Запусти diff, место переменных подставь их значения, посмотри что diff выдаст. Надеюсь, натолкнет на мысль.

P. S. Да, я вредный, и буду учить вместо того, чтобы просто написать работающий скрипт.

Kroz ★★★★★
()

Ну и вдогонку к вышесказанному, ваше diff=$(diff ..) будет содержать не 0, а либо пустое либо текст разницы. Если вам текст не нужен, то просто выводите результат в /dev/null, а в качестве результата используёте $? . Да и возможно вам лучше подойдёт cmp, а не diff.

UPD: ах, да, выше уже тоже успели написать.

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

да вот пытался так тоже:

#!/bin/bash

for file in *sdp*  
do
        OUT=$(./my_bin < $file)
        DIFF=$(diff $OUT $file > /dev/null 2>&1)
        if [[ $? -eq 0 ]]
        then
                echo "successfull parse in file: $file"
        else
                echo "error parse in file: $file"
        fi
done

diff все время выводит 2...

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

Вы не то пытаетесь, вчитывайтесь что вам два человека написали то.

$ echo 1 > 1.txt
$ echo 1 > 2.txt
$ diff 1.txt 2.txt
$ echo $?
0
$ echo 2 > 2.txt
$ diff 1.txt 2.txt
1c1
< 1
---
> 2
$ echo $?
1

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

хм, да у меня другая проблема оказывается: почему абсолютно идентичные файлы diff показывает что они полностью разные?

#!/bin/bash

touch .temp

for file in *file*  
do
        OUT=$(./my_bin < $file)
        echo "$OUT" > .temp
        (diff .temp $file > /dev/null)
        if [[ $? -eq 0 ]]
        then
                echo "successfull parse in file: $file"
        else
                echo "error parse in file: $file"
        fi
done

rm .temp

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

Выкиньте скобки, юзайте cmp -s и > /dev/null тоже не будет нужен

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

Если именно bash, то проще так.

$ date >file
$ diff file <(date)
1c1
< Вт. дек. 19 16:10:39 MSK 2017
---
> Вт. дек. 19 16:10:44 MSK 2017

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

Это не то же самое. Это очень странный способ записи

Этот странный способ записи предназначен для того же самого, что и башизм <(cmd): получить ввод из пайпа, но в текущем процессе.

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

Этот странный способ записи предназначен для того же самого, что и башизм <(cmd): получить ввод из пайпа, но в текущем процессе.

Да-да, запишите следующее вашим способом.

$ diff <(TZ=UTC date) <(date)

unterwulf
()
Ответ на: комментарий от xperious

абсолютно идентичные файлы diff показывает что они полностью разные?

Прозреваю, что у тебя разные переводы строк. dos2unix в помощь.

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

запишите следующее вашим способом

Во-первых, это не та же конструкция. Во-вторых, вы сами то знаете что происходит при этом? На самом деле происходит следующее: diff /dev/fd/62 /dev/fd/63 . Ну так это тоже можно извратиться:

mkfifo fifo4 fifo5
TZ=UTC date > fifo4 & date > fifo5 & diff fifo4 fifo5
rm fido4 fifo5

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

Вот это-то и нужно топикстартеру, а не тот ужас в оп-посте.

На самом деле скорее всего не это. Возможно, что если файлы не идентичны, то в следующем цикле надо брать новый. Потому нефиг извращаться, а таки нормально программировать :)

vodz ★★★★★
()
for file in *example*; do
   ./my_bin <"$file" | diff -q "$file" - && echo "[ ok ] $file" || echo "[fail] $file"
done
E ★★★
()
Последнее исправление: E (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.