代码之家  ›  专栏  ›  技术社区  ›  A.Ellett

测试-t STDIN与-t<STDIN>

  •  0
  • A.Ellett  · 技术社区  · 11 月前

    我正在编写一个可执行的perl脚本,我们称之为script,它从命令行执行的另一个命令中获取输出,并对该输出进行处理。

    例如

    $diff文件A文件B | SCRIPT

    但是,如果我调用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 做。我的意思是,我可以发现它测试是否 文件句柄向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 循环?
    1 回复  |  直到 11 月前
        1
  •  4
  •   ikegami Gilles Quénot    11 月前

    <STDIN> 简称为 readline( STDIN ) 你连一句话都不想读;您想检查文件句柄是否连接到终端。

    tty是一个终端。 1. 在unix中,tty是一类特定的字符设备。(稍后将详细介绍。)它基本上是指与用户的交互界面。 2.

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

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

    $ printf '' >file
    
    $ perl -Mv5.14 -e'say -t STDIN ? 1 : 0'              # Happens to be a tty.
    1
    
    $ perl -Mv5.14 -e'say -t STDIN ? 1 : 0' </dev/tty    # Definitely a tty.
    1
    
    $ perl -Mv5.14 -e'say -t STDIN ? 1 : 0' </dev/null   # Char dev that's not a TTY
    0
    
    $ perl -Mv5.14 -e'say -t STDIN ? 1 : 0' <file        # Plain file.
    0
    
    $ printf '' | perl -Mv5.14 -e'say -t STDIN ? 1 : 0'  # Pipe
    0
    

    1. 这是缩写 "teletype" and "teletypewriter" ,这让人回想起人们通过打字机和打印机组合远程连接电脑的时代,而不是将键盘和显示器插入其中。
    2. 还有一种称为伪tty的tty,它允许程序像用户一样与其他程序通信。