测试 -t STDIN 与 -t <STDIN>

问题描述 投票:0回答:1

我正在编写一个可执行的 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
    以通俗的方式实际测试。
  • 为什么当没有任何管道输入时它返回 true?
  • 为什么当它为 false 时我可以从
    <STDIN>
    循环中的
    while
    读取?
perl if-statement conditional-statements stdin
1个回答
0
投票

<STDIN>
readline( STDIN )
的缩写。你不想读一行;您想检查文件句柄是否连接到终端。

tty 是终端。 (我认为它是“电传打字机”的缩写,它让人回想起人们使用连接到一台昂贵的机器的愚蠢计算机来进行真正的处理而不是坐在计算机本身的时代。)在unix中,ttys是一类特定的字符设备。 (稍后详细介绍。)它基本上指的是与用户的交互界面。[1]

-t
,记录为函数
-X
,测试提供的文件句柄是否连接到tty。例如,它最终可能会在内部调用
isatty

之前,我说过 tty 是一类特定的字符设备。这意味着某些字符设备不是 tty。但更重要的是,这也意味着不是字符设备的文件句柄也不能是 tty。其他类型的文件句柄包括“普通文件”、目录、套接字、管道和块设备。对于连接到其中任何一个的句柄,

-t
将返回 false。


  1. 还存在一种称为伪 tty 的 tty 类型,它允许程序与其他程序进行通信,就好像它们是用户一样。
© www.soinside.com 2019 - 2024. All rights reserved.