6

Scalaスクリプトからシェルコマンドを実行する必要があり、そのために次のスニペットを使用します。

import scala.sys.process.{Process, ProcessIO}

val command = "ls /tmp"
val process = Process(command)

val processIO = new ProcessIO(_ => (),
    stdout => scala.io.Source.fromInputStream(stdout).getLines.foreach(println),
    _ => ())
process.run(processIO)

コードは正常に機能します。なぜ私が得るのだろうか

java.io.IOException: Cannot run program "cd": error=2, No such file or directory

IMOが?cd /tmp && lsに相当するコマンドを変更するとすぐにls /tmp

4

2 に答える 2

9

ウィキペディアからcdコマンド:

[...] Unix システムでは、 POSIX C 関数cdを呼び出します。chdir()これは、コマンドが実行されたときに、などの他のコマンドの場合のように、他のディレクトリに移行するための新しいプロセスが作成されないlsことを意味します。代わりに、シェル自体がこのコマンドを実行します。

そこにはJavaに関する引用さえあります:

[...] Java プログラミング言語も Java 仮想マシンもchdir()直接サポートしていません。Java を担当するチームが代替案を検討している間、変更要求は 10 年以上開かれていましたが、限定的なサポートのみが導入された後、2008 年までに要求は拒否されました [...]

自分で試してみてください:

$ which ls
/bin/ls
$ which cd
$

簡単に言えば、cd実行できるプログラム (プロセス) ではありません (のように/bin/ls)。コマンド ライン ディレクティブのようなものです。

何を達成したいですか?Javaで現在の作業ディレクトリを変更しますか? または、作成したばかりのプロセスの作業ディレクトリを変更しますか?

于 2012-05-15T18:42:08.357 に答える