avishaisch has asked for the wisdom of the Perl Monks concerning the following question:

I run a Perl program that runs a DOS program (by a system command). The perl program and the DOS program write to the same log file. I used the IO-Tee-0.64 to direct the output of the perl program also to the screen but still have problems with the DOS program:
1. If I use a tee DOS utility by executing  C:\\IA71_Enterprise\\build.exe $ProjFile 2>&1 | $TeeDOS $buildLog /a I will get the tee program return code and not the the build.exe program - how do I get the correct RC?
2. The tee utility in DOS (which I downloaded from the net) can't redirect the STDERR output to a file. How can I do it?

Replies are listed 'Best First'.
Re: Tee of STDERR
by cdarke (Prior) on Dec 30, 2008 at 10:34 UTC
    Your first question is not really Perl related, it is an issue with the shell (cmd.exe) you are using. For example, Bash has an array of pipe return codes, however this is quite difficult in shells like csh and ksh. I don't think you can do it in cmd.exe.
    However, there is an alternative using Perl. Run your build.exe in a pipe:
    open(my $fh, "C:\\IA71_Enterprise\\build.exe $ProjFile 2>&1 |") or die + "$!"
    and do the tee yourself in Perl, you can get the return code from $?.

    The tee utility in DOS can't redirect the STDERR output to a file
    You answered this question yourself in your system command. Redirect stderr (Windows file handle 2) to stdout (Windows file handle 1) before the tee using 2>&1.

    By the way, this might be being pedantic, but I doubt you are actually running a DOS program. PC or MS-DOS was 16-bit, you are probably running a 32-bit console program - at least, I hope you are!
Re: Tee of STDERR
by Bloodnok (Vicar) on Dec 30, 2008 at 12:12 UTC
    The system return code ($?) is, with few exceptions, the status code returned by the last command executed on the command line - in this case, this is the tee command. Thus, since it [the command] is a pipe, the RC from the first command on the CLI is unobtainable using the command in the form shown because the first command completes moments prior to the tee command. to address your questions...
    1. You give no clues as to the C:\\IA71_Enterprise\\build.exe, but assuming a similarity to make(1), you could introduce a dummy target (as the last dependency of the all target) to create a tmp file iff the build completed succesfully. Alternatively, you could parse $buildLog (using perl of course:-) for error condition strings or... You could utilise the suggestions of one of the other respondants.
    2. As far as redirecting STDERR is concerned, I didn't think DOS recognised either STDERR or filehandle 2 ... so, once again, I would refer you to earlier posts regarding the use of perl to do the job properly.
    A user level that continues to overstate my experience :-))
      I didn't think DOS recognised either STDERR or filehandle 2

      If the OP is using real DOS then you are correct, but if cmd.exe is being used (more likely) then the syntax is similar to the Bourne, Bash, and Korn shells. Windows console processes use the first three file handles (0, 1, 2) in the same way as UNIX processes use the first three file descriptors.
Re: Tee of STDERR
by Anonymous Monk on Dec 30, 2008 at 09:43 UTC
    redirect stderr to a file and tee that file?