Re: System call doesn't recognise '>'
by Bloodnok (Vicar) on Dec 10, 2008 at 12:50 UTC
|
| [reply] [d/l] [select] |
|
|
Indeed, I used 'system LIST'
I already tried to add all arguments as one, and even tried to add as an array:
@array = ($command, "$arg1 $arg2 > outfile")
system(@array) Or also:
@array=($command, $arg1, $arg2, "> outfile") Or also:
@array=("$command $arg1 $arg2 > outfile")
In the last case it didn't even recognise $command, and in the previous cases it tried to open '>' as a possible argument (=backgroundfile)
| [reply] |
|
|
What happens if you make the call read: system("$command $arg1 $arg2 > outfile") ?
Note that, on Windoze, the arguments for system are the same as for exec. However, exec isn't, or wasn't, fully supported on Windoze, I think you might have to use the single string form of the call, so in your case, something along the lines of...
my @array = qq/$command $arg1 $arg2 > outfile/;
system "@array"; # Use perl to stringify the command argument list
Just a thought...
A user level that continues to overstate my experience :-))
| [reply] [d/l] [select] |
|
|
|
|
|
Re: System call doesn't recognise '>'
by ikegami (Patriarch) on Dec 10, 2008 at 17:09 UTC
|
system LIST doesn't use the shell. > is a shell command. If you wanted to use execute a shell command using system, you'd have to do
system('sh', '-c', 'foo > file');
or the equialent
system('foo > file');
The latter is also suitable for Windows.
| [reply] [d/l] [select] |
|
|
my @array = ($command, $arg1, $arg2, $arg3);
system ('@array > $outfile');
Results in:
Can't spawn "cmd.exe": No such file or directory at D:\advanced_programming\test_syscall.pl line 11. | [reply] [d/l] [select] |
|
|
system ('@array > $outfile');
That line doesn't do what you think it does. Single quotes don't interpolate. You want to use double quotes and you want to check the return code of system():
system( "@array > $outfile" ) == 0
or die "Couldn't launch [@array > $outfile]: $!/$?";
| [reply] [d/l] [select] |
|
|
|
|
|
|
|
I'd be surprised if there was a file named @array...
| [reply] [d/l] |
Re: System call doesn't recognise '>'
by almut (Canon) on Dec 10, 2008 at 16:48 UTC
|
system "$ENV{COMSPEC} /C $command $arg1 $arg2 $arg3 > $outfile";
Update: Presumably, the directory in which cmd.exe resides (typically C:\WINDOWS\system32) isn't on your PATH.
In case of doubt, you might want to print out those variables' content:
set path
set comspec
(COMSPEC is not guaranteed to hold the correct path to your command shell — after all, it's just an environment variable. By default, it should, however. At least, it's worth a try. (Perl doesn't use COMSPEC for this very reason of being unreliable.) In case it doesn't hold the correct path, you could also try directly specifying system = "c:\\windows\\system32\\cmd.exe /c ...", after having verified that it in fact exists...)
Update2: Then again, it might also be some variation
of this weird issue... (not sure though).
| [reply] [d/l] [select] |
|
|
use Env qw(@PATH);
#print "@PATH\n";
unshift @PATH, "C:\\windows\\system32\\cmd.exe";
#print @PATH;
system "C:\\windows\\system32\\cmd.exe /C @array > $outfile";
shift @PATH;
The path to the command shell was added, but the result was still: Can't spawn "cmd.exe": No such file or directory at D:\advanced_programming\test_syscall.pl line 26. Or isn't it that what you suggested? | [reply] [d/l] [select] |
|
|
unshift @PATH, "C:\\windows\\system32\\cmd.exe";
That's not how the PATH environment variable works, neither in Windows nor in Unix. The PATH environment variable contains directories not executable files. Try
unshift @PATH, "C:\\windows\\system32";
instead, and consider not running a weirdly configured environment. Many Windows programs will fail if %WINDIR%\system32 is not in the path. | [reply] [d/l] [select] |
|
|
|
|
|
|
Something else to try: Perl (Windows only) provides for this
rarely used facility to set a custom command shell via the environment
variable PERL5SHELL. In other words, on the command line that you're
going to call your Perl program from, set that variable (prior to
calling the program):
set PERL5SHELL=c:\\windows\\system32\\cmd.exe /c
(yes, with doubled backslashes)
And maybe try something trivial first, e.g.
#!perl
system "echo foo >dummy";
In theory, you should then find a file "dummy" with the content
"foo". In case that works, try your real command...
| [reply] [d/l] [select] |