ubuntuusers.de

Yad geöffnet lassen und Command ausführen

Status: Gelöst | Ubuntu-Version: Xubuntu 22.04 (Jammy Jellyfish)
Antworten |

Fried-rich

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

Hallo,

ich habe mir hier etwas zusammengebastelt. Ich frage mit Yad ein paar Angaben ab, die dann in einen Programmaufruf übernommen werden.

yad=$(yad --form --field="Auswahl einer Zahl:NUM" --field="Auswahl einer Zahl:NUM")

Ein Klick auf OK gibt z. B. das aus:

0|0|

Das verarbeite ich weiter mit

var1=$(echo $yad | cut -d "|" -f 1)
var2=$(echo $yad | cut -d "|" -f 2)

und packe es in den Programmaufruf

program $var1 $var2

Der Aufruf wird gestartet nachdem ich im Yad-Fenster OK gedrückt habe und das Fenster geschlossen ist. Ich würde das gerne so ändern, dass Yad geöffnet bleibt bis man den Beenden-Button drückt. Und falls das geht eine kleine Erweiterung: Nachdem man das Kommando ausgeführt hat soll der Wert in einem der beiden Felder geändert werden (z. B. plus 1). Das geht problemlos wenn das Fenster zwischenzeitlich geschlossen wird.

juribel

Anmeldungsdatum:
20. April 2014

Beiträge: 1269

Lies mal hier: http://smokey01.com/yad/

Vielleicht ist da ja was für dich dabei. Einfach nach "--button" suchen.

TNTMaster

Anmeldungsdatum:
30. Juli 2009

Beiträge: 879

Hi

Probier das mal, in Z. 9/10 werden beide Werte um je 1 erhöht, evtl. anpassen. Bei Klick auf Ausgabe wird die Funktion "starten" aufgerufen mit den eingestellten Werten, %1 und %2 sind Platzhalter für die Werte, die an die Funktion übergeben werden.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/bash

starten(){
    local var1 var2
    exec 3<> $pipe
    var1=$1
    var2=$2
    # Werte erhöhen
    var1=$((var1 + 1))
    var2=$((var2 + 1))
    # Werte an yad senden
    echo -e "\f\n$var1\n$var2\n$btn1" >&3
    # Programmstart
    program $var1 $var2
}
export -f starten
export pipe btn1

pipe=$(mktemp -u)
mkfifo $pipe
exec 3<> $pipe

# Startwerte
var1=0
var2=0
btn1="bash -c 'starten %1 %2'"

# Werte an yad senden
echo -e "\f\n$var1\n$var2\n$btn1" >&3

yad --form --cycle-read \
    --field="Auswahl einer Zahl:NUM" \
    --field="Auswahl einer Zahl:NUM" \
    --field="Ausgabe!gtk-ok:FBTN" \
    --button="Schließen!gtk-quit:0" <&3
rm $pipe

Fried-rich

(Themenstarter)

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

Was ich glaube hier zu verstehen:

starten(){
    local var1 var2
    exec 3<> $pipe
    var1=$1
    var2=$2
    # Werte erhöhen
    var1=$((var1 + 1))
    var2=$((var2 + 1))
    # Werte an yad senden
    echo -e "\f\n$var1\n$var2\n$btn1" >&3
    # Programmstart
    program $var1 $var2
}

Es wird eine Funktion angelegt. Was genau 'local' macht verstehe ich nicht. var1 und var2 legt einfach 2 Variablen an, die dann mit den Werten gefüllt werden die später durch Yad übergeben werden. Dann werden die beiden Variablen um 1 erhöht. Wie "sendet" der Befehl

echo -e "\f\n$var1\n$var2\n$btn1" >&3

die Werte an Yad?

Obwohl alles geht verstehe ich nicht wieso. Wenn ich das Script durchgehe

  • erst wird var1/2 angelegt, dann um 1 erhöht und dann an Yad übergeben: Demnach müssten die um 1 erhöhten Werte an Yad übergeben werden; Erklärung: beim ersten Start des Scriptes haben var1/2 keine Werte und die ganze Funktion läuft auf Fehler, daher werden die Standardwerte in Yad übernommen

  • drücke ich einmal in Yad auf den Button wird die Funktion ausgeführt, jetzt haben var1/2 Werte (von Yad) und die Funktion läuft durch; alles was nach der Funktion kommt wird nicht mehr ausgeführt (sonst müsste Yad IMMER mit 2x 0 starten)

export -f starten

Sorgt dafür, dass die Funktion wie ein Programm durch die Eingabe von "starten" ausgeführt werden kann (solange das Script läuft?)?

export pipe btn1

pipe=$(mktemp -u)
mkfifo $pipe
exec 3<> $pipe
...
btn1="bash -c 'starten %1 %2'"
...
echo -e "\f\n$var1\n$var2\n$btn1" >&3

yad --form --cycle-read \
    --field="Auswahl einer Zahl:NUM" \
    --field="Auswahl einer Zahl:NUM" \
    --field="Ausgabe!gtk-ok:FBTN" \
    --button="Schließen!gtk-quit:0" <&3
rm $pipe

Hier ist mir nicht klar was welche Zeile macht.

TNTMaster

Anmeldungsdatum:
30. Juli 2009

Beiträge: 879

Ich geh erstmal durch, was ausserhalb der Funktion passiert:

  • Mit export werden die angebenen Variablen in der Funktion verfügbar. Wird export mit -f verwendet sind Funktionen gemeint und können innerhalb des Skripts wie ein Befehl ausgeführt werden. Ist nötig, da yad diese sonst ignoriert.

  • mktemp liefert einen zufälligen Dateinamen in /tmp, -u verhindert das Anlegen der Datei

  • mkfifo erstellt die temp. Datei (named Pipe), die zum Austausch der Daten zwischen yad und der Funktion dient

  • exec verbindet die temp. Datei mit Dateideskriptor 3

  • btn1=... Der String wird von yad ausgeführt, wenn Ausgabe geklickt wird. %1 und %2 werden von yad mit den Werten der (NUM)Felder 1 und 2 ersetzt

  • echo ... sendet die Daten nicht direkt an yad, sondern schreibt die Daten in Dateideskriptor 3 (>&3, temp. Datei) und puffert diese bis sie von yad ausgelesen werden. yad wird mit --cycle-read angewiesen, die Werte von stdin zu lesen und Dateideskriptor 3 wird als Eingabe benutzt (<&3)

Wie das mit der Pipe und den Dateidesktriptoren im Detail funktioniert, weiß ich nicht, müßte ein Experte was dazu sagen.

Innerhalb der Funktion (die NUR bei Klick auf "Ausgabe" aufgerufen wird):

  • local ... die Belegung der Variable gilt nur innerhalb der Funktion, d.h. die Variable ist bei Funktionsstart leer, auch wenn sie ausserhalb der Funktion gesetzt ist und Änderungen wirken sich nicht auf eine globale Variable des selben Namens aus. local ist im Skript eigentlich nicht nötig, da die globalen Variablen var1 und var2 nur beim Start 1x belegt und aufgerufen werden, dannach werden sie nicht mehr gebraucht. Alternativ könnte man innerhalb der Funktion auch andere Variablennamen wählen

  • erst wird var1/2 angelegt, dann um 1 erhöht und dann an Yad übergeben: Demnach müssten die um 1 erhöhten Werte an Yad übergeben werden;

Soweit richtig

  • Erklärung: beim ersten Start des Scriptes haben var1/2 keine Werte und die ganze Funktion läuft auf Fehler, daher werden die Standardwerte in Yad übernommen

Nein da gibts keine Fehler, beim Start werden var1/2 mit 0 belegt und an yad verfüttert(echo .... >&3), die Funktion wird das erste Mal bei Klick auf Ausgabe aufgerufen, das Zeug ausserhalb der Funktion wird genau 1x beim Skriptstart durchlaufen, dannach nicht mehr.

Einen Fehler hab ich im Skript: der Programmaufruf muß nach Zeile 8(vor # Werte erhöhen), sonst wird das Programm mit den bereits erhöhten Werten aufgerufen. Und ein & ans Zeilenende, damit das Skript nicht vom Programm blockiert wird.

Fried-rich

(Themenstarter)

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

OK, Danke erstmal für die Erklärung, soweit komme ich erstmal klar damit.

Antworten |