===== How To Capture DCL Command Output to a Text File and On-Screen Simultaneously ===== Ever need to both //review some DCL command output on-screen// __and__ //capture it to a file// at the same time? This happens more often than you might guess. For example, you may need to capture some fast-changing VMS state information (like a process in RWAST state), but doing the same command twice-in-a-row may not show the same overall system state (things can change fast). Here's how -- Use a ''tee'' command file. $ ! TEE.COM -- split input from SYS$PIPE to SYS$OUTPUT 'F$VERIFY(0)' $ ! and another output (file) $ ! $ ! Usage: @TEE teefile $ ! $ ! Setup: $ TEE == "@com:tee" (in user's LOGIN.COM file) $ ! $ ! Designed for use in VMS pipes, relies on SYS$PIPE as input-stream: $ ! $ ! $ PIPE show system | TEE sys$scratch:capture.lis | search sys$pipe RWAST $ ! ! captures all SHOW SYSTEM output... $ ! or: $ ! $ PIPE show system | search sys$pipe RWAST | TEE sys$scratch:capture.lis $ ! ! captures only SEARCH output matching the requested state... $ ! $ SET NOON $ OPEN /WRITE /ERROR=Oops teefile 'P1' $Loop: $ READ /END_OF_FILE=Done sys$pipe line $ WRITE sys$output line $ WRITE teefile line $ GOTO Loop $Done: $ CLOSE /NOLOG teefile $ EXIT %X01 !'F$VERIFY(0)' $Oops: $ WRITE sys$error "%TEE-E-OPENERR, cannot open ''P1'" $ EXIT %X2C !'F$VERIFY(0)' $ ! This DCL script is designed to work in a DCL ''PIPE'' command construct, the only context where the temporary logical name ''SYS$PIPE'' exists (this is created/deleted by the ''PIPE'' command itself). The script reads each line (text-data record) from the ''SYS$PIPE'' data-stream (which communicates data from one command to the next command in the pipe chain), and then (re)writes each line out to ''SYS$OUTPUT'' (usually, your terminal screen, but this can be redirected too) and to a file which is named as this script's ''P1'' parameter. Set this up in your own LOGIN.COM file with this command-symbol definition: $ TEE == "@com:tee" You can substitute your own subdirectory logical name for the ''com'' logical name shown above. The two examples in the script show just how easy this is to do -- Note however that the placement of the ''TEE'' command-symbol itself in the pipe chain //does matter// to what is captured into the output file itself. Examples: $ PIPE show system | TEE sys$scratch:capture.lis | search sys$pipe RWAST ...captures all of the SHOW SYSTEM command's output. or: $ PIPE show system | search sys$pipe RWAST | TEE sys$scratch:capture.lis ...captures only SEARCH command's output matching the requested state. Have fun... How many ways or scenarios can you discover where this is useful?