Perl cannot normally control other applications' terminals, so you'll have your application to fork, then run the child process under xterm, then use Expect module to pass the "vst" command to the "TBTerm" program. Read perlop about quoting operators if you don't know how to quote your command properly.
Use something like this to run your application under xterm:
unless (-t STDIN) { # check whether STDIN is a terminal
exec (qw/xterm -e/,$0); # assuming that your perl file is executab
+le
}
Do you really need to spawn another xterm? If not, you can simplify your application and avoid coping with returning text data from forked child process (read pipe, by the way), since Expect creates a virtual terminal (not visible as a graphical window, though) to run your application into.
| [reply] [Watch: Dir/Any] [d/l] |
yes,I really want to spawn a xterm, because the TBterm cmd will pop up a xterm window with special setting.
I think there are two things hard to realize:
the first: how to open a process of "TBterm" backgroundly, because if it pop up window explicitly, it can't run the "vst" automaticly by script.
the sencond: how to run the "vst" cmd in the background process "TBterm".(you can recognize "vst" as common cmd,like "ls")
I have try follow module: use Proc::Daemon, Proc::Background; Expect, but all failed. now I don't know if my demand can be realized by pipe.
| [reply] [Watch: Dir/Any] |
I couldn't find any information on that "TBterm" application, so I'll have to ask more questions.
I really want to spawn a xterm, because the TBterm cmd will pop up a xterm window with special setting.
What kind of special settings are specified in xterm spawned by TBterm? Does it spawn an xterm when run in another terminal?
how to open a process of "TBterm" backgroundly
So, you need to run TBterm in background (with no visible terminal), or not in background, but in an xterm?
I'll try to solve the problem as I understand it now, using sh as an interactive application and "ls" as a command:
#!/usr/bin/perl
use warnings;
use strict;
use Expect;
print("STDIN is not a terminal, running xterm\n"), exec ('xterm', '-e'
+, $^X, $0, @ARGV) unless -t STDIN;
print "Surely running in a terminal\n";
my $expect = Expect::->spawn("/bin/sh") or die "bash: $!\n";
$expect->expect(1,"\$ "); # expect a command line prompt
$expect->send("ls\n");
$expect->expect(1,"ls\r\n"); # sh echoes the entered command, so I hav
+e to expect() it back
# need to play with $expect->slave->stty() to get rid of \r
$expect->expect(1,"\$ "); # expect another command line prompt meaning
+ that the command succeeded
my $result = $expect->before(); # catch everything in between the echo
+ed "ls" and new prompt
$expect->send("exit\n"); # terminate the shell properly
$expect->soft_close;
print "Gathered output: BEGIN\n$result\nEND\n";
| [reply] [Watch: Dir/Any] [d/l] |