perl skript aus SOLARIS shell-skript aufrufen
perl skript aus SOLARIS shell-skript aufrufen
am 16.02.2006 15:17:20 von Anton Berg
Hallo,
ich habe einen kleines Perl-Skript geschrieben, das ein paar
SQL-Abfragen auf einer DB macht und auf einer Solaris-Maschine von
einem Shell-Skript aufgerufen werden soll. In diesem Shell-Skript, soll
in Abhängigkeit des Ergebnisses der Abfrage in eine bestimmte
Bedingung verzweigt werden, d.h. something like....
if perl myscript.pl
do something
Vermutlich muss man im Perl-Skript auf der UNIX eine Umgebungsvariable
setzen und diese dann abfragen, oder gibt es noch andere, bessere
Möglichkeiten zur Kommunikation zwischen einem Shell-Script auf UNIX
und meinem Perl-Script?
Grüße und danke,
Anton
Re: perl skript aus SOLARIS shell-skript aufrufen
am 16.02.2006 15:31:42 von Wolf Behrenhoff
Anton Berg schrieb:
> Hallo,
>
> ich habe einen kleines Perl-Skript geschrieben, das ein paar
> SQL-Abfragen auf einer DB macht und auf einer Solaris-Maschine von
> einem Shell-Skript aufgerufen werden soll. In diesem Shell-Skript, soll
argh! ^
> in Abhängigkeit des Ergebnisses der Abfrage in eine bestimmte
> Bedingung verzweigt werden, d.h. something like....
> if perl myscript.pl
> do something
Siehe
perldoc -f exit
Du kannst damit verschiedene Werte zurückgeben. Also zum Beispiel:
alpha41> if perl -e 'exit 0'; then echo 'null'; else echo 'eins'; fi
null
alpha41> if perl -e 'exit 1'; then echo 'null'; else echo 'eins'; fi
eins
Wolf
Re: perl skript aus SOLARIS shell-skript aufrufen
am 16.02.2006 15:33:27 von Wolf Behrenhoff
Anton Berg schrieb:
> Hallo,
>
> ich habe einen kleines Perl-Skript geschrieben, das ein paar
> SQL-Abfragen auf einer DB macht und auf einer Solaris-Maschine von
> einem Shell-Skript aufgerufen werden soll. In diesem Shell-Skript, soll
argh! ^
> in Abhängigkeit des Ergebnisses der Abfrage in eine bestimmte
> Bedingung verzweigt werden, d.h. something like....
> if perl myscript.pl
> do something
Siehe
perldoc -f exit
Du kannst damit verschiedene Werte zurückgeben. Also zum Beispiel:
alpha41> if perl -e 'exit 0'; then echo 'null'; else echo 'eins'; fi
null
alpha41> if perl -e 'exit 1'; then echo 'null'; else echo 'eins'; fi
eins
Vielleicht sollte ich noch anmerken, dass hier 0 als wahr/kein Fehler im
Script angesehen wird.
Wolf
Re: perl skript aus SOLARIS shell-skript aufrufen
am 16.02.2006 17:46:56 von Ingo Menger
Anton Berg schrieb:
> Vermutlich muss man im Perl-Skript auf der UNIX eine Umgebungsvariable
> setzen und diese dann abfragen,
Nein. Jeder Prozeß hat seinen eigenen Satz von Umgebungsvariablen. Man
kann zwar über Ergebnisvariablen den eigenen Kindprozessen etwas
mitteilen, aber niemals dem Elternprozeß.
Re: perl skript aus SOLARIS shell-skript aufrufen
am 16.02.2006 21:08:28 von Slaven Rezic
"Ingo Menger" writes:
> Anton Berg schrieb:
>
> > Vermutlich muss man im Perl-Skript auf der UNIX eine Umgebungsvariable
> > setzen und diese dann abfragen,
>
> Nein. Jeder Prozeß hat seinen eigenen Satz von Umgebungsvariablen. Man
> kann zwar über Ergebnisvariablen den eigenen Kindprozessen etwas
> mitteilen, aber niemals dem Elternprozeß.
>
Mit einem Hack, den zum Beispiel tset und ssh-agent verwenden, geht
es:
eval `perl script`
Dazu muss man die Kommandos zum Setzen der Environmentvariablen im
Perl-Skript auf STDOUT schreiben. Und natürlich auf die Unterschiede
in der Shell-Syntax (sh vs. csh) achten.
Gruß,
Slaven
--
Slaven Rezic - slaven rezic de
babybike - routeplanner for cyclists in Berlin
handheld (e.g. Compaq iPAQ with Linux) version of bbbike
http://bbbike.sourceforge.net
Re: perl skript aus SOLARIS shell-skript aufrufen
am 17.02.2006 09:40:10 von Ferry Bolhar
Ingo Menger:
>> Vermutlich muss man im Perl-Skript auf der UNIX eine Umgebungsvariable
>> setzen und diese dann abfragen,
>
> Nein. Jeder Prozeß hat seinen eigenen Satz von Umgebungsvariablen. Man
> kann zwar über Ergebnisvariablen den eigenen Kindprozessen etwas
> mitteilen, aber niemals dem Elternprozeß.
Das stimmt so nicht ganz, denn jeder Prozess kann den Exit-Status eines von
ihm erzeugten Kinderprozess abfragen. In Shells gibt es dazu die $?
Variable,
in Perl kann man mit 'exit ' einen Exit-Status von übermitteln:
$ perl -e 'exit 4'; echo $?
4
$
(Achtung: Das ';' ist kein Teil des Perl-Befehls, sondern ein Metazeichen
der Shell.)
Das funktioniert mit Werten von 0..255, wobei 0 (normalerweise) OK bedeutet,
jeder andere Wert einen Fehler. Aber solange nur du den Exit-Status
auswertest,
kannst du jeden Wert so interpretieren, wie du willst.
Und natürlich kann man damit dann auch 'if' (und in [t]csh Shells auch
'switch')
Konstrukte programmieren.
HTH, LG
Ferry
--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol@adv.magwien.gv.at
Re: perl skript aus SOLARIS shell-skript aufrufen
am 17.02.2006 09:48:08 von Christian Winter
Anton Berg schrieb:
> Hallo,
>
> ich habe einen kleines Perl-Skript geschrieben, das ein paar
> SQL-Abfragen auf einer DB macht und auf einer Solaris-Maschine von
> einem Shell-Skript aufgerufen werden soll. In diesem Shell-Skript, soll
> in Abhängigkeit des Ergebnisses der Abfrage in eine bestimmte
> Bedingung verzweigt werden, d.h. something like....
> if perl myscript.pl
> do something
>
> Vermutlich muss man im Perl-Skript auf der UNIX eine Umgebungsvariable
> setzen und diese dann abfragen, oder gibt es noch andere, bessere
> Möglichkeiten zur Kommunikation zwischen einem Shell-Script auf UNIX
> und meinem Perl-Script?
Auf einer bash-Shell würde ich es vermutlich so machen:
-----------------------------------------
#!/bin/bash
PROG_RESULT=`mein_perl_script.pl`
if [[ $? == 0 ]]
then
# do something
fi
-----------------------------------------
und im perl script je nach SQL-Ergebnis exit(0) für den Erfolgsfall
und irgendeinen anderen Wert für den Fehlerfall ausgeben.
Oder Du testest (wenn das perl script einen String ausgibt), ob
$PROG_RESULT gefüllt ist, anstatt den exit-Wert zu testen:
-----------------------------------------
if [[ "$PROG_RESULT" != "" ]]
then
...
fi
-----------------------------------------
Wenn das perl script unterschiedliche Strings für verschiedene
Fälle ausgibt kannst Du natürlich auch differenzieren:
------------------------------------------
case "$PROG_RESULT" in
fall1)
# do something for case 1
;;
fall2)
# do something for case 2
;;
*)
# generic case
;;
esac
------------------------------------------
Was das ganze mit Perl zu tun hat, ist natürlich hier die Frage.
Das wäre eher was für de.comp.os.unix-Hierarchie bzw. eine
Gruppe zu $SHELL_DEINER_WAHL gewesen.
-Christian
Re: perl skript aus SOLARIS shell-skript aufrufen
am 17.02.2006 10:35:54 von Ingo Menger
Ferry Bolhar schrieb:
> Ingo Menger:
>
> >> Vermutlich muss man im Perl-Skript auf der UNIX eine Umgebungsvariable
> >> setzen und diese dann abfragen,
> >
> > Nein. Jeder Prozeß hat seinen eigenen Satz von Umgebungsvariablen. Man
> > kann zwar über Ergebnisvariablen den eigenen Kindprozessen etwas
> > mitteilen, aber niemals dem Elternprozeß.
>
> Das stimmt so nicht ganz, denn jeder Prozess kann den Exit-Status eines v=
on
> ihm erzeugten Kinderprozess abfragen.
Das ist mir schon klar und war dem OP zum Zeitpunkt meines Postings
schon mitgeteilt worden. Ich wollte nur noch mal darauf hingewiesen
haben, daß es über Umgebungsvariablen (nicht, wie ich fälschlich
schrieb: Ergebnisvariablen) nicht geht.
An was der OP dachte, ist ja offenbar sowas:
In Perl: $ENV{"ERGEBNIS"} =3D $bar;
In der Shell:
perl script.pl ...
if [ "$ERGEBNIS" =3D "x42" ]
then ...
Und so geht es halt nicht.
Re: perl skript aus SOLARIS shell-skript aufrufen
am 17.02.2006 10:42:21 von Ingo Menger
Slaven Rezic schrieb:
> "Ingo Menger" writes:
>
> > Anton Berg schrieb:
> >
> > > Vermutlich muss man im Perl-Skript auf der UNIX eine Umgebungsvariable
> > > setzen und diese dann abfragen,
> >
> > Nein. Jeder Prozeß hat seinen eigenen Satz von Umgebungsvariablen. Man
> > kann zwar über Ergebnisvariablen den eigenen Kindprozessen etwas
> > mitteilen, aber niemals dem Elternprozeß.
> >
>
> Mit einem Hack, den zum Beispiel tset und ssh-agent verwenden, geht
> es:
> eval `perl script`
> Dazu muss man die Kommandos zum Setzen der Environmentvariablen im
> Perl-Skript auf STDOUT schreiben. Und natürlich auf die Unterschiede
> in der Shell-Syntax (sh vs. csh) achten.
Klar, aber auch da setze ich nicht Umgebungsvariablen im Perlskript.
Das ist nur ein besonders bequemer Weg, auf STDOUT geschriebene
Egebnisse in der Shell auszuwerten.
Es ging mir hier eigentlich nur darum, vor falschen Vorstellung des OP
über Umgebungsvariablen und deren Vererbung zu warnen, insbesondere
weil dies ein häufiger und typischer Fehler von UNIX-Anfängern ist.