1 (edytowany przez tinware 2019-12-20 19:07:29)

Temat: Bash - czytanie w pętli w czasie rzeczywistym oraz odczyt zmiennej

Cześć,

Potrzebuje odczytać ramki z mojego urządzenia ze zdalnej maszyny:

#!/usr/bin/bash

while true; do  
  for LINE in $( ( timeout 15 ssh -y root@192.168.0.1 "cat /dev/ttyUSB1" ) 2>/dev/null ); do
    echo "> $LINE" #Sprawa 1
  done
  echo ">> $LINE" #Sprawa 2
done

Sprawa:
1. abym te linie mógł odczytywać w czasie rzeczywistym, a nie dopiero po osiągnięciu timeout, muszę też móc zatrzymywać tą pętlę (brake) przed osiagnieciem timeout
2. po osiągnięciu timeout wewnętrznej pętli zmienne z niej powinny być do odczytania w tej pierwszej pętli


Głowie się już z tym kawałkiem kodu od pewnego czasu i udaje mi się osiągnąć bez problemu albo pierwsze albo drugie, ale ani razu tego czego potrzebuję -> czyli pierwsze oraz drugie.


command | while read LINE; do
  echo "> $LINE" #Sprawa 1
done

echo ">> $LINE" #zmienna pusta

To znowu działa w czasie rzeczywistym, ale zmienne nie są dostępne poza pętlą

2

Odp: Bash - czytanie w pętli w czasie rzeczywistym oraz odczyt zmiennej

Żeby to działało musisz subshella wywołać. Np. tak:

A=""
command | { while read LINE; do
  A=$(echo "$LINE")
  echo "> $LINE" #Sprawa 1
done;

echo ">> $A" #zmienna nie będzie pusta pusta
}
Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

3 (edytowany przez tinware 2019-12-20 19:28:39)

Odp: Bash - czytanie w pętli w czasie rzeczywistym oraz odczyt zmiennej

Znasz jeszcze jakieś pomysły, przypomniałeś mi że coś takiego istnieje, ale pamiętam kiedyś, że po zagnieżdżeniu w sobie kilku pętli był problem z przekazywaniem tych zmiennych pomiędzy pętlami.

4

Odp: Bash - czytanie w pętli w czasie rzeczywistym oraz odczyt zmiennej

Taa, nie rób tego w shellu smile tylko napisz sobie program do tego.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

5 (edytowany przez tinware 2019-12-20 19:33:58)

Odp: Bash - czytanie w pętli w czasie rzeczywistym oraz odczyt zmiennej

Wiem, że Python byłby lepszy, ale zależy mi na Bashu.
W takim rozwiązaniu po wyłączeniu maszyny zdalnej pętla zatrzymuje się hmm
Pomaga tylko timeout, którego ma docelowo nie być

6

Odp: Bash - czytanie w pętli w czasie rzeczywistym oraz odczyt zmiennej

Siłą rzeczy jak nie ma danych wejściowych to pętla nie działa. I potrzebujesz timeouta. Już pisałem żebyś sobie to napisał w czymś innym.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

7 (edytowany przez tinware 2019-12-21 01:48:11)

Odp: Bash - czytanie w pętli w czasie rzeczywistym oraz odczyt zmiennej

while true; do
  timeout 10 command | { \
    while read LINE; do
      echo "> $LINE"
      if [ "$LINE" = "abc" ]; then
        echo "> "$LINE"!"
        break
      fi
    done

    echo ">> $LINE"
    # tutaj skrypt zatrzymuje się aż do momentu osiągnięcia timeout
  }
done

Jak to od razu zatrzymać, aby skrypt zaczął kolejną pętle?

8

Odp: Bash - czytanie w pętli w czasie rzeczywistym oraz odczyt zmiennej

Bo wykonuj to coś w środku pętli a nie poza nią. Miało być w czasie rzeczywistym, na bieżąco, więc czemu to poza wykonujesz?

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

9

Odp: Bash - czytanie w pętli w czasie rzeczywistym oraz odczyt zmiennej

Założenie zrobiłem takie, aby napisać to w Bashu - nie wymaga instalacji cięższego oprogramowania, nie zajmuje wolnego miejsca na flashu. Próbuje ugryźć temat w ten sposób, że czytam w czasie rzeczywistym linia po linii (chodzi o ramki NMEA). Jeśli wystąpi interesująca mnie linia to wszystko ok i czytam sobie dalej. Jeśli linia nie występuje przez 10 sekund, chciałbym zacząć pętle od nowa.

10

Odp: Bash - czytanie w pętli w czasie rzeczywistym oraz odczyt zmiennej

Ehh, w openwrt jest gotowy ugps do tego tego - możesz sobie bardzo łatwo zmienić to do swoich potrzeb.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

11 (edytowany przez tinware 2019-12-21 14:23:44)

Odp: Bash - czytanie w pętli w czasie rzeczywistym oraz odczyt zmiennej

Zgadza się jest, ale co to zmienia? Już go kiedyś instalowałem i po prostu przedstawia on ramki NMEA w bardziej czytelny sposób, a ja nie tego szukam.

Potrzebuje łapać jak najszybciej (co 1 sekundę) pozycję i wrzucać ją do zmiennej w Bashu

12

Odp: Bash - czytanie w pętli w czasie rzeczywistym oraz odczyt zmiennej

Ponieważ to co teraz robisz to wymyślanie koła od nowa. Najbliżej tego co chcesz uzyskać bez używania zewnętrznego timeouta jest użycie chat'a (z opcją timeout), ale to już lekka rzeźba jest.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

13

Odp: Bash - czytanie w pętli w czasie rzeczywistym oraz odczyt zmiennej

Tak wiem że rzeźba, ale zależy mi na lekkości programu. I tak zamierzam zamknąć się w kilkunastu linijkach skryptu.
Chat'a?

14

Odp: Bash - czytanie w pętli w czasie rzeczywistym oraz odczyt zmiennej

chat. Ten który jest wykorzystywany przy połączeniach ppp. Ma timeout, może czekać na określone stringi, ma ABORT w przypadku pojawienia się określonego stringu.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

15 (edytowany przez tinware 2019-12-21 15:16:58)

Odp: Bash - czytanie w pętli w czasie rzeczywistym oraz odczyt zmiennej

Zasadnicze pytanie - czy Chat występuje w innych dystrybucjach Unixowych?
Skrypt muszę móc uruchomić zarówno w OpenWRT oraz np. Debianie...

# chat -h
Usage: chat [-e] [-E] [-v] [-V] [-t timeout] [-r report-file]
     [-T phone-number] [-U phone-number2] {-f chat-file | chat-script}

Jak to widzisz - na razie z lokalnej maszyny OpenWRT z modułem GPS?

chat -t 10 /dev/ttyUSB1

Coś takiego nie drukuje nic na ekran

16

Odp: Bash - czytanie w pętli w czasie rzeczywistym oraz odczyt zmiennej

W każdej jest. Chat nic nie drukuje. Do chata musisz sobie skrypt napisać. Czytaj manual...

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.