Perl systemcall

T

Tommy_WY

Mitglied
Hallo zusammen,

ich habe mal wieder ein kleines Problem.

Ich habe ein kleines Perlscript geschrieben, um Dateien zu manipulieren.
Diese Daten habe ich mir aus dem CVS ausgecheckt.
Nach der Manipulation möchte ich die Dateien gerne wieder ins CVS einchecken.
Und genau da liegt mein Problem.
Ich habe keine Ahnung, ob ich das unter Perl direkt machen kann oder nicht.
Mein erster Gedankengang war demnach ein system oder qx Aufruf von Unix.
Dummerweise benötigt aber der CVS-Client aus der Unixkommandozeile zunächst eine Variable namens CVSROOT. Ich muss also erst der Shell die Variable verabreichen und danach kann ich erst an ein cvs commit und/oder cvs tag denken.

Kann ich in einem system mehrere Unixbefehle absetzen?
Im Prinzip so:
Code:
system ("ls -ltr
cd irgendwas
mkdir nochwasandres");

Oder spezieller
Code:
system ("CVSROOT=$cvspath
cvs commit dat1 dat2
cvs tag dat1 dat2");

Ich habe nicht wirklich was bei cpan gefunden, was direkt aus Perl funzt.

I need :hilfe2:

Grüsse Tommy
 
Code:
$ perl -e '$ENV{foo} = "bar"; system q{ echo $foo }'
bar
Siehe auch:
Code:
$ perldoc perlvar|less -pENV

Du kannst mehrere Kommandos inner Shell durch Semicolen (Plural von Semicolon?) trennen.

Was ist hiermit?
 
Hi,

ah, also über ein ";", das ist gut. Ans Enivroment hab ich auch schon gedacht, zumindest für die Variable.

Bei meiner Suche mit dem ppm und der Eingabe cvs, hat mir der ppm das Package nicht angezeigt. Das sieht auf den ersten Blick ganz gut aus.

Ich schau es mir morgen an. Wir haben Releasewechsel WE und dann muss ich eh hier rein kommen.

Danke danke
 
Um sicherzustellen, dass die Befehle wirklich nacheinander abgearbeitet werden und abgebrochen wird, wenn ein Befehl fehlschlägt, kann man diese auch mittels && verknüpfen.

Code:
system("befehl1 && befehl2");

Im Prinzip ruft ja system() nur eine Shell auf, in deren Kontext dann die Befehle abgearbeitet werden. Somit kann innerhalb von System alles verwendet werden, was man auch von der Kommandozeile der Shell kennt.
 
Klar, aber das gleiche Ergebnis sollte auch der ppm liefern, oder?
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

Hi @ all,

ich habe jetzt beides versucht. Semikolon als Befehlstrenner und &&. Beides hat nicht funktioniert.
$ENV hat auch nicht gezogen. Die Variable wird zwar gesetzt, aber bei system zieht sie nicht.

Gruss
Tommy
 
Zuletzt bearbeitet:
$ENV hat auch nicht gezogen. Die Variable wird zwar gesetzt, aber bei system zieht sie nicht.

You are mistaken:
Code:
               The hash %ENV contains your current environment.  Setting a
               value in "ENV" changes the environment for any child processes
               you subsequently fork() off.

Beides hat nicht funktioniert.
Ja, diese Fehlermeldung ist ziemlich häufig.


Klar, aber das gleiche Ergebnis sollte auch der ppm liefern, oder?
Kannst du Gründe dafür angeben warum dies der Fall sein sollte außer "Darum."?

Btw, wenn du activeperl unter windows benutzt solltest du das angeben, weil system() wie gesagt bei Auffinden von shell-Metazeichen im Argument eine shell forkt.

Ansonsten würde ich dir einfach dazu raten die cvs-Aufrufe in einem shell-Skript auszuführen und nur die Textverarbeitung mittels perl zu machen.
 
Weil ich einfach erwarte, dass der Suchstring gleich funktioniert. Aber egal, sei es wie es ist. Ich habe deinen Rat befolgt und mache das ganze nun mit nem Shellscript und Parameterübergabe.
Hat auch genau einmal funktioniert, seitdem zickt das blöde CVS rum und meldet mir ständig, es hätte PANIC.
cvs checkout: in directory .:
cvs [checkout aborted]: *PANIC* administration files missing

So langsam werde ich hier gaga. In meiner Firma wird glaube ich alles das eingesetzt, was bei dreckstools.de ganz vorn steht oder total veraltet ist. X( ?(

Gruss
Tommy
 
*PANIC* administration files missing
This typically means that there is a directory named CVS but it does not contain the administrative files which CVS puts in a ‘CVS’ directory. If the problem is that you created a ‘CVS’ directory via some mechanism other than CVS, then the answer is simple, use a name other than CVS. If not, it indicates a CVS bug (see section K Dealing with bugs in CVS or this manual).
von hier.

Damit solltest du wissen, was du checken musst.
 

Ähnliche Themen

Problem mit Apache2 + MySQL Server

probleme mit amavis und perl

Zurück
Oben