如何检测Ruby脚本是否通过shell管道运行?

ste*_*ore 3 ruby shell pipe

我的问题类似于这个问题:如何检测我的shell脚本是否通过管道运行?.不同之处在于我正在处理的脚本是用Ruby编写的.

比方说我跑:

./test.rb
Run Code Online (Sandbox Code Playgroud)

我希望stdout上的文字有颜色,但是

./test.rb | cat
Run Code Online (Sandbox Code Playgroud)

我希望剥离颜色代码.

ddu*_*ubs 8

$stdout.isatty习惯使用或更多$stdout.tty?.我创建了一个小的test.rb文件来演示,内容:

puts $stdout.isatty
Run Code Online (Sandbox Code Playgroud)

结果:

$ ruby test.rb
true

$ ruby test.rb | cat
false
Run Code Online (Sandbox Code Playgroud)

参考:https://ruby-doc.org/core/IO.html#method-i-isatty

  • 或更多惯用语:`$ stdout.tty?` (3认同)

小智 5

使用IO#stat.pipe?在 TTY 设备上IO#tty?返回 true 。对于 UNIX 风格的管道返回 false(请参阅“man 2 pipeline”)。

 $ echo "something" | ruby -e 'puts $stdin.stat.pipe?'
true
 $ echo "something" | ruby -e 'puts $stdin.tty?'
false
 $ ruby -e 'puts $stdin.tty?'
true
Run Code Online (Sandbox Code Playgroud)