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

时间:2012-09-25 17:14:18

标签: perl unix stdout csh

我在做这件事时遇到了麻烦。我的脚本将消息打印到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

我认为我的语法是错误的。

感谢。

4 个答案:

答案 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