Perl脚本将stderr和stdout重定向到一个文件

Perl脚本将stderr和stdout重定向到一个文件,perl,unix,stdout,csh,Perl,Unix,Stdout,Csh,我做这件事有困难。我的脚本将消息打印到stout和stderr,我希望它们都被定向到一个文件中,我可以在以后的空闲时间查看 以下是我尝试过的: $location/myscript.pl -arg1 $var1 -arg2 $var2 -verbose 1 &>myscript.log 所以我的脚本有一些参数需要设置,然后我尝试&>myscript.log创建这个日志文件并重定向到那里。但是,我得到无效的null命令,当我按键盘上的up键时,它会显示我尝试执行的命令,如下所示:

我做这件事有困难。我的脚本将消息打印到stout和stderr,我希望它们都被定向到一个文件中,我可以在以后的空闲时间查看

以下是我尝试过的:

$location/myscript.pl -arg1 $var1 -arg2 $var2 -verbose 1 &>myscript.log
所以我的脚本有一些参数需要设置,然后我尝试&>myscript.log创建这个日志文件并重定向到那里。但是,我得到无效的null命令,当我按键盘上的up键时,它会显示我尝试执行的命令,如下所示:

$location/myscript.pl -arg1 $var1 -arg2 $var2 -verbose 1 & > myscript.log
我觉得我的语法错了什么的

谢谢。

试试这个:

$location/myscript.pl-arg1$var1-arg2$var2-verbose1>myscript.stdout 2>myscript.stderr

这将把输出和错误重定向到两个单独的文件。要在同一文件中执行,这意味着重定向stderr并将其附加到stdout:

$location/myscript.pl-arg1$var1-arg2$var2-verbose 1>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及其衍生产品的重定向支持有限,但这是它可以做到的。

此代码不遵循您的方法,但它也可能对您有用。您可以通过脚本中的一个绘图来启用它

#===
# 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

正如ikegami所提到的,bash解决方案是:

script.pl ... >myscript.log 2>&1
script.pl ... >& myscript.log
在我的带csh的FreeBSD盒上,解决方案是:

script.pl ... >myscript.log 2>&1
script.pl ... >& myscript.log

请稍等,澄清一下,1是-verbose选项的参数,用于在添加>myscript.log 2>时将其转换为不明确的输出重定向(&1),然后在我的调用结束时使用括号重试?如果在引号中加上1,例如-verbose 1>myscript.log 2>&1,我仍然会得到无效的null命令,在我的最后一个参数-verbose 1之后复制并粘贴myscript.log 2&>1。我按键盘上的键,它用空格分隔>和&字符,我不知道为什么。。我的环境有问题吗?打字错误!固定的我在评论中写对了,但在实际命令中输入错误。好的,谢谢。我现在得到的是含糊不清的输出重定向,我有一种感觉——最后是详细的1,就像它取了1>myscript.log 2>&1我的研究说这是csh/tcsh错误,但你要求一个bash解决方案。你用的是什么外壳?天哪,想想看,在工作中他们都用csh。我不该放鞭子。你知道怎么解决吗=在linux下不起作用:Name main::STDOUT_和_ERR_LOG只使用一次:可能的输入错误在…您实际上必须编写第二条注释中提到的命令。请添加*STDERR=*STDOUT=*STDOUT\u和\u ERR\u日志;修改脚本以使其工作。