Why doesn't my stderr redirection end after command finishes? And how do I fix it?

前端 未结 3 1118
后悔当初
后悔当初 2020-12-01 02:50

In Windows, either in command line or a batch file, the command DIR 2>NUL: 3>&2 (you can replace DIR with anything, even if isn\'t a file

3条回答
  •  盖世英雄少女心
    2020-12-01 03:50

    I apologize for post this as an answer instead of a comment, but my "comment" is too large...

    In the MS-DOS standard, all running programs have open these Standard Handles: 0-STDIN (keyboard), 1-STDOUT (screen), 2-STDERR (screen), 3-STDAUX (serial port) and 4-STDPRN (printer). Although Windows documentation clearly indicate that handles 3-9 are undefined, handle 3 have a special treatment by CMD.EXE. I have three reasons to think this:

    1- Handle 3 is connected to CON: device (keyboard for input, screen for output); handles 4-9 does not:

    C>ver
    
    Microsoft Windows XP [Version 5.1.2600]
    
    C>echo To handle 3 >&3
    To handle 3
    
    C>echo To handle 4 >&4
    The handle could not be duplicated
    during redirection of handle 1.
    
    C>set /P var=From handle 3: <&3
    From handle 3: Value entered in keyboard
    
    C>echo %var%
    Value entered in keyboard
    
    C>set /P var=From handle 4: <&4
    The handle could not be duplicated
    during redirection of handle 0.
    

    2- The strange behavior of handle 3 stated in the present topic, that was solved in two differents ways. I discovered that if handles 0, 1 or 2 are redirected with handle 3 (and possibly handles 4-9), the redirection of handles 0, 1 or 2 becomes "permanent"; this behaviour doesn't happens if the handle 0, 1 or 2 are the last handle(s) in the list of redirections that include handle 3. This problem is entirely avoided if handles 0, 1 or 2 are redirected with handles 4-9 in any order, but not handle 3.

    3- The results obtained with my TypeOfHandle.com program. This program is a pure MS-DOS executable file that check the handle given in its parameter and return via errorlevel a value of 3 if the handle is connected to the CONsole device, or a value of 128 if the handle is redirected to a disk file. These are the results:

    C>typeofhandle 0
    
    C>echo %errorlevel%
    3
    
    C>typeofhandle 0 < anyFile.txt
    
    C>echo %errorlevel%
    128
    
    C>typeofhandle 1
    
    C>echo %errorlevel%
    3
    
    C>typeofhandle 1 > anyFile.txt
    
    C>echo %errorlevel%
    128
    
    C>typeofhandle 3
    
    C>echo %errorlevel%
    0
    
    C>typeofhandle 3 <&3 anyFile.txt
    
    C>echo %errorlevel%
    0
    
    C>typeofhandle 3 >&3 anyFile.txt
    
    C>echo %errorlevel%
    0
    

    Handles 3-9 behaves strange in other aspect:

    The results obtained with my SetFilePointer.com program. Although handles 3-9 may be used in a Batch file to achieve input/output from/to several files at once, such mechanism only allows sequential access because my SetFilePointer program can't move the File Pointer of handles 3-9. SetFilePointer program correctly works on handles 0, 1 and 2; this feature allows to write a complete Relational Database application in Batch. This topic is described in detail at this post

提交回复
热议问题