代码之家  ›  专栏  ›  技术社区  ›  JDS

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

  •  0
  • JDS  · 技术社区  · 12 年前

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

    以下是我尝试过的:

    $location/myscript.pl -arg1 $var1 -arg2 $var2 -verbose 1 &>myscript.log
    

    所以我的脚本有一些需要设置的参数,然后我尝试 &>myscript日志 以创建此日志文件并重定向到那里。然而,我得到了“无效的null命令”,当我按下键盘时,它显示我尝试执行的命令为:

    $location/myscript.pl -arg1 $var1 -arg2 $var2 -verbose 1 & > myscript.log
    

    我觉得我的语法有问题。

    谢谢

    4 回复  |  直到 12 年前
        1
  •  2
  •   ikegami    12 年前
    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 及其衍生物,但这是它可以做到的。

        2
  •  2
  •   capfan    12 年前

    这段代码没有遵循您的方法,但它也可能对您有用。您可以通过脚本中的一个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的积分

        3
  •  2
  •   Galimov Albert    12 年前

    如所述 池上 , 猛击 解决方案是:

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

    在我的FreeBSD盒子上 csh公司 解决方案是:

    script.pl ... >& myscript.log
    
        4
  •  1
  •   asf107    12 年前

    试试这个:

    $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