我正在编写一个可执行的 Perl 脚本,我们称之为 SCRIPT,它获取从命令行执行的另一个命令的输出,并对该输出执行某些操作。
例如
$ diff 文件A 文件B |脚本
但是如果我调用 SCRIPT 而不将其放在管道之后,我想发出错误信号。
以下 MWE 工作正常,但我不确定我是否理解原因。
#!/usr/bin/perl
use strict;
use warnings;
if ( -t STDIN )
{
print "NOTHING PIPED IN\n";
}
else
{
while ( my $line = <STDIN> )
{
print ">> " . $line;
}
}
1;
我找不到有关
-t
功能的文档。 我的意思是我可以发现它测试 Filehandle 是否打开到 tty。 但我不确定这意味着什么。 我也不明白为什么我必须使用 STDIN
而不使用角度运算符。
换句话说,
if ( -t <STDIN> )
如果不在管道的接收端,则要么挂起,要么丢失管道数据的第一行。 (我丢失了管道数据的第一行对我来说实际上是有意义的。)
我期待着一些不同的东西。 我期望我应该编写如下代码:
#!/usr/bin/perl
use strict;
use warnings;
if ( -t STDIN )
{
while ( my $line = <STDIN> )
{
print ">> " . $line;
}
}
else
{
print "NOTHING PIPED IN\n";
}
1;
-t STDIN
以通俗的方式实际测试。<STDIN>
循环中的 while
读取?<STDIN>
是 readline( STDIN )
的缩写。你不想读一行;您想检查文件句柄是否连接到终端。
tty 是终端。 (我认为它是“电传打字机”的缩写,它让人回想起人们使用连接到一台昂贵的机器的愚蠢计算机来进行真正的处理而不是坐在计算机本身的时代。)在unix中,ttys是一类特定的字符设备。 (稍后详细介绍。)它基本上指的是与用户的交互界面。[1]
-t
,记录为函数-X
,测试提供的文件句柄是否连接到tty。例如,它最终可能会在内部调用 isatty
。
之前,我说过 tty 是一类特定的字符设备。这意味着某些字符设备不是 tty。但更重要的是,这也意味着不是字符设备的文件句柄也不能是 tty。其他类型的文件句柄包括“普通文件”、目录、套接字、管道和块设备。对于连接到其中任何一个的句柄,
-t
将返回 false。