在Unix shell脚本中,可以从内部脚本本身重定向stderr和stdout,如下所示:
#!/bin/ksh
# script_name: test.sh
export AUTO_LOGFILE=`basename $0 .sh`.log
# stdout and stderr Redirection. This will save the old stdout on FD 3, and the old stderr on FD 4.
exec 3>&0 4>&1 >>$AUTO_LOGFILE 2>&1
echo "Hello World"
# The above echo will be printed to test.log
实际上,test.sh可以简单地执行:
test.sh
而不是:
test.sh >> test.log 2>&1
我正在尝试在批处理脚本中执行类似操作。我的批处理代码如下:
@echo off & setlocal enableextensions enabledelayedexpansion
REM script_name=test.bat
set AUTO_LOGFILE=%~n0.log
REM How to do the stdout and stderr redirection from within the script itself here?
如何从批处理脚本本身重定向stderr和stdout?我更感兴趣的是将这个unix shell脚本语句转换为等效的批处理代码:
exec 3>&0 4>&1 >>$AUTO_LOGFILE 2>&1
答案 0 :(得分:5)
下面的 test.bat 批处理文件与您的Unix脚本功能相同,也就是说,它将所有标准输出发送到日志文件并将错误输出到屏幕:
@echo off
if defined reEntry goto reEntry
set reEntry=TRUE
set AUTO_LOGFILE=%~N0.log
rem stdout Redirection. Leave stderr as is.
"%~F0" %* >>%AUTO_LOGFILE%
:reEntry
set reEntry=
echo "Hello World"
rem The above echo will be printed to test.log
rem and error messages will be printed to the screen:
verify badparam
的 Adenddeum:强> 的
我认为OP希望从stderr中分离 stdout以查看屏幕中的错误消息,但也许我误解了他。要将stdout和stderr发送到文件,请使用下面的行作为dbenham在他的评论中注明:
"%~F0" %* >>%AUTO_LOGFILE% 2>&1
或者以上面评论中已经提到的更简单的方式:
@echo off
set AUTO_LOGFILE=%~N0.log
rem stdout and stderr Redirection.
call :Main %* >>%AUTO_LOGFILE% 2>&1
goto :EOF
:Main
echo "Hello World"
rem The above echo will be printed to test.log
但是,如果目的是从正常输出 distingish 错误消息,那么可以通过此技巧在同一屏幕中完成:
"%~F0" %* 2>&1 1>&3 | findstr /N /A:4E "^"
这样,错误消息前面会出现红色背景上黄色的行号。这种方法可以直接用于几种情况;例如,在任何编程语言源程序的编译中:
anycompiler %1 2>&1 1>&3 | findstr /N /A:4E "^"
答案 1 :(得分:1)
将这些行括在括号中
(
REM How to do the stdout redirection from within the script itself here?
ECHO is this redirected?
ECHO yes it is
) >out.txt