Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Groovy脚本中从Bash代码读取标准输入_Bash_Groovy - Fatal编程技术网

如何在Groovy脚本中从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

我试图让Groovy脚本读取标准输入,这样我就可以从带有herdoc的Bash脚本中调用它,但我得到了一个
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中工作。(不作为答案发布,因为它不是具体的,我只知道这两个东西是如何工作的,因为我在网上做了一些快速搜索。)