2012-05-15 16 views
5

necesito para ejecutar un comando shell desde un script Scala y utilizo el siguiente fragmento de eso:Terminal comando cd no funciona desde el guión 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) 

El código funciona bien. Me pregunto por qué me sale

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

tan pronto como puedo cambiar el comando para cd /tmp && ls que es equivalente a la OMI ls /tmp?

Respuesta

8

De Wikipedia on cd command:

[...] en los sistemas Unix cd llama a la función chdir() POSIX C. Esto significa que cuando se ejecuta el comando, no se crea un nuevo proceso para migrar al otro directorio como es el caso con otros comandos como ls. En cambio, el shell en sí ejecuta este comando.

Existe aún una cita sobre Java existe:

[...] ni el lenguaje de programación Java ni la Máquina Virtual de Java soporta chdir() directamente; una solicitud de cambio permaneció abierta durante más de una década, mientras que el equipo responsable de Java considerar las alternativas, aunque en 2008 la petición fue denegada tras la introducción de un apoyo limitado [...]

Inténtelo usted mismo:

$ which ls 
/bin/ls 
$ which cd 
$ 

En palabras simples, cd no es un programa (proceso) que se puede ejecutar (como /bin/ls) - es más una directiva de línea de comando.

¿Qué desea lograr? Changing the current working directory in Java? o cambiar el directorio de trabajo del proceso que acaba de crear?

+3

usando 'type cd' y' type ls' en el shell también son demostrativos en su caparazón. Debería informar que cd no es un archivo ejecutable, sino un shell incorporado. – stew

+0

Básicamente, quería leer un resultado de un determinado comando que debe ejecutarse desde un directorio conocido como runtime, como: 'cd/somedir && find. -mindepth 5 -type d'. Hay una serie de formas de lograrlo sin 'cd', pero con el historial de Perl solo era curioso por qué esto era imposible de hacer con JVM. ¡Gracias por la respuesta! – nab

Cuestiones relacionadas