0

我很难做到这一点。我的脚本将消息打印到 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

4 回答 4

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的重定向支持远比 ofsh及其派生类更有限,但这是它可以做的事情。

于 2012-09-25T17:17:54.557 回答
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

于 2012-09-25T17:29:38.170 回答
2

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

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

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

script.pl ... >& myscript.log
于 2012-09-25T17:31:33.130 回答
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

于 2012-09-25T17:16:04.083 回答