如何在Groovy脚本中从Bash代码读取标准输入
我试图让Groovy脚本读取标准输入,这样我就可以从带有herdoc的Bash脚本中调用它,但我得到了一个如何在Groovy脚本中从Bash代码读取标准输入,bash,groovy,Bash,Groovy,我试图让Groovy脚本读取标准输入,这样我就可以从带有herdoc的Bash脚本中调用它,但我得到了一个java.lang.NullPointerException:无法在null对象上调用方法readLine() 下面是一个精简的Groovy脚本echo.Groovy: #!/usr/bin/env groovy for (;;) { String line = System.console().readLine() if (line == null) bre
java.lang.NullPointerException:无法在null对象上调用方法readLine()
下面是一个精简的Groovy脚本echo.Groovy
:
#!/usr/bin/env groovy
for (;;)
{
String line = System.console().readLine()
if (line == null)
break
println(">>> $line")
}
下面是等效的Ruby脚本echo.rb
:
#!/usr/bin/env ruby
ARGF.each do |line|
puts ">>> #{line}"
end
如果我从Bash shell调用这些,那么一切都会按预期工作:
$ ./echo.rb
one
>>> one
two
>>> two
three
>>> three
^C
$ ./echo.groovy
one
>>> one
two
>>> two
three
>>> three
^C
这是使用herdocs的Bash脚本herdoc.sh
:
echo 'Calling echo.rb'
./echo.rb <<EOF
one
two
three
EOF
echo 'Calling echo.groovy'
./echo.groovy <<EOF
one
two
three
EOF
$ ./heredoc.sh
Calling echo.rb
>>> one
>>> two
>>> three
Calling echo.groovy
>>> one
>>> two
>>> three
有什么想法吗
更新
根据Etan的建议,我将echo.groovy更改为以下内容:
#!/usr/bin/env groovy
Reader reader = new BufferedReader(new InputStreamReader(System.in))
for (;;)
{
String line = reader.readLine()
if (line == null)
break
println(">>> $line")
}
它现在与heredocs一起工作:
echo 'Calling echo.rb'
./echo.rb <<EOF
one
two
three
EOF
echo 'Calling echo.groovy'
./echo.groovy <<EOF
one
two
three
EOF
$ ./heredoc.sh
Calling echo.rb
>>> one
>>> two
>>> three
Calling echo.groovy
>>> one
>>> two
>>> three
谢谢你,伊坦。如果你想发布一个正式的答案,我会投赞成票。正如埃坦所说,你需要从系统中阅读。在中,我想这会得到你想要的回复
#!/usr/bin/env groovy
System.in.withReader { r ->
r.eachLine { line ->
println ">>> $line"
}
}
虽然它与Ruby版本不完全相同,但是如果传递了参数,ARGF
将返回参数,正如Etan所说,您需要从系统中读取。在中,我认为这将得到您想要的响应
#!/usr/bin/env groovy
System.in.withReader { r ->
r.eachLine { line ->
println ">>> $line"
}
}
虽然它与Ruby版本不完全相同,但作为Etan答案的替代方法,ARGF
将在传递任何参数时返回参数,一种更为常规的方法是withReader
方法,该方法随后处理读卡器的清理,以及BufferedReader的eachLine方法,它处理无限循环
#!/usr/bin/env groovy
System.in.withReader { console ->
console.eachLine { line ->
println ">>> $line"
}
}
作为Etan答案的替代方法,Groovier方法是withReader
方法,该方法处理读取器的清理,以及BufferedReader的eachLine方法,该方法处理无限循环
#!/usr/bin/env groovy
System.in.withReader { console ->
console.eachLine { line ->
println ">>> $line"
}
}
Ruby的ARGF
读取标准输入。System.console尝试从终端读取数据(碰巧终端是正在运行的终端中的标准输入,因此ARGF
的工作方式与您期望的相同)。了解如何从标准输入而不是终端读取数据,我希望它能在groovy中工作。(不是作为答案发布,因为它不是具体的,我只知道这两个东西是如何工作的,因为我在网上做了一些快速搜索。)Ruby的ARGF
读取标准输入。System.console尝试从终端读取数据(碰巧终端是正在运行的终端中的标准输入,因此ARGF
的工作方式与您期望的相同)。了解如何从标准输入而不是终端读取数据,我希望它能在groovy中工作。(不作为答案发布,因为它不是具体的,我只知道这两个东西是如何工作的,因为我在网上做了一些快速搜索。)