staging.inyokaproject.org

Shell/Bash Skript - wie Programm nach weitergeleitetem Output ans Clipboard beenden?

Status: Gelöst | Ubuntu-Version: Ubuntu 20.04 (Focal Fossa)
Antworten |

Gudea-M

Anmeldungsdatum:
24. Juli 2016

Beiträge: Zähle...

Disclaimer: Ich bin (noch) ein Shell-Script-Noobie.

Vorhaben: Ein Skript, dass den Webcam-Stream scannt, aus dem Stream QR-Codes dekodiert, die Ausgabe in den Zwischenspeicher weiterleitet, und nach erstem "erkannten" QR-Code Scann das Skript beendet.

Meine Idee/Umsetzung: Ich scanne mittels "zbarcam" den Videostream der Webcam und pipe den Output sowohl in eine Textdatei, als auch in die Zwischenablage. Also so:

1
2
3
#!/bin/bash
FILE=~/.zbarcam-temp.txt
zbarcam --raw /dev/video0 | tee $FILE | xclip -in -selection clipboard

Um das Skript zu schließen will ich in einer until-Schleife via "test" überprüfen, ob die erstellte Textdatei leer ist. Sofern dies der Fall ist, soll weiter gescannt werden. Sobald dies nicht mehr der Fall ist, soll diese Textdatei geleert werden und daraufhin "zbarcam" beendet werden. Mein Versuch:

1
2
3
4
5
6
7
8
#!/bin/bash
FILE=~/.zbarcam-temp.txt
until test -s $FILE;
do
zbarcam --raw /dev/video0 | tee $FILE | xclip -in -selection clipboard
done
> $FILE;
killall zbarcam

Problem: Ich muss "zbarcam" nach wie vor von Hand schließen. Erst dann werden die nachfolgenden Befehle ausgeführt. (Ich scheine die Handhabung von until-Schleifen nicht richtig zu verstehen.) Wo liegt mein Denkfehler? Was mache ich falsch? Hilfe, Verbesserungen und Anregungen sind sehr willkommen.

Bearbeitet von rklm:

Syntaxhighlighting. Bitte beachte Forum/Syntax!

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 10978

Naja du hast nichts, was die Ausführung von zbarcam rechtzeitig abbricht - so eine Schleife sollte es tun:

1
2
3
4
5
#!/bin/bash
while read -r code
    xclip -in -selection clipboard <<< "$code"
    break
done < <(zbarcam --raw /dev/video0)

Gudea-M

(Themenstarter)

Anmeldungsdatum:
24. Juli 2016

Beiträge: Zähle...

Vielen lieben Dank für die schnelle Lösung,

ich habe in Zeile 3 noch ein "do" ergänzt. Jetzt funktioniert das Skript so, wie es soll:

1
2
3
4
5
6
#!/bin/bash
while read -r code
    do
    xclip -in -selection clipboard <<< "$code"
    break
done < <(zbarcam --raw /dev/video0)

Und mit dem neuen Skript habe ich wieder etwas zum Nachlesen und Lernen ("<<<", "< <").

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 10978

Gudea-M schrieb:

ich habe in Zeile 3 noch ein "do" ergänzt.

Ups, das kommt davon, wenn man Dinge über mehrere Systeme hinweg macht...

Und mit dem neuen Skript habe ich wieder etwas zum Nachlesen und Lernen ("<<<", "< <").

  • <<< $VARIABLE ist ein Herestring, mit dem man einen Variablenwert auf stdin eines Befehls umleiten kann.

  • <(BEFEHL) ist eine Process Subsitution, die die Ausgabe des Befehls durch das vorangestellte < auf den stdin der while-Schleife und damit das read umleitet.

Antworten |