在Perl中有没有办法找到stdout重定向到的文件名?

在Perl中有没有办法找到stdout重定向到的文件名?,perl,Perl,这个问题与为Python编写的问题相同,但再次询问Perl,因为它们是不同的脚本语言,可能是不同的功能集 通常,我想检测我的Perl脚本的STDIN我们的STDOUT是否被重定向(最好是前者)。我不想知道文件名,而是想知道调用方是否正在使用重定向,这样,如果他们没有使用重定向,我就可以向他们提供“帮助文本” 最好是独立于平台的,但我只预期此脚本将在macOS或Linux上运行。$perl-le'print(-t STDIN?“terminal”:“file”)' $ perl -le'print

这个问题与为Python编写的问题相同,但再次询问Perl,因为它们是不同的脚本语言,可能是不同的功能集

通常,我想检测我的Perl脚本的
STDIN
我们的
STDOUT
是否被重定向(最好是前者)。我不想知道文件名,而是想知道调用方是否正在使用重定向,这样,如果他们没有使用重定向,我就可以向他们提供“帮助文本”

最好是独立于平台的,但我只预期此脚本将在macOS或Linux上运行。

$perl-le'print(-t STDIN?“terminal”:“file”)'
$ perl -le'print(-t STDIN ? "terminal" : "file")'
terminal
$ perl -le'print(-t STDIN ? "terminal" : "file")' < /dev/null
file
$
终端 $perl-le'print(-t STDIN?“terminal”:“file”)”
您可以检查句柄是终端还是未使用

if(-t标准输出){
说“终端”;
}否则{
说“不是终端或发生错误”;
}

已定义(my$rv=-t标准输出)
或死亡(“无法检查STDOUT是否为终端:$!\n”);
如果($rv){
说“终端”;
}否则{
说“不是终点站”;
}

不管是否是终端,您都可以找到它是什么类型的文件

stat(标准输出)
或死亡(“无法统计标准值:$!\n”);
如果(-f{说“普通文件”;}
elsif(-p_417;{说“管道”;}
elsif(-S_417;{说“Socket”;}
elsif(-c{说“字符设备”;}
elsif(-b_417;{说“块设备”;}
否则{说“异国情调”}就不可能了?
终端将是字符设备,但并非所有字符设备都是终端


不可能以系统独立的方式(如果有的话)确定与哪个文件关联(如果它甚至有一个名称),将模块放在一边

在Linux上,您可以使用
/proc

$perl-e'warn readlink(“/proc/$$/fd/”.fileno(STDOUT))。“\n”
/dev/pts/0
$perl-e'warn readlink(“/proc/$$/fd/”.fileno(STDOUT))。“\n”>a
/tmp/ikegami/a
$perl-e'unlink“a”;
警告readlink(“/proc/$$/fd/”.fileno(STDOUT))。“\n”>a
/tmp/ikegami/a(已删除)
$perl-e'warn readlink(“/proc/$$/fd/”.fileno(STDOUT))。“\n”'| cat
管道:[27807]

很酷。你能解释一下
-t
的作用和在哪里可以找到它吗?它是perldoc perlop公司的吗?stdout也一样吗?@Robert
perldoc-f-X
仅仅因为它不是终端并不意味着它是一个文件。。。可能是管道,甚至是插座。