Ich bastel gerade an einem ziemlich umständlichen Script für eine sehr einfache Sache und verzweifele langsam.^^
Hier die Testversion des knackigsten Teilprozesses:
#!/bin/sh

echo "" > /home/deviant/.conkyscripts/top            [um top zu leeren]
AN=0                                     [testweise, um die Ausgabe zu testen]
top -b > /home/deviant/.conkyscripts/top &
AN="`grep -i -m 1 opera /home/deviant/.conkyscripts/top`" &
echo $AN &                                            [um die Ausgabe zu testen]
So siehts aus, Zweck ist der, die Prozesse nach einem speziellen Programm (hier: opera) zu scannen, um diese Information dann für eine if-Schleife zu verbraten; jedoch wird der Wert einfach nicht in die Variable geschrieben, so das stets "0" ausgegeben wird.

Der Hintergrund ist der Folgende: Ich will Oblivion über ein Script starten, dass zuvor das touchpad (und conky) abschaltet, und nach dem Beenden wieder anschaltet. Da ich Oblivion aber über OBSE starte, werden beide in einer einfachen Reihenschaltung bereits wieder angeschaltet, wenn OBSE beendet ist (also kurz vor dem Start von Oblivion), statt nach dessen Beendigung. Ich halte es für das naheliegendste/einfachste (abgesehen davon, einen Nebenprozess mitzugeben [was ich nicht will - ich will ja ein bisschen Programmieren lernen^^]), für
if AN = leer
sleep 60s
fülle AN auf, siehe oben

else
starte conky und touchpad

auszuführen. Alternativ könnte ich natürlich auch die PID für oblivion.exe auslesen, aber da dürfte ja derselbe Fehler auftreten und es dürfte nicht simpler sein.


Ich bin also erstmal darauf angewiesen, dass mir jemand verrät, was ich verbockt habe, bzw., dass es einen sehr viel einfacheren Weg gibt^^
Irgendwie sieht das furchtbar umständlich aus was du da machst. Wieso speicherst du denn die ausgabe von top, was ja eigentlich als interaktives programm gedacht ist in einer Datei?
Du könntest das einfacher mit wait und pgrep machen, 'pgrep' gibt dir die PID von oblivion.exe und 'wait' wartet auf die beendigung von oblivion.exe.
#!/bin/bash

starte_oblivion_über_obse
wait $(pgrep oblivion.exe)
starte_conky_und_touchpad
Edit: Um mal näher drauf einzugehen warum dein script nicht funktioniert, oder was man da anders machen könnte:
echo "" > /home/deviant/.conkyscripts/top            [um top zu leeren]
das ist vollkommen überflüssig, wenn du die Ausgabe eines Programms mit '>' in eine Datei umleitest, dann wird die Datei auf Länge 0 gekürzt und sie wird von vorne beschrieben, also die Datei ist automatisch leer.
top -b > /home/deviant/.conkyscripts/top &
top ist ein curses-Programm, die Ausgabe wird nicht nach stdout geschrieben, allerdings leitet '>' die Ausgabe von stdout in die Datei um. Da top aber nichts nach stdout schreibt, wird die Datei immer leer sein.
AN="`grep -i -m 1 opera /home/deviant/.conkyscripts/top`" &
Hier kann grep natürlich nichts finden, da die Datei leer ist. Grundsätzlich sollte man sich bei bashscripten überlegen ob es wirklich notwendig ist, eine temporäre Datei anzulegen, in den meisten Fällen ist es nicht notwendig.

Um zu überprüfen, ob ein Programm läuft bietet sich eigentlich immer pgrep an, praktischerweise gibt pgrep einem auch noch die PID. Eine andere Möglichkeit wäre noch
ps aux | grep programmname
Eigentlich wollte ich top direkt per grep auslesen, musste dann feststellen, dass das nicht funktionierte und sah dann die Möglichkeit, durch den Export in eine Datei dieses Problem umgehen zu können^^
Also so eine Art Workaround für den Workaround des Workarounds 😃

Danke für den Tip, ich werd den gleich mal ausprobieren :-)


Edit:
Das top leer ist, kann ich nicht bestätigen, es wurde tatsächlich vollgeschrieben und liess sich ausserhalb des scripts mit demselben grep-Befehl auslesen: Das ist, was mich so verwunderte.

Mit pgrep habe ich allerdings auch Probleme, da sämtliche Prozesse, die ich benutzen könnte, "nicht von dieser Shell gestartet wurden"...seltsamerweise verweigert Oblivion bei Benutzung über urxvt -e komplett den Dienst.
deviant schrieb Das top leer ist, kann ich nicht bestätigen, es wurde tatsächlich vollgeschrieben und liess sich ausserhalb des scripts mit demselben grep-Befehl auslesen: Das ist, was mich so verwunderte.
Stimmt, ich habe -b übersehen, das startet ja den batch-mode, ist also nicht interaktiv.
deviant schrieb Mit pgrep habe ich allerdings auch Probleme, da sämtliche Prozesse, die ich benutzen könnte, "nicht von dieser Shell gestartet wurden"
Das liegt nicht an pgrep sondern an wait. Wait wartet nur auf Prozesse, die in der aufrufenden Shell gestartet werden. Warum das bei dir nicht funktioniert kann ich nicht sagen, dazu müsste man dein Skript sehen. Du könntest das Problem aber auch mit einer Warteschleife umgehen:
while [ "$(pgrep oblivion.exe)" ]; do 
    sleep 1
done
deviant schrieb ...seltsamerweise verweigert Oblivion bei Benutzung über urxvt -e komplett den Dienst.
Das ist eigentlich nicht seltsam. Vermutlich startest du Oblivion im Hintergrund, wenn du
urxvt -e "command &"
aufrufst, dann beendet sich urxvt, sobald command zur shell zurückkehrt. Wenn sich urxvt beendet, dann beenden sich aber auch alle Prozesse die von urxvt gestartet wurden. Wieso willst du denn überhaupt Oblivion über urxvt starten? Eigentlich müsstest du das doch direkt aus dem Skript starten können.
Wenn du es dennoch mit urxvt machen willst, dann könntest du nohup verwenden:
urxvt -e "nohup command" 
Das Problem liegt darin, dass top im batch mode so lange läuft, bis vorgegebenen Iterationen durch sind oder bis es gekillt wird. (Das steht so auch in der manpage zur Option -b) Mit
top -b -n 1 > /home/deviant/.conkyscripts/top &
sollte das also funktionieren. So kannst du natürlich auch gleich grep benutzen
top -b -n 1 | grep -i -m 1 opera
Edit: Warum startest du das eigentlich alles im Hintergrund? Das kann bei Befehlen die auf dem Output des vorherigen Befehls arbeiten schnell in die Hose gehen. Zudem hättest du bei einer sequentiellen Abarbeitung auch den Fehler bemerkt, da das Programm nie terminiert wäre.

Edit2: Ok terminiert hast es so auch nicht, aber du hast davon nichts mitbekommen.
Danke nochmal für die Hilfe; das es an wait liegt, war mir auch sehr schnell klar und habe darum eine Lösung gesucht, die mit der PID-Variable arbeitet.
Etwas Schlaf und ich hab doch ne Möglichkeit gefunden, die als if-Schleife rekursiv sich selbst aufruft, solange die PID von Oblivion.exe als > 0 ausgegeben wird.^^
Weniger elegant als while, aber funktioniert ebenso.


Frag mich nicht, warum ich urxvt benutzt habe, ich hab keine Ahnung! 😃
Wahrscheinlich, um es mit wait in derselben shell zu benutzen oder so^^
Bei einem gewissen Müdigkeitslevel machen die Synapsen halt dicht und man sollte nicht trotzdem weitermachen, nur weil man das jetzt unbedingt noch hinkriegen will 😃