Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2020-09-09 12:34:38

  sblam - Użytkownik

sblam
Użytkownik
Zarejestrowany: 2020-09-09

[bash] Odczytywanie wyniku programu

Cześć.

Proszę się ze mnie nie śmiać ale jestem początkującym jeśli chodzi o pisanie skryptów. Na razie stworzyłem sobie taką prostą pętelkę:

Kod:

while IFS= read -r line;
do
    timeout 10 wine program.exe $line parametry "" | ?????????
     #Zabicie procesu lub zapisanie wyniku do wynik.txt
done < plik.txt

Chciałbym, żeby jak w tym co zwróci program.exe pojawi się string, np. "MainWindow::start" wrzucić do wynik.txt linijki "Dla $line udało się wyświetlić okienko" lub gdy w wyniku pojawi się "Fatal error" wykonać komendę killall program.exe. Nie wiem tylko, co umieścić w miejsce znaków zapytania

Ostatnio edytowany przez sblam (2020-09-09 12:45:10)

Offline

 

#2  2020-09-09 14:01:30

  megabajt - Użytkownik

megabajt
Użytkownik
Skąd: Wrocław
Zarejestrowany: 2012-03-07

Re: [bash] Odczytywanie wyniku programu

Kod:

#!/bin/bash

while IFS= read -r line; do
        wynik=$(timeout 10 wine program.exe "$line" parametry "")
        if [[ "$wynik" =~ "MainWindow::start" ]]; then
                echo "Dla $line udało się wyświetlić okienko" | tee -a wynik.txt
        elif [[ "$wynik" =~ "Fatal error" ]]; then
                killall program.exe
        fi
done < plik.txt

Ostatnio edytowany przez megabajt (2020-09-09 14:01:52)

Offline

 

#3  2020-09-09 15:33:38

  sblam - Użytkownik

sblam
Użytkownik
Zarejestrowany: 2020-09-09

Re: [bash] Odczytywanie wyniku programu

Dzięki ale to nie do końca to co miało być. Co prawda zapisuje informację, które okienko udało się wygenerować ale zmienna $wynik zapełnia się dopiero po przekroczeniu timeoutu tzn po wykonaniu programu więc killall mija się z celem. Potrzebowałbym czegoś, co odczytuje $wynik linijka po linijce.

Offline

 

#4  2020-09-09 21:23:39

  megabajt - Użytkownik

megabajt
Użytkownik
Skąd: Wrocław
Zarejestrowany: 2012-03-07

Re: [bash] Odczytywanie wyniku programu

Kod:

#!/bin/bash

while IFS= read -r line; do
        wynik=$(timeout 10 wine program.exe "$line" parametry "" | grep -q -m 1 "Fatal error" && killall program.exe )
        if [[ "$wynik" =~ "MainWindow::start" ]]; then
                echo "Dla $line udało się wyświetlić okienko" | tee -a wynik.txt
        fi
done < plik.txt

Offline

 

#5  2020-09-10 09:26:15

  sblam - Użytkownik

sblam
Użytkownik
Zarejestrowany: 2020-09-09

Re: [bash] Odczytywanie wyniku programu

Niestety tutaj też czeka do końca timeouta a chodzi mi, żeby zabiło program jak tylko usłyszy "Fatal error" (zdarza się to już zwykle po 2-3 sekundach)

Offline

 

#6  2020-09-10 12:22:32

  megabajt - Użytkownik

megabajt
Użytkownik
Skąd: Wrocław
Zarejestrowany: 2012-03-07

Re: [bash] Odczytywanie wyniku programu

https://stackoverflow.com/questions/26777283/make-g … finds-a-match

Kod:

#!/bin/bash

while IFS= read -r line; do
        wynik=$(coproc timeout 10 wine program.exe "$line" parametry ""; grep -q -m 1 "Fatal error" <&${COPROC[0]}; [[ $COPROC_PID ]] && killall program.exe)
        if [[ "$wynik" =~ "MainWindow::start" ]]; then
                echo "Dla $line udało się wyświetlić okienko" | tee -a wynik.txt
        fi
done < plik.txt

Ale dziwadło :D

Offline

 

#7  2020-09-10 19:54:06

  sblam - Użytkownik

sblam
Użytkownik
Zarejestrowany: 2020-09-09

Re: [bash] Odczytywanie wyniku programu

Teraz wyłapuje "Fatal error" i zabija po 2-ch sekundach ale nie reaguje na "MainWindow::start" co jest dla mnie zdecydowanie ważniejsze.

Offline

 

#8  2020-09-10 20:41:51

  megabajt - Użytkownik

megabajt
Użytkownik
Skąd: Wrocław
Zarejestrowany: 2012-03-07

Re: [bash] Odczytywanie wyniku programu

To może zacznijmy od nowa :-)

Kod:

#!/bin/bash
while IFS= read -r line; do
        while read -r output; do
                if [[ "$output" =~ "MainWindow::start" ]]; then
                        echo "Dla $line udało się wyświetlić okienko" | tee -a wynik.txt
                elif [[ "$output" =~ "Fatal error" ]]; then
                        killall program.exe
                fi
        done < <( timeout 10 wine program.exe "$line" parametry "" )
done < plik.txt

Offline

 

#9  2020-09-11 09:54:10

  sblam - Użytkownik

sblam
Użytkownik
Zarejestrowany: 2020-09-09

Re: [bash] Odczytywanie wyniku programu

No i teraz działa jak trzeba :) Wielkie dzięki!

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)