Wirkliches Includieren mit KSH

M

mado

Grünschnabel
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
 
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
 
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 ...)
 
Zuletzt bearbeitet:
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?
 

Ähnliche Themen

Hilfe für ein shell script

verzeichniss suche funktioniert nicht

Debian Routing Problem

Shellskript - Fehler in Cron

Queue für copy Script

Zurück
Oben