我在做这件事时遇到了麻烦。我的脚本将消息打印到stout和stderr,我希望它们都能被定向到我以后可以休闲查看的文件。
以下是我的尝试:
$location/myscript.pl -arg1 $var1 -arg2 $var2 -verbose 1 &>myscript.log
所以我的脚本有一些我需要设置的参数,然后我尝试&> myscript.log 来创建这个日志文件并在那里重定向。但是我得到“无效的空命令”,当我按下键盘时,它显示我尝试执行的命令:
$location/myscript.pl -arg1 $var1 -arg2 $var2 -verbose 1 & > myscript.log
我认为我的语法是错误的。
感谢。
答案 0 :(得分:2)
script.pl ... >myscript.log 2>&1
>myscript.log
打开文件进行编写,并将该句柄用于STDOUT。2>&1
使STDERR与STDOUT具有相同的句柄。订单很重要。
对于csh
,最简单的方法是:
sh -c 'script.pl ... >myscript.log 2>&1'
好的,我只是在开玩笑:)你实际上可以做到
script.pl ... >& file
csh
的重定向支持远比sh
及其衍生产品更受限制,但这是可以做到的。
答案 1 :(得分:2)
此代码并不遵循您的方法,但它也可能对您有用。您可以通过脚本中的一个agruments启用它。
#===
# x.pl
#===
use IO::Handle;
open(STDOUT_AND_ERR_LOG, ">stdout_and_err.log") or die;
# ensure all writes are immediately flushed STDOUT_AND_ERR_LOG->autoflush(1);
# redirect both stdout and err to the log *STDERR = *STDOUT = *STDOUT_AND_ERR_LOG;
# now try it
print "Hello stdout!\n";
print STDERR "Hello stderr!\n";
#=== EOF
致ActiveState.com的信用
答案 2 :(得分:2)
如 ikegami 所述, bash 解决方案是:
script.pl ... >myscript.log 2>&1
在我的FreeBSD框中, csh 解决方案是:
script.pl ... >& myscript.log
答案 3 :(得分:1)
试试这个:
$location/myscript.pl -arg1 $var1 -arg2 $var2 -verbose 1 1>myscript.stdout 2>myscript.stderr
这会将输出和错误重定向到两个单独的文件。要在同一个文件中执行此操作(这意味着重定向stderr并将其附加到stdout):
$location/myscript.pl -arg1 $var1 -arg2 $var2 -verbose 1 > myscript.log 2>&1