Shell Befehle gleichzeitig ausführen und dabei Zwischenschritt machen?
Hey,
Ich hab folgendes Problem: ich möchte in Shell zwei Befehle nebeneinander laufen lassen (xpinguin). Dazu nutze ich den logischen Operator |
Es sollte hinzugefügt werden, dass der Befehl xpinguin gleichzeitig ausgeführt werden soll und muss, damit ich mehrere Tux Maskottchen gleichzeitig auf dem Desktop habe (Es geht nicht anders. Lässt man sie in einer Schleife hintereinander ablaufen muss man immer warten bis der letzte Tux zerstört wurde bis der neue erscheint, d.h. man hat maximal 1 Tux auf dem Desktop, der kommt dann aber 10 Mal zurück.
Nun möchte ich mehrere Befehle gleichzeitig ausführen, allerdings soll beim zweiten gleichzeitig ausgeführten Befehl bei einer Variable Werte dazu addiert werden. Mein bisheriger Quellcode (vereinfacht) sah so aus:
#!bin/bash
x=0
function pinguin () {
xpinguin -geometry +$x+0
let x=$x+200
}
pinguin | pinguin
Beide Tux Pinguine werden jetzt aber auf die gleiche Stelle gesetzt. Der eine sollte aber 200 Pixel nach links verschoben sein. Ich kann verstehen, dass es nicht funktioniert, weil das Programm die beiden Programme gleichzeitg durchlaufen lässt und bei xpinguin stecken bleibt und darauf wartet bis es schließt.
Hat jemand Lösungsideen?
Vielen Dank fürs Lesen des Textes
Xydru
4 Antworten
Warum benutzt Du nicht Modulo-Rechnung um links und rechts zu unterscheiden?
Einfach Zähler hochzählen.
i%2 == 0 geht nach links
i%2 == 1 geht nach rechts
...
Und wenn Du noch mehr Alternativen brauchst, dann eben mod x.
if [ $(($count%2)) == 0 ]; then
So stelle ich mir das vor.
Du kannst auch einfach counter * 200 nach rechts oder links rücken. Dann zählst Du halt counter von 0-1 oder von 0-x ...wie immer Du willst.
Gruß
Noch ist | eine Pipe.
command& schickt das Kommando in den Hintergrund (Lies mal die Anleitungssektion zu: Job Control)
wofür benötigst du da eine Funktion?
schreibe die Befehle doch einfach untereinander. Dafür musst du nicht mal die Kopfzeile #!/bin/bash verwenden.
xpinguin -geometry +0+0 &
xpinguin -geometry +200+0 &
mache die Datei, in der die beiden Zeilen stehen ausführbar
chmod +x <Dateiname>
und starte sie
./<Dateiname>
die Befehle xpinguin sollen doch in einer Datei stehen und in der kannst du doch auch Rechenoperationen ausführen.
Datei:
let x=0
let y=0
xpinguin -geometry +$x+$y &
let x=$x+300
xpinguin -geometry +$x+$y &
# ende
Mit & kannst du ein Programm im Hintergrund ausführen, z.B. in deinem Script:
#!bin/bash
x=0
function pinguin () {
xpinguin -geometry +$x+0 & # xpinguin im Hintergrund ausführen
let x=$x+200
}
pinguin # einmal tux
pinguin # und noch einmal tux
Absolut richtig. Die | gibt die Ausgabe des ersten Programmes an das 2. Programm weiter, das willst du in dem Fall nicht.
xeyes -geometry -0-0 &
am Ende noch ergänzen :)
Mein Ziel ist ja die automatisch an verschiedenen errechneten Stellen einzusetzen und nicht selbst eintippen