Wirkliches Includieren mit KSH

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von mado, 28.08.2009.

  1. mado

    mado Grünschnabel

    Dabei seit:
    28.08.2009
    Beiträge:
    2
    Zustimmungen:
    0
    Hallo zusammen,

    ich suche schon seit einigen Stunden / Tagen nach einer Lösung für mein Problem und finde leider nichts! Vielleicht könnt Ihr mir ja helfen und sei es mit einem "Das geht nicht!".

    Ich habe zwei Funktionen a und b. Funktion a ruft Funktion b auf. In Funktion b möchte ich nun ein KSH-Script c.ksh aufrufen. Wenn es dort einen Fehler gibt, soll die Funktion b beendet werden und keine Befehle mehr ausführen. Funktion a soll nach dem Aufruf von Funktion b weitermachen.

    Hier ein kleines Code-Beispiel:

    Code:
    #!/usr/bin/ksh
    function a
    {
      echo "Begin a"
      b
      echo "End a"
    }
    
    function b
    {
      echo "Begin b"
    
      # Das Script c.ksh soll verhindern, dass
      # echo "End b" ausgeführt wird, darf
      # aber nicht verhindern, dass echo "End a"
      # von funktion a ausgeführt wird.
      # Der Aufruf
      # . c.ksh || return
      # wird nicht gewünscht, da c.ksh für das return 
      # verantwortlich sein soll. Es soll also nicht
      # hier gesteuert werden, ob die Funktion
      # verlassen wird!
      . c.ksh
      echo "End b"
    }
    
    echo "Gewünschtes Ergebnis:"
    echo "Begin a\nBegin b\nEnd a"
    echo "\nIst:"
    
    # Aufruf der Funktion a
    a
    Wichtig ist noch, dass ich in c.ksh eine Variable belege, die auch in den aufrufenden Funktionen gültig sein soll, ein "sourcen" mit "." ist somit nötig. Ich hätte jetzt gedacht, dass ich ein "return 1" in c.ksh eintragen kann und die Funktion b dann verlassen wird (immerhin source ich ja c.ksh). Aber mit return1 verlasse ich nur das Script c.ksh. Mit exit 1 verlasse ich leider auch die Funktion a.

    Gibt es also eine Möglichkeit ein ksh-Script aufzurufen, sodass die darin gesetzt Variablen auch in der Funktion gültig sind und ich trotzdem die direkt aufrufende Funktion direkt verlassen kann? Es wäre also schön, wenn die Anweisungen aus einem gesourcten Script genau so ausgeführt werden, als ob sie direkt in der Funktion stehen. Also ein richtiges Includeren von Scripten. Das "."-Sourcen nützt mir leider nichts, oder ich stelle mich zu dämlich an.

    Als B-Lösung wäre es auch möglich irgendeine andere Scriptsprache (für das c.ksh) einzusetzen.

    Vielen Dank für Eure Hilfe
     
  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. #2 slackfan, 28.08.2009
    slackfan

    slackfan König

    Dabei seit:
    18.04.2006
    Beiträge:
    809
    Zustimmungen:
    0
    Ort:
    Bonn
    Hallo,


    ich weiß nicht, ob ich das richtig verstehe, aber was spricht denn gegen
    Code:
    #!/bin/ksh
    
    function a {
        echo "Begin a"
        b
        echo "End a"
    }
    
    function b {
        echo "Begin b"
        ksh c.sh || return
        echo "End b"
    }
    
    a
    
    und wieso soll das Skript c für den Abbruch verantwortlich sein? Wie soll das denn gehen? Dann müsste Skript c ja Ahnung von den Funktionen a und b haben?


    cu
     
  4. #3 floyd62, 28.08.2009
    Zuletzt bearbeitet: 28.08.2009
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    Hi,

    dazu sollte es doch ausreichen, in der Funktion b() einfach die Zeile
    Code:
    . c.ksh
    
    abzuändern auf
    Code:
    . c.ksh || return $?
    
    ... oder sehe ich da was falsch?

    Gruss

    (NB, @slackfan: beim Aufruf mit "ksh c.ksh" können natürlich in c.ksh keine Variablen gesetzt werden, die dann auch danach in a noch gültig wären ... sonst ist das exakt dein Vorschlag ...)
     
  5. mado

    mado Grünschnabel

    Dabei seit:
    28.08.2009
    Beiträge:
    2
    Zustimmungen:
    0
    Ein

    Code:
    . c.ksh || return
    würde schon reichen, schon klar. Ich möchte aber für viele Funktionen eine Fehlerbehandlung vereinheitlichen und den Aufruf so leicht wie möglich machen. Ein || return kann man allerdings sehr leicht vergessen, sodass dies wenn dann nur eine Notlösung wäre.

    Eine Alternative wäre noch für mich, wenn ich im Script c.ksh prüfen könnte, ob ein "|| return" hinter dem Scriptaufruf steht. Dann hätte ich wenigstens die Gewissheit, dass der Aufruf immer richtig ist. Aber das ist vermutlich auch nicht möglich, oder?
     
  6. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

Wirkliches Includieren mit KSH