Eine Meldung an den Nutzer übergeben, falls ein Kommando einen Exit-Status>0 hat

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von tuxlover, 13.12.2006.

  1. #1 tuxlover, 13.12.2006
    Zuletzt bearbeitet: 13.12.2006
    tuxlover

    tuxlover Der den Tux knuddelt

    Dabei seit:
    26.10.2005
    Beiträge:
    2.106
    Zustimmungen:
    0
    Ort:
    berlin
    hallo allerseits,

    ich habe über die letzten zwei wochen ein bisschen meine skills in sachen shell-programmierung verfeinert. offensichtlich aber nicht gut genug :( naja übung macht den meister.

    also ich will folgendes machen. in einem shellscrpt sollen mehrere Kommandos ausgeführt werden, wenn eines der Kommandos fehlschlägt müsste es einen Exit-Status > 0 meistens 1 zurückgeben. dises wollte ich dann benutzen, um den Nutzer auf einen fehler aufmerksam zu machen.

    hier den entsprechende Code wie ich mir das überlegt habe:

    Code:
     Command1
    EXIT_STATUS1=$?
    .
    .
    .
    Commandn
    EXIT_STATUSn=$?
    
    if [ $EXIT_STATUS1 && ...&& EXIT_STATUSn >0  ]
    then
    echo "ERROR"
    exit ERROR
    else
    echo "!!!All fine!!!"
    
    natürlich funktioniert das nicht er meckert zum einen in den Zeilen wo die EXIT_STATI abgefragt werden mit der Meldung bash:1 command not found und zum anderen in der zeile mit dem test. von wegen 0 kennt er nicht.

    was mache ich falsch bzw. wie macht mans richtig?
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Eine (von vielen) Möglichkeiten:

    Code:
    command1 &&
    command2 &&
    ... &&
    echo ok || echo error
    
    Gruss, Xanti
     
  4. #3 tuxlover, 13.12.2006
    tuxlover

    tuxlover Der den Tux knuddelt

    Dabei seit:
    26.10.2005
    Beiträge:
    2.106
    Zustimmungen:
    0
    Ort:
    berlin
    ja irgendwie funktioinert das. aber kannst du mir erklären wieso das so funktioniert?

    danke tuxlover
     
  5. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    && entspricht dem logischen Und, || dem Oder.
    Die Shell ist bemüht, Konstrukte mit && und || zu einem Erfolg zu führen und zu merken, wann es unmöglich ist.

    Die Anweisung cmd1 && cmd2 wird so interpretiert, dass der Rückgabewert von cmd1 (erfolgreich ausgeführt = true, Fehler = false) ausgewertet wird. Ist er false, weiß die Shell, dass die gesamte Anweisung unmöglich true annehmen kann und führt cmd2 nicht mehr aus. Also nur im Falle cmd1=true wird cmd2 ausgeführt.

    cmd1 || cmd2 wird entsprechend ausgewertet, dass cmd2 nur ausgeführt wird, wenn cmd1=false ist.
     
  6. #5 x-lette, 14.12.2006
    x-lette

    x-lette Mitglied

    Dabei seit:
    23.04.2006
    Beiträge:
    44
    Zustimmungen:
    0
    Ort:
    Berlin
    Anderer Ansatz, den ich selber gerne nutze (kommt mir etwas flexibler vor als o.g. weil die Kdos nicht direkt hintereinander stehen müssen):

    Code:
    EXIT_STATUS=0
    Command1 || EXIT_STATUS=$?
    . 
    # hier können auch andere Sachen stehen, die nicht getestet werden
    .
    Commandn || EXIT_STATUS=$?
    
    if [ $EXIT_STATUS != 0  ] ; then
      echo "ERROR"
      exit ERROR
    else
      echo "!!!All fine!!!"
    fi
    Der Exitstatus muß ja nur einmal festgehalten werden. So setzt jeder fehlgeschlagene Programmaufruf den Exitcode, jeder geglückte Aufruf läßt die Variable unverändert.
    Ist die Variable am Schluß ungleich 0 (kann ja auch negative Exitcodes geben, oder nicht?), ist eines der Progs fehlgeschlagen.
    Auch macht die Erweiterung weniger Probleme, da keine Variablen hinzugefügt werden müssen.

    Gruß
    XL
     
  7. #6 Schlaubi_fi.de, 14.12.2006
    Schlaubi_fi.de

    Schlaubi_fi.de Mac OS X User

    Dabei seit:
    22.12.2004
    Beiträge:
    304
    Zustimmungen:
    0
    Dazu habe ich nur noch eines hinzuzufügen...

    !!!!!!!!!!!!!! Warum den Benutzer so erschrecken, wenn eh alles iO ist? !!!!!!!!!!!!!! :D
     
  8. #7 tuxlover, 14.12.2006
    tuxlover

    tuxlover Der den Tux knuddelt

    Dabei seit:
    26.10.2005
    Beiträge:
    2.106
    Zustimmungen:
    0
    Ort:
    berlin
    @schlaubi: wieso denn erschrecken. Aber vielleicht ist dann ein

    Code:
    echo "All fine :)"
    besser.

    @Xanti danke schön jetzt verstehe ich auch warum es funktioniert. das zweifleos die elegantere methode. :) danke

    @x-lette kann es sein, dass bei deinem beispiel die Variable EXIT_STATUS jedesmal neu gesetzt wird?.
     
  9. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Die Variable wird nur gesetzt, wenn irgendwo ein Befehl fehlerhaft war. Wenn sie also zum Schluss nicht gesetzt ist, ist alles ok.
     
  10. #9 tuxlover, 14.12.2006
    tuxlover

    tuxlover Der den Tux knuddelt

    Dabei seit:
    26.10.2005
    Beiträge:
    2.106
    Zustimmungen:
    0
    Ort:
    berlin
    aha

    vielen dank
     
  11. #10 Wolfgang, 14.12.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Es besteht aber dennoch ein gravierender Unterschied zu Xanties Lösung!

    Bei Xantie wird die Befehlskette beendet, sobald ein Befehl fehlschlägt.
    Im zweiten Fall wird erst zum Schluss ausgewertet, die weiteren Commands aber ausgeführt.

    Wenn du z.B. ein
    tar -czf file.tar.gz testdatei &&rm -f testdatei
    hast, wird im zweiten Fall die Testdatei gelöscht, auch wenn das Tararchiv nicht erstellt werden konnte!
    Die Meldung am Ende nutzt dann wenig.:devil:
    Siehst du den kleinen aber bedeutenden Unterschied.? ;)

    Nur mal so am Rande bemerkend
    Gruß Wolfgang
     
  12. #11 x-lette, 15.12.2006
    x-lette

    x-lette Mitglied

    Dabei seit:
    23.04.2006
    Beiträge:
    44
    Zustimmungen:
    0
    Ort:
    Berlin
    :D Gut bemerkt.
    Da aber keine konkreten Anforderungen gegeben waren, lediglich diverse Kommandos ausgeführt werden sollten und am Schluss EIN Statuscode ausgegeben werden sollte, finde ich meine Lösung nach wie vor sauber und elegant. :)

    Sollten aber Zusammenhänge irgendeiner Art zwischen den einzelnen Kommandos bestehen, müssen diese natürlich berücksichtigt werden.
    Das sollte dann aber auch in der Fragestellung kenntlich gemacht sein.

    Gruß
    XL
     
  13. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  14. #12 tuxlover, 19.12.2006
    tuxlover

    tuxlover Der den Tux knuddelt

    Dabei seit:
    26.10.2005
    Beiträge:
    2.106
    Zustimmungen:
    0
    Ort:
    berlin
    das heißt jetzt für den zweiten fall. dass es eventuell unnötig lange laufzeiten gibt, wenn man z.b 100 befehle hintereinander ausführen will und der zweite berreits einen fehler verursacht.
     
  15. #13 Wolfgang, 19.12.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Du kannst do selbst entscheiden, was passieren soll wenn ein Commando einen Fehler erzeugt.
    Dafür gibt es z.B. exit
    Schreib dir eine Errorfunktion, und benutze die im Fehlerfall als Ausstieg.

    Gruß Wolfgang
    PS Guter Programmierstil zeichnet sich auch dadurch aus, dass Fehler abgefangen werden!
     
Thema:

Eine Meldung an den Nutzer übergeben, falls ein Kommando einen Exit-Status>0 hat

Die Seite wird geladen...

Eine Meldung an den Nutzer übergeben, falls ein Kommando einen Exit-Status>0 hat - Ähnliche Themen

  1. vfs full_audit loggt keine fehlerhaften Anmeldungen

    vfs full_audit loggt keine fehlerhaften Anmeldungen: Hallo zusammen, ich habe einen Samba-Server auf OpenSuse 12.3 laufen, würde nun noch gerne einen fail2ban-Mechanismus einrichten. Dazu schreibe...
  2. LDAP-Anmeldung an einem SQL-Server

    LDAP-Anmeldung an einem SQL-Server: Hallo Leute, ich habe eine Frage: "Wie kann ich mit meinem LDAP-Server mich an meinem MySQL-Server authenfizieren?" Das heisst ich möchte...
  3. VirtuelBox 4.1.18 auf OpenSuse 12.1 startet nicht (keine Fehlermeldung)

    VirtuelBox 4.1.18 auf OpenSuse 12.1 startet nicht (keine Fehlermeldung): Hallo zusammen. Gerade ärgere ich mich wieder einmal mit VirtualBox herum. Wie so oft startet es nicht. Dieses Mal habe ich jedoch mangels...
  4. Win7 Anmeldung an einem Samba PDC

    Win7 Anmeldung an einem Samba PDC: ich arbeite an einem Samba PDC für eine Schule. (der betagte Vorgänger soll erneuert werden). Dazu nutze ich die aktuelle Suse Version SuSE Linux...
  5. ypbind client: keine Anmeldung moeglich

    ypbind client: keine Anmeldung moeglich: Hallo, ich habe einen NIS client auf Debian lenny laufen, doch schlaegt jeder login-Versuch fehl. ich kann: - mich ueber ssh als NIS-user...