使用 ARGF 测试管道或控制台标准输入

Testing for pipe or console standard input with ARGF

我编写了一个脚本,我想从管道或通过提供文件名作为参数来获取输入。 ARGF 可以很容易地灵活地处理这个问题,除了在 neither 都没有提供的不正确使用情况下,在这种情况下,STDIN 被打开并挂起,直到用户在控制台上输入一些东西。

我想抓住这个不正确的用法来显示错误消息并退出程序,但我一直找不到办法。 ARGF.eof? 似乎是一个可能的候选者,但它也会挂起,直到收到一些输入。

有没有一种简单的方法 Ruby 可以区分管道提供的 STDIN 和控制台提供的 STDIN?

你可以使用

$stdin.tty?

例如

$ ruby -e 'puts $stdin.tty?'
> true
$ echo "hello" |  ruby -e 'puts $stdin.tty?'
> false