2

標準の入力ストリームからの入力を受け入れるScala内の外部プログラムを使用しようとしています。

以下のコードとほぼ同等のコードをLinuxで実行しますが、Windowsで実行すると例外が発生します(Windows 7でテスト済み)。例外の説明には、echoコマンドが見つからないことが記載されています。

def invokeProgram(data : String) {
       import scala.sys.process._
       val cmdEcho = Seq("echo", data)
       val cmdProgram = Seq("program")
       println((cmdEcho #| cmdProgram).!!)
}

コードはLinuxでは正しく機能しますが、Windowsで説明されているように失敗しますが、echoコマンドは両方のプラットフォームに共通であり、その使用法は私の目的では構文的に同じです。これは、エコーがPATHにないのと同じくらい簡単ですか?Windowsに別のecho.exeもありますか、それとも他のものにバンドルされていますか?呼び出されたプログラムは、この問題を解決できない場合にフォールバックする一時ファイルからの入力を受け入れるようにすることができます。

4

2 に答える 2

4

違いは次のとおりです。

dcs@shadowfax:~$ which echo
/bin/echo

つまり、Unix ではechoコマンドは実際にはバイナリですが、ほとんどのシェルでは組み込みとして実装されています。一方、Windows ではecho.exe(またはecho.comなど) と呼ばれるバイナリはありません。これは、シェルの組み込みコマンドにすぎません。

于 2012-08-15T20:33:31.247 に答える
1

使う必要は全くありませんecho代わりに、 ProcessBuilderの #< メソッドを使用してください。次に例を示します。

import java.io.ByteArrayInputStream
import scala.sys.process._

val data = "hello"
val is = new ByteArrayInputStream(data.getBytes)
"cat" #< is ! //complicated way to print hello
于 2012-08-15T10:33:51.803 に答える