2012-11-01 16 views
9

Sono stato google per un po 'di tempo e tutti sembrano avere una soluzione diversa, nessuna delle quali sembra funzionare per me.Esecuzione di shell-script con parametri da java

Ho provato sia ProcessBuilder e Runtime. Entrambi chiamano direttamente il file .sh e lo inviano a /bin/bash. Senza fortuna

Torna alle origini, il mio codice corrente è il seguente;

String cmd[] = { "~/path/to/shellscript.sh", "foo", "bar" }; 
Process p = Runtime.getRuntime().exec(cmd); 

che sta dando un errore di No such file or directory, nonostante che in esecuzione manualmente;

~/path/to/shellscript.sh foo bar 

Funziona perfettamente da bash.

Ho bisogno di mantenere il ~ perché questo script esiste in forme leggermente diverse per tre diversi utenti.

risposta

11

Una possibilità è quella di gestire ~ te stesso:

String homeDir = System.getenv("HOME"); 
String[] cmd = { homeDir + "/path/to/shellscript.sh", "foo", "bar" }; 
Process p = Runtime.getRuntime().exec(cmd); 

Un altro è quello di far gestire Bash per voi:

String[] cmd = { "bash", "-c", "~/path/to/shellscript.sh foo bar" }; 
Process p = Runtime.getRuntime().exec(cmd); 
+0

Ah, è il '' ~ probabilità di essere la causa dei problemi ne pensi? Java non sa come passare un simile percorso alla chiamata di sistema? – lynks

+0

Sì, molto probabilmente ~ è la ragione. È possibile avere il suggerimento di cui sopra se per utente lo script si trova nello stesso percorso relativo nella directory home o se il percorso è configurato per utente, come suggerito. –

+0

Il secondo suggerimento ha funzionato perfettamente, grazie. Non ho nemmeno pensato di controllare '~' – lynks

1

In generale, mi sento di raccomandare di utilizzare il ScriptEngine invece di System.getRuntime(). Exec
penso che renderà le cose più facili per voi.
Bare in mente è necessario per questo JDK 6 e versioni successive.
Inoltre, per quanto riguarda il problema specifico, penso davvero che questo problema dovrebbe essere configurabile.
È possibile effettuare le seguenti operazioni:
A. avere nel vostro .bash_rc o .bash_profile (per ogni utente) definire un percorso per lo script di configurazione
utilizzando:
EXPORT mio_script =


B. Leggi questo valore da codice java, utilizzando
String sciprtPath = System.getenv("MY_SCRIPT") per ottenere il valore.
C. Esegui lo script, come hai fatto nel codice, con la variabile scriptPath o utilizzando lo scriptEngine.

2

Come già accennato, tilde è un'espansione specifica-shell che dovrebbe essere gestito manualmente sostituendolo con la directory home dell'utente corrente (ad esempio con $HOME se definito).

Oltre alle soluzioni già date, si potrebbe anche considerare l'utilizzo di commons-io e commons-exec dal progetto Apache Commons:

... 
import org.apache.commons.exec.CommandLine; 
import org.apache.commons.exec.DefaultExecutor; 
import org.apache.commons.exec.Executor; 
import org.apache.commons.io.FileUtils; 
... 
CommandLine cmd = new CommandLine("path/to/shellscript.sh"); 
cmd.addArgument("foo"); 
cmd.addArgument("bar"); 

Executor exec = new DefaultExecutor(); 
exec.setWorkingDirectory(FileUtils.getUserDirectory()); 
exec.execute(cmd); 
... 
Problemi correlati