• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[Gelöst] Problem den Rückgabewert einer Funktion abzufragen:

revealed

Guru
Hallo!

Ich wüsste bitte gerne folgendes:
Habe mir einen Script geschrieben, der eine Funktion ausführt. Diese Funktion gibt bereits den Wert 1 (OK) oder 2 (nicht OK) zurück.

Die Funktion wird dann von einer weiteren Abfrage verglichen. In der art:
Wenn also OK wirklich OK ist, dann mach Ein Popup auf mit OK und wenn nicht dann mit nicht OK.

Mit der Intention habe ich mir einen Script gebaut. Ich möchte wissen ob 4 bestimmte Prozesse tatsächlich laufen beim Start und dann ein kurzes 3 Sekundenpopup sehen. Das habe ich soweit schon erfolgreich umgesetzt; An sich also hier der Code -> Zu dem ich aber noch folgende Frage habe:

Warum kann ich den kdialog Befehl, der in der untersten Abfrage steht nicht in den Variablen works= und noworks= eintragen oder was habe ich falsch gemacht?

Es besteht dann das Problem, wenn ich das so gemacht hätte wie im Script angedeutet, dass dann das Ergebnis der Funktion zwar ausgegeben wird jedoch die Schleife die Prüft ob OK wirklich OK ist, dass diese dann eben gnadenlos beide Dialoge ausgibt nacheinander OK Dialog -> NOK Dialog und exit 0;.

Hier der Code: (Achtung beinhaltet zwei ungewollte Zeilenumbrüche in Zeilen 11 und 18 )::
Code:
#! /bin/bash
# Prüft ob LIRC Dienste gestartet wurden!
# 
## VARIABLEN für Dienste mit pgrep und awk:                                           
PGlircmd="$( pgrep -l lircmd | awk -F \  '{print $2}' )";
PGlircd="$( pgrep -l lircd | awk -F \  '{print $2}' )";
PGirexec="$( pgrep -l irexec | awk -F \  '{print $2}' )";
PGlirc_pvr150="$( pgrep -l pvr | awk -F \  '{print $2}' )";
## VARIABLEN für Ausgaben:
works="$(  )"; # Wenn ich die kdialog hier eintrage 
noworks="$(  )"; # dann wird das Ergebnis der Funktion ignoriert und beide dialoge nacheinander ausgegeben.
#
# Funktion Abfrage:
function ask ()
{
# Parameterübergabe
moep="$1";
if [ "$PGlircmd" = "lircmd" -a "$PGlircd" = "lircd" -a "$PGirexec" = "irexec" -a "$PGlirc_pvr150" = "lirc_pvr150" ]; then   
  # OK
  return 1;
else
  # NOK
  return 2;
fi;
}
# Funktiion ausführen
ask $1
#echo "$?"
#
##### Funktion von LIRC mit Funktion Überprüfen:
if [ "$?" = "1" ]; then
   kdialog --passivepopup 'pvr150 is running with LIRCD, LIRCMD and irexec' 3;
else
   kdialog --passivepopup 'Starting remote control for PVR 150 failed!' 3;
fi;
#
#
#
exit 0;
#EOF

Als wäre OK einmal ok und aber auch nicht ok. Als wärs ihm egal. Meinte wild-thing (mein PC) zu mir (revealed): "Das is mir egal!"; Ich zeig dir beide Dialoge;

Kann mir das bitte jemand zeigen oder erklähren?

Vielen Dank für die Hilfe!

Grüße,

R
 

abgdf

Guru
Hi,

ohne das testen zu können, würde ich mal sagen, Code-Blocks und Subshells und demzufolge beschränkte Namensräume von Variablen könnten das Problem sein.
Das macht Shell-Programmierung IMHO so unerfreulich.

Gruß
 
A

Anonymous

Gast
revealed schrieb:
Code:
## VARIABLEN für Ausgaben:
works="$(  )"; # Wenn ich die kdialog hier eintrage 
noworks="$(  )"; # dann wird das Ergebnis der Funktion ignoriert und beide dialoge nacheinander ausgegeben.
#
Verstehe ich nicht ganz wie du das meinst, wenn du aber dort zB

Code:
works=$(kdialog --passivepopup 'pvr150 is running with LIRCD, LIRCMD and irexec' 3)
......
daraus machen würdest, dann wird schon an dieser Stelle der kdialog gestartet, und die Standard-Ausgabe daraus, also nichts, in die Variable "works" geschrieben. Also ohne das da jemals eine Abfrage gelaufen währe und ohne das du die Variable works jemals ausgelesen hättest.
Das macht Shell-Programmierung IMHO so unerfreulich.
da muss man den Hirnschmalz ein bisschen intensiver und gezielter einsetzen, Shellprogrammierung ist schon was anderes als mit der Maus da irgendwelche Funktionen irgendwohin zu ziehen und dann an irgendwelchen Eigenschaften fallenzulassen und da und dort noch ein paar Häckchen zu setzen. ;) ;) ;) ;)

robi
 
OP
revealed

revealed

Guru
Hm.

Ja das Problem ist eben, wenn ich die Variable so gestalte, wie du gesagt hast und bei der letzteren Abfrage eintrage:

$works anstelle eben dem was oben eingetragen wurde, dann werden die Dialoge für OK und NOK der Reihe Nach einfach ausgegeben.

:s

hald-runner müsste so ziemlich jeder als Prozess haben: (Schaut 4x nach ob 1x hald-runner vorhanden ist unsinniger weise aber genau das Problem;)
Code:
#! /bin/bash
# Prüft ob LIRC Dienste gestartet wurden!
# 
## VARIABLEN für Dienste mit pgrep und awk:                                           
PG1="$( pgrep -l hald-runner | awk -F \  '{print $2}' )";
PG2="$( pgrep -l hald-runner | awk -F \  '{print $2}' )";
PG3="$( pgrep -l hald-runner | awk -F \  '{print $2}' )";
PG4="$( pgrep -l hald-runner | awk -F \  '{print $2}' )";
## VARIABLEN für Ausgaben:
works="$( kdialog --passivepopup 'pvr150 is running with LIRCD, LIRCMD and irexec' 3; )"; 
# Wenn ich die kdialog hier eintrage 
noworks="$( kdialog --passivepopup 'Starting remote control for PVR 150 failed!' 3; )"; 
# dann wird das Ergebnis der Funktion ignoriert und beide dialoge nacheinander ausgegeben.
#
# Funktion Abfrage:
function ask ()
{
# Parameterübergabe
moep="$1";
if [ "$PG1" = "hald-runner" -a "$PG2" = "hald-runner" -a "$PG3" = "hald-runner" -a "$PG4" = "hald-runner" ]; then   
  # OK
  return 1;
else
  # NOK
  return 2;
fi;
}
# Funktiion ausführen
ask $1
#echo "$?"
#
##### Funktion von LIRC mit Funktion Überprüfen:
if [ "$?" = "1" ]; then
   $works;
else
   $noworks;
fi;
#
#
#
exit 0;
#EOF

Dann frag ich konkreter:
Wie schreibt man die Variable richtig, sodass kdialog erst dann aufgerufen wird, wenn es ausgeführt werden soll?

Vielen Dank für die schnellen Antworten!

Gruß,

R
 
A

Anonymous

Gast
revealed schrieb:
Wie schreibt man die Variable richtig, sodass kdialog erst dann aufgerufen wird, wenn es ausgeführt werden soll?
zB als Funktionen ;)
Code:
works(){ kdialog --passivepopup 'pvr150 is running with LIRCD, LIRCMD and irexec' 3; }
noworks() { kdialog --passivepopup 'Starting remote control for PVR 150 failed!' 3; }
.....
if [ .....
then works
else noworks
fi
 
OP
revealed

revealed

Guru
Danke!

Das ist neu für mich! Werde das gleich in dieser Schreibweise probieren!

:)

danke nochmals!

Edit;
Das geht so einwandfrei! Wenn ich das bei den globalen Variablen so definiere, spricht man aber dann schon trotzdem von Funktion?
/edit;

Ich setze schonmal auf gelöst! Sehr nett von euch!

sieht jetz so aus das ganze:
Code:
#! /bin/bash
# Prüft ob LIRC Dienste gestartet wurden!
# Checks, wether LIRC services started at all!
## VARIABLEN für Dienste mit pgrep und awk:                                           
proc1="$( pgrep -l lircmd | awk -F \  '{print $2}' )";
proc2="$( pgrep -l lircd | awk -F \  '{print $2}' )";
proc3="$( pgrep -l irexec | awk -F \  '{print $2}' )";
proc4="$( pgrep -l pvr | awk -F \  '{print $2}' )";
## VARIABLEN für Ausgaben:
ok(){ kdialog --passivepopup 'PVR150 remote control Functions [ success ]' 8; }; 
nok(){ kdialog --passivepopup 'Starting PVT150 remote control functions [ failed! ]' 8; };
#
# Funktion Abfrage:
function ask ()
{
# Parameterübergabe
moep="$1";
if [ "$proc1" = "lircmd" -a "$proc2" = "lircd" -a "$proc3" = "irexec" -a "$proc4" = "lirc_pvr150" ]; then   
  return 1; # OK
else
  return 2; # NOK
fi;
}
# Funktiion ausführen
ask $1
#echo "$?"
#
##### Funktion von LIRC mit Funktion Überprüfen:
if [ "$?" = "1" ]; then
   ok;
else
   nok;
fi;
#
#
exit 0;
# EOF

Weil ich bastel da grad rum an LIRC und wenn ich starte, dann will ich auf einen Blick sehen, ob die Dienste zumindest gestartet wurden. Wenn in der Konstellation eben positives Ergebnis erscheint, dann weiss ich auf einen Blick das alles geklappt hat :)

Das war ein bisschen monoton ohne. :)

Gruß,

R
 
A

Anonymous

Gast
revealed schrieb:
Code:
function ask ()
{
# Parameterübergabe
moep="$1";
if [ "$proc1" = "lircmd" -a "$proc2" = "lircd" -a "$proc3" = "irexec" -a "$proc4" = "lirc_pvr150" ]; then   
  return 1; # OK
else
  return 2; # NOK
fi;
}
# Funktiion ausführen
ask $1
#echo "$?"
#
##### Funktion von LIRC mit Funktion Überprüfen:
if [ "$?" = "1" ]; then
   ok;
else
   nok;
fi;
Warum willst du das so weit verschachteln, erst einen Rückgabewert und dann diesen dann wieder auswerten ohne das da an den Zuständen sich irgend etwas ändern könnte? statt die Returnwerte gleich die entsprechenden Funktionen wird übersichtlicher, alles andere ist doppelt gemoppelt.

robi
 
OP
revealed

revealed

Guru
Hm so weit hab ich da jetzt garnicht gedacht. Hatte mir das im Ansatz aus einem Tut gezogen und was ich hier schon so rumliegen hab. Ich fand quasi erstmal keinen anderen Weg.

Aber so erinnert mich das im Ansatz an eine Schaltung.

Das passt jetzt schon so. Alles weitere wäre zu viel. Möchte euch nicht länger die Zeit stehlen :)

Gruß,

R

Code:
#! /bin/bash
# Prüft ob LIRC Dienste gestartet wurden!
# Checks, wether LIRC services started at all!
## VARIABLEN für Dienste mit pgrep und awk:                                           
proc1="$( pgrep -l lircmd | awk -F \  '{print $2}' )";
proc2="$( pgrep -l lircd | awk -F \  '{print $2}' )";
proc3="$( pgrep -l irexec | awk -F \  '{print $2}' )";
proc4="$( pgrep -l pvr | awk -F \  '{print $2}' )";
## Funktionen für Ausgaben:
ok(){ kdialog --passivepopup 'PVR150 remote control Functions [ success ]' 8; };
nok(){ kdialog --passivepopup 'Starting PVT150 remote control functions [ failed! ]' 8; };
#
# Abfrage:
if [ "$proc1" == "lircmd" -a "$proc2" == "lircd" -a "$proc3" == "irexec" -a "$proc4" == "lirc_pvr150" ]; then   
  ok; # OK
else
  nok; # NOK
fi;
exit 0;
# EOF
 
Oben