Actually, I do use windows and do know a little about what's going on.
The difference is that on *nix, you're creating a process tree like this:
yourshell
perl bugSTDOUT.pl
perl bugSTDOUTb.pl
perl bugSTDOUTc.pl
Under windows it looks like this:
cmd.exe
perl bugSTDOUT.pl *
cmd.exe *
perl bugSTDOUTb.pl *
cmd.exe
perl bugSTDOUTc.pl
I could go on to mention the pipe instance that is shared between the three marked processes; and the need to explicitly set a flag on a CreateProcess call to cause spawned process to inherit handles from its parent, but you likely wouldn't be interested.
If you more exactly emulate the *nix handling of the situation, by suppressing the creation of those intermediary shell processes with their associated virtual consoles, thus:
C:\test>type bug*
bugSTDOUT.pl
#!/usr/bin/perl
print STDOUT "Running bugSTDOUTb.pl with backticks\n";
print STDOUT "stdout from bugSTDOUTb.pl=" . `$^X bugSTDOUTb.pl` . "\n"
+;
bugSTDOUTb.pl
#!/usr/bin/perl
print STDOUT "Running bugSTDOUTc.pl with system()\n";
system( $^X, 'bugSTDOUTc.pl' );
print STDOUT "$0 done\n";
bugSTDOUTc.pl
#!/usr/bin/perl
print STDOUT "Hello world!\n";
You get the behaviour you are seeking:
C:\test>bugSTDOUT.pl
Running bugSTDOUTb.pl with backticks
stdout from bugSTDOUTb.pl=Running bugSTDOUTc.pl with system()
Hello world!
bugSTDOUTb.pl done
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
|