Schrift
[thread]12743[/thread]

frage zu verwendung des "system" befehls

Leser: 2


<< >> 6 Einträge, 1 Seite
lordy2008
 2008-11-10 17:09
#116165 #116165
User since
2008-11-10
3 Artikel
BenutzerIn
[default_avatar]
hi

ich verwende automatisiert mittels perl ein binary, das kommandline orientiert weitere eingaben zur laufzeit benötigt in der form:

Code (perl): (dl )
1
2
$cmd = "g_rms -f " . $f1 ." -s " . $f2 . " << Ende\n 1 << 1 << Ende";
system $cmd;


also es wird 2 mal "1" eingegeben (in $f1 und $f2 stehen filenamen drinnen). das funktioniert auch wunderbar. zum problem wirds nur bei anderem befehl:

Code (perl): (dl )
1
2
$cmd = "make_ndx -f " . $f1 . " << Ende\n r ".$alpha1HelixStart. "-" .$alpha1HelixEnd. " << r " . $alpha2HelixStart . "-" . $alpha2HelixEnd." << q << Ende";
system $cmd;


wobei in $alpha1HelixStart, $alpha1HelixEnd und 2 jeweils zahlen drinnen stehen
das problem liegt darin, dass das programm make_ndx immer wieder eingaben verlangt obwohl es die eigentlich bekommen hat. wenn ich kommand ausgeben lasse schauts so aus:

[unix]
make_ndx -f singleFrameNr0System1.pdb << Ende r 47-78 << r 230-263 << q << Ende
[/unix]

ich denke das problem liegt an den abständen zwischen "r" und 47-78. aber ich weiß nicht recht wie ich es lösen soll, anführungszeichen helfen nicht (weder einfache noch doppelte) ... wenn ich das ganze langsam per hand auf command line eingebe dann geht es. aber die automatisierung mittels perl haut nicht hin im zweiten fall.

kann mir da wer helfen?


lg
lordy
topeg
 2008-11-10 18:21
#116169 #116169
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
lordy2008+2008-11-10 16:09:04--
Code (perl): (dl )
1
2
$cmd = "g_rms -f " . $f1 ." -s " . $f2 . " << Ende\n 1 << 1 << Ende";
system $cmd;

Das sieht für mich recht merkwürdig aus. Ich glaube nicht, dass das korrekt ausgeführt wird.
Ich habe mal Testweise das gemacht:
Code (perl): (dl )
system("cat <<ENDE - \n1 << 1 << ENDE")

und dabei kam raus:
Code: (dl )
1 << 1 << ENDE

Als ich aber schrieb:
Code (perl): (dl )
system("cat <<ENDE - \n1\n1\nENDE")

kam raus:
Code: (dl )
1
2
1
1

Was für eine Shell nutzt du (ich habe hier die bash)?
Also ich würde das so schreiben:
Code (perl): (dl )
1
2
$cmd = "g_rms -f $f1 -s $f2 << Ende\n1\n1\nEnde";
system $cmd ==0 or die "Fehler ($?)\n";


lordy2008+2008-11-10 16:09:04--
Code (perl): (dl )
1
2
$cmd = "make_ndx -f " . $f1 . " << Ende\n r ".$alpha1HelixStart. "-" .$alpha1HelixEnd. " << r " . $alpha2HelixStart . "-" . $alpha2HelixEnd." << q << Ende";
system $cmd;

Ich würde das so schreiben:
Code (perl): (dl )
1
2
3
4
5
6
$cmd = "make_ndx -f $f1 << Ende\n".
       "r ${alpha1HelixStart}-${alpha1HelixEnd}\n".
       "r ${alpha2HelixStart}-${alpha2HelixEnd}\n".
       "q\n".
       "Ende";
system $cmd ==0 or die "Fehler ($?)\n";



Alternativ könntest du auch so vorgehen:
Code (perl): (dl )
1
2
3
4
5
open(my $cmd, "| make_ndx -f $f1") or die "Fehler: $!";
print $cmd "r ${alpha1HelixStart}-${alpha1HelixEnd}\n";
print $cmd "r ${alpha2HelixStart}-${alpha2HelixEnd}\n";
print $cmd "q\n";
close($cmd) or die "Fehler: $!\n";
lordy2008
 2008-11-11 13:17
#116184 #116184
User since
2008-11-10
3 Artikel
BenutzerIn
[default_avatar]
danke, mit

Code (perl): (dl )
1
2
3
4
5
$cmd = "make_ndx -f $f1 << Ende\n".
        "r ${alpha1HelixStart}-${alpha1HelixEnd}\n".
        "r ${alpha2HelixStart}-${alpha2HelixEnd}\n".
        "q\n".
        "Ende";


gehts super, nur

Code (perl): (dl )
system $cmd ==0 or die "Fehler ($?)\n";


haut nicht hin

Code (perl): (dl )
1
2
3
4
#!/usr/bin/perl -w
use strict;
my $cmd = "pwd";
system $cmd == 0 or die "error ($?)\n";


führt zu

Code: (dl )
1
2
Argument "pwd" isn't numeric in numeric eq (==) at ./test.pl line 7.
Can't exec "1": Datei oder Verzeichnis nicht gefunden at ./test.pl line 7.


wenn ich auf

Code (perl): (dl )
1
2
3
4
#!/usr/bin/perl -w
use strict;
my $cmd = "pwd";
(system $cmd) == 0 or die "error ($?)\n";


ändere dann gehts. haut das bei dir ohne den klammern hin? bzw mit klammern schaut der ganze ausdruck etwas komisch aus ;-)

lg
lordy
renee
 2008-11-11 13:28
#116186 #116186
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
mach system($cmd) == 0 or die .... Das ganze hat mit "Prioritäten" zu tun. Wenn Du system $cmd == 0 schreibst, dann hat $cmd == 0 eine höhere "Priorität" als der system-Aufruf. Das ist wie mit dem "Punkt- vor Strichrechnung"...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
betterworld
 2008-11-12 01:51
#116200 #116200
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Für weiterführende Informationen kann ich auch http://faq.perl-community.de/bin/view/Wissensbasis... empfehlen.
lordy2008
 2008-11-12 15:51
#116212 #116212
User since
2008-11-10
3 Artikel
BenutzerIn
[default_avatar]
danke!
<< >> 6 Einträge, 1 Seite



View all threads created 2008-11-10 17:09.