【问题标题】:How can a console application (e.g. Java) recognize the source of the 'standard input' stream?控制台应用程序(例如 Java)如何识别“标准输入”流的来源?
【发布时间】:2010-12-18 18:50:11
【问题描述】:

如果我在 linux 命令行上运行“python”,并且没有提供任何命令行参数,程序会显示欢迎消息并等待用户输入。我假设在后台,程序将消息发送到“标准输出”流并在“标准输入”流上执行阻塞读取。

但是,如果我通过管道传输来自另一个进程的输出来间接调用 python(例如 echo "hello" | python),python 不会输出该消息。不知何故,它可以区分原始场景(a)“标准输入”流由其他进程填充的场景和(b)“标准输入”流从键盘填充的场景。

这是如何实现的?我一直认为这些信息不适用于应用程序。 Java 应用程序如何实现这种差异化?

【问题讨论】:

    标签: command-line console keyboard pipe


    【解决方案1】:

    Python:

    import os
    import sys
    
    if os.isatty(sys.stdin.fileno()):
        print "is a tty"
    else:
        print "not a tty"
    

    我不知道使用默认库的 Java 等效项; Jython 似乎使用本机代码 (jna-posix)。

    更新 - 这里有两种可能性:

    • System.console() 如果有控制台对象,则返回一个; null 否则(见herehere
    • System.out.available() 如果没有立即可用的输入,则返回 0,这往往意味着 stdin 是一个终端(但并不总是 - 这是一个不太准确的测试)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多