While-Schleife -> Pipe [gelöst]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

While-Schleife -> Pipe [gelöst]

Beitrag von heinz » 08.02.2011 18:38:53

Hallo Zusammen,

ich habe eine while-schleife die von 100 auf 0 zählen soll. (Es soll gewartet werden,
ob ein gestartetes Programm auch wirklich startet.)
Sobald ich die Ausgabe aber an dialog pipe werden die Variablen innerhalb der while-schleife
anscheinend neu definiert. (Subshell)
Das Ergebnis ist, das es zwar funktioniert aber der Inhalt der Variablen nach der while-schleife
wieder ihren Start-Wert haben.

Im Moment schreibe ich den Wert der benötigten Variablen innerhalb der Schleife in eine Datei auf
Platte aber das ist irgendwie nicht so toll.
Hat jemand eine Idee wie das mit variablen zu lösen ist?

Code: Alles auswählen

	#!/bin/bash

	timer=100
	midi='aconnect'
	while test -z "$($midi -o|grep -e 'test')" -a $timer -gt 0
	do
		sleep .1
		let timer-=2
		echo $((100-$timer))
	done|dialog --gauge "Warte auf Start von\nprogramm..." 7 60
Ich hoffe, Ihr versteht was ich meine... :|
gruß heinz
Zuletzt geändert von heinz am 10.02.2011 23:49:44, insgesamt 4-mal geändert.

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: While-Schleife -> Pipe

Beitrag von detix » 08.02.2011 20:18:43

Schwer nachvollziehbar, aber probiers mal mit Klammern um die "while" Schleife:

Code: Alles auswählen

timer=100
(while test -z "$($midi -o|grep -e $2)" -a $timer -gt 0
  do
    sleep .1
    let timer-=2
    echo $((100-$timer))
  done) | dialog --gauge "Warte auf Start von\n$2..." 7 60
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: While-Schleife -> Pipe

Beitrag von heinz » 09.02.2011 16:51:36

detix hat geschrieben:Schwer nachvollziehbar, aber probiers mal mit Klammern um die "while" Schleife:
Geht leider auch nicht. Trotzdem Danke.

Hab auch festgestellt das mein Beispiel-code allein nicht lauffähig war und habs geändert.

Vlt. hat ja noch jemand ne Idee.

gruß heinz

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: While-Schleife -> Pipe

Beitrag von newdeb » 10.02.2011 13:44:13

Statt Piping mit Prozess Substitution arbeiten (siehe http://tldp.org/LDP/abs/html/process-sub.html):

Code: Alles auswählen

while ...
...
done > >(dialog --gauge "Warte auf Start von\nprogramm..." 7 60) 
Hatte allerdings bei mir den Effekt, das das Terminal danach kaputt war. :(
Ging zwar nach 'stty sane' wieder, ist aber keine saubere Lösung.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: While-Schleife -> Pipe

Beitrag von rendegast » 10.02.2011 14:25:56

Wie ist denn die Ausgabe ohne 'dialog'?
Was wird bei 'aconnect -o' erwartet?

Eigentlich läuft der code.
(Ersetze zBsp. '-z "$($midi -o|grep -e $2)"' durch '$timer -gt 33')

Wegen 'let' muß es eine komplexere Shell als dash sein.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: While-Schleife -> Pipe

Beitrag von heinz » 10.02.2011 23:28:52

Erstmal Danke an alle für die Antworten!
newdeb hat geschrieben:Statt Piping mit Prozess Substitution arbeiten
Klasse Tipp, kannte ich noch nicht.
newdeb hat geschrieben:Hatte allerdings bei mir den Effekt, das das Terminal danach kaputt war. :(
Funktioniert :THX:
Und mit einem Befehl mehr (stty sane) kann ich wohl leben. :D

rendegast hat geschrieben:Wie ist denn die Ausgabe ohne 'dialog'?
Die Ausgabe ist mit und ohne korrekt.
Es geht eigentlich darum das die Variable timer nach Durchlauf der while-schleife den
Wert 0 haben sollte. Was ohne dialog auch so ist.
rendegast hat geschrieben:Was wird bei 'aconnect -o' erwartet?
Es wird ein soundfont-player gestartet (fluidsynth) und mit aconnect "schaue ich nach" ob
die Midi-Schnittstelle von fluidsynth da ist und er somit erfolgreich gestartet ist.
rendegast hat geschrieben:Eigentlich läuft der code.
Ja, laufen tut der Code. Es geht mir wie oben geschrieben um die Variable >timer< und
deren inhalt nach der Schleife.
rendegast hat geschrieben:Wegen 'let'
Sorry, hab ich vergessen. :oops: Ist bash


Ist gelöst!
Werd die Lösung von newdeb nehmen.


gruß heinz

Antworten