Problem utføre TCL skript fra Bourne Shell (omdirigering trøbbel)

stemmer
2

Jeg jobber med VMD (en molekylær dynamikk visualisering pakken) og jeg ønsker å åpne VMD fra et Perl-skript, kjøre en Tcl script, skrive utgang til en loggfil, så nær VMD og gå tilbake til Perl-skript. Den ordinære syntaks å gjøre dette er:

system(vmd -dispdev text -eofexit < program.tcl > LOG);

som fordeler seg slik, så godt som jeg forstår:

  • system();: Utfører Bourne Shell kommandoer som finnes i anførselstegn
  • vmd: Kaller VMD
  • -dispdev text: Åpner VMD i tekstmodus
  • -eofexit: Opphører VMD når EOF på STDIN er nådd
  • < prog.tcl: Angir prog.tclsom STDIN; VMD vil opphøre når prog.tclfullført
  • > LOG: Skriver STOUT til fil <LOG>

Nå dette ville fungere perfekt, bortsett fra at min Tcl script tar argumenter. Det jeg liker å gjøre er noe sånt som:

system(vmd -dispdev text -eofexit < program.tcl string1 string2 > LOG);

Men i dette tilfellet skallet prøver å lese streng1 og streng2 som filer. Med min begrensede forståelse av omdirigering, jeg er ikke sikker på nøyaktig hva som skjer i den første linjen, hva går galt i den andre, eller hva en god løsning ville være. Eventuelle hjelpe ville være verdsatt.

Publisert på 28/07/2009 klokken 04:37
kilden bruker
På andre språk...                            


3 svar

stemmer
1

Beklager, tror ikke du kan sende argumenter til Tcl script direkte når det blir utført i et annet program som VMD. Jeg foreslår passerer parametere via en fil som en midlertidig løsning. Eg. I Perl-skript, før du ringer VMD, skriver parameterne til en fil i Tcl syntaks:

open PARAMS, '>myparams.tcl';
print PARAMS "set arg1 $string1; set arg2 $string2";
close PARAMS;

Så i begynnelsen av program.tcl, i stedet for å bruke kommandolinje argumenter ($ argv), har den lese parameterfilen for å plukke opp de argumentverdier:

source myparams.tcl
Svarte 28/07/2009 kl. 09:22
kilden bruker

stemmer
0

Hva du gjør er å sende innholdet i program.tcl filen til VMD, ikke produksjonen av gjennomføring av programmet. Hvis jeg forstår deg, ønsker du å koble Tcl program til VMD med et rør:

system("program.tcl arg1 arg2 | vmd -... > output.file");

Redigere:

Så hvis VMD leser Tcl koden på stdin, kan du likevel sende parametre uten å bruke en midlertidig fil:

system("( echo 'set arg1 str1; set arg2 str2'; cat program.tcl; ) | vmd ... > output_file");

eller

open my $fh, '<', 'program.tcl';
my @tcl = <$fh>;
close $fh;
unshift @tcl, "set arg1 str1\n", "set arg2 str2\n";
open $fh, '|-', 'vmd ... > output.file' or die 'msg...';
print $fh join('', @tcl);
close $fh or die 'msg...';
Svarte 28/07/2009 kl. 14:02
kilden bruker

stemmer
0

Du kan sende argumentene direkte til VMD ved å gjøre noe sånt

system(vmd -dispdev text -e program.tcl -args string1 string2 > LOG);

Sørg for å legge til en quituttalelse på slutten av program.tcl.

Svarte 13/12/2010 kl. 21:15
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more