如何使用管道将标准输出重定向到Ruby程序?

如何使用管道将标准输出重定向到Ruby程序?,ruby,bash,shell,Ruby,Bash,Shell,我刚做了一个看起来像考赛的程序。 这需要参数,但我无法将标准输出重定向到此程序。我想做的是: cat a_file.txt | cowspeak 或 我已经看到“lolcat”支持这一点(我相信使用trollop)。我想从头开始写。如何在单个文件中完成此操作?用于通过管道接收来自标准输出的输入 创建cowspeak.rb文件: puts "Cow speaks: " + gets 演示: 太神奇了,以前从没想过。。。那么,是否有任何方法可以检测是否有管道已传递到程序,否则如果没有使用管道,

我刚做了一个看起来像考赛的程序。

这需要参数,但我无法将标准输出重定向到此程序。我想做的是:

cat a_file.txt | cowspeak

我已经看到“lolcat”支持这一点(我相信使用trollop)。我想从头开始写。如何在单个文件中完成此操作?

用于通过管道接收来自标准输出的输入

创建cowspeak.rb文件:

puts "Cow speaks: " + gets
演示:


太神奇了,以前从没想过。。。那么,是否有任何方法可以检测是否有管道已传递到程序,否则如果没有使用管道,它将只等待标准输入……简单地说:如果运行cowspeak.rb,它将不会执行任何操作,也不会要求用户输入。但是如果一个STDOUT/STDERR被重定向,它将显示这一点。有什么办法吗?好的,我就是这么做的:`#/usr/bin/ruby-w require'timeout'开始超时::timeout 0.00001 do p$stdin.gets end rescue timeout::Error end`使用超时是个坏主意,因为这是一种竞争条件。规范的Unix行为是在未提供参数的情况下从stdin读取。您还可以检查stdin是否与Ruby的
isatty
等价。您的问题不清楚。你说的“我不能将stdout重定向到此程序”是什么意思?您在那里发布的代码应该可以工作,这正是在类Unix的shell中重定向stdout的方式。如果这不起作用,那么您的shell可能不支持管道或使用不同的语法?顺便说一句,在类Unix的shell中,您的第一个代码片段是“无用地使用
cat
”反模式的示例,它应该是
cowspeak
。因为我使用管道,并且使用Linux语法,显然,这个问题是针对Linux系统提出的。此外,该链接将引导您找到一个debian文件,这显然是一个Linux发行版。然而,说我不能重定向输出意味着我不能在列宁的回答之前重定向输出。而且,现在我被困在gets中。如果我使用GET,那么如果我使用管道,它将工作。否则,它将等待用户的输入。我想不停地运行程序。如果用户使用管道,那么它将抓取它,否则它将忽略GET。知道吗?你说的“使用Linux语法”是什么意思?Linux是一种操作系统,而不是一种编程语言;Linux没有“语法”。如果您使用的是bashshell或任何其他类似Unix的shell(甚至是Microsoft PowerShell),那么您发布的代码应该可以工作,并且应该将stdout重定向到
cowspeak
。如果没有,那么你的外壳有问题。
puts "Cow speaks: " + gets
❯ echo "hey there" | ruby cowspeak.rb
Cow speaks: hey there