2012-05-15 14 views
5

ho bisogno di eseguire un comando di shell da uno script Scala e io uso il seguente frammento per questo:Terminal comando cd non funziona da Scala sceneggiatura

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) 

Il codice funziona bene. Mi chiedo il motivo per cui ho

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

non appena cambio il comando per cd /tmp && ls che è IMO equivalente a ls /tmp?

risposta

8

Da Wikipedia on cd command:

[...] su sistemi Unix cd chiama la funzione chdir() POSIX C. Ciò significa che quando viene eseguito il comando, non viene creato alcun nuovo processo per migrare nell'altra directory, come nel caso di altri comandi come ls. Invece, la shell stessa esegue questo comando.

C'è anche una citazione su Java c'è:

[...] né il linguaggio di programmazione Java, né la Java Virtual Machine supporta chdir() direttamente; una richiesta di modifica è rimasto aperto per oltre un decennio, mentre il team responsabile per Java considerato le alternative, anche se entro il 2008 la richiesta è stata negata dopo solo un supporto limitato è stato introdotto [...]

Provate voi stessi:

$ which ls 
/bin/ls 
$ which cd 
$ 

In parole semplici, cd non è un programma (processo) che è possibile eseguire (come /bin/ls) - è più di una direttiva della riga di comando.

Cosa vuoi raggiungere? Changing the current working directory in Java? o cambia la directory di lavoro del processo appena creato?

+3

utilizzando 'type cd' e' type ls' nella shell sono anche dimostrativi nella shell. Dovrebbe riportare che cd non è un eseguibile, ma una shell integrata – stew

+0

In generale, volevo leggere un output di un certo comando che dovrebbe essere eseguito da una directory che è runtime conosciuta, come: 'cd/somedir && find. -dindice 5 -tipo d'. Ci sono diversi modi per ottenerlo senza 'cd', ma avendo lo sfondo Perl ero solo curioso del perché fosse impossibile farlo con JVM. Grazie per la risposta! – nab

Problemi correlati