8

在 perl 的脚本中,我有以下内容:

print STDERR "Access error"

我想知道这条消息的打印位置,但我不知道如何在 LInux 中看到标准错误输出。

4

4 回答 4

15

标准 ( STDOUT) 和错误输出 ( STDERR) 都显示在您的(伪)终端上。

如果要跟踪输出:

错误日志:

./script.pl 2> err.log

标准输出日志:

./script.pl > out.log

两者都STDERRSTDOUT同一个文件中:

./script.pl > out.log 2>&1

或使用

./script.pl &> out.log

一个很好的教程

于 2013-03-11T17:16:38.647 回答
10

它会打印到为您的环境设置标准错误的任何位置。

如果你从控制台运行它,那么它将与标准输出混合并显示在控制台上(如果你重定向 STDOUT,它不会被重定向,你必须单独重定向它)。

如果您在 Apache 下从 CGI 运行它,那么它将被放入您的 error.log 文件中(无论 Apache 配置为保存该文件的位置)。

如果您从其他地方运行它……那么详尽的列表超出了 Stackoverflow 的范围,因此您应该尝试提出更具体的问题;)

它可能在控制台上被定向到的示例:

david@raston err $ cat err.pl
#!/usr/bin/env perl

use strict;
use warnings;
use v5.16;

say "out";
say STDERR "error";
~/tmp/err :
david@raston err $ ./err.pl
out
error
~/tmp/err :
david@raston err $ ./err.pl > stdout
error
~/tmp/err :
david@raston err $ ./err.pl 2> stderr
out
于 2013-03-11T17:18:09.133 回答
3

通常,STDOUT 和 STDERR 都输出到您的终端。

$ perl -e'print "foo\n"; print STDERR "bar\n";'
foo
bar

但是可以重定向其中一个和两个。

$ perl -e'print "foo\n"; print STDERR "bar\n";' 2>stderr.log
foo

$ cat stderr.log
bar

例如,由 CGI 脚本发送到 STDERR 的数据通常以 Web 服务器配置中指定的日志文件结束。

程序可以在 linux 系统上获取有关 STDERR 的信息。

$ perl -e'system "ls -l /proc/$$/fd"' 2>stderr.log |cat
total 0
lrwx------ ... 0 -> /dev/pts/1
l-wx------ ... 1 -> pipe:[210178663]            <-- STDOUT is a pipe
l-wx------ ... 2 -> /home/ikegami/stderr.log    <-- STDERR is a file
lr-x------ ... 3 -> pipe:[210178668]
于 2013-03-11T17:48:56.097 回答
2

您需要在终端中运行 Perl 脚本。根据您的系统上是否有 X,您可以使用xterm或使用虚拟控制台 ( tty1-7) 来运行您的脚本。两者stderrstdout连接到这些设备。

于 2013-03-11T17:16:45.270 回答