【问题标题】:Perl script redirect stderr and stdout to a filePerl 脚本将 stderr 和 stdout 重定向到文件
【发布时间】:2012-09-25 17:14:17
【问题描述】:

我在执行此操作时遇到了麻烦。我的脚本将消息打印到 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

我认为我的语法有误。

谢谢。

【问题讨论】:

    标签: perl unix stdout csh


    【解决方案1】:
    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 及其衍生产品的支持有限,但这是它可以做的事情。

    【讨论】:

    • 我仍然得到“无效的空命令”,在我的最后一个参数(“-verbose 1”)之后复制并粘贴“myscript.log 2&>1”。我按下键盘,它用空格分隔“>”和“&”字符,我不知道为什么..我的环境有问题吗?
    • 错字!固定的。 (我在评论中正确,但在实际命令中输入错误。)
    • 好的,谢谢。我现在得到“模棱两可的输出重定向”,我有一种感觉是关于 -verbose 1 最后,就像它需要 1 > myscript.log 2>&1
    • 我的研究表明这是 csh/tcsh 错误,但您要求 bash 解决方案。你用的是什么外壳?
    • 枪,想想这里在工作中他们都使用csh。不应该放 bash。有机会知道修复吗? =)
    【解决方案2】:

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

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

    【讨论】:

    • 在 linux 下不起作用:名称“main::STDOUT_AND_ERR_LOG”仅使用一次:可能在 ....
    • 您实际上必须编写第二条评论中提到的命令。请将*STDERR = *STDOUT = *STDOUT_AND_ERR_LOG; 添加到您的脚本中以使其正常工作。
    【解决方案3】:

    正如ikegami所说,bash解决方案是:

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

    在我的带有 csh 解决方案的 FreeBSD 机器上是:

    script.pl ... >& myscript.log
    

    【讨论】:

      【解决方案4】:

      试试这个:

      $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

      【讨论】:

      • 等一下,澄清一下,“1”是 -verbose 选项的参数(打开它)
      • 在通话结束时添加 "> myscript.log 2>&1" 时出现“模糊的输出重定向”
      • 用括号括起来试试,( ... ) ?
      • 如果你把 1 放在引号里,例如-verbose "1" > myscript.log 2>&1
      猜你喜欢
      • 2014-07-22
      • 2011-03-02
      • 1970-01-01
      • 2021-09-08
      • 2016-03-29
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      相关资源
      最近更新 更多