Domanda

Vorrei invocare bash usando una stringa come input. Qualcosa del tipo:

sh -l -c "./foo"

Mi piacerebbe farlo da Java. Sfortunatamente, quando provo a invocare il comando usando getRuntime (). Exec , ottengo il seguente errore:

      foo": -c: line 0: unexpected EOF while looking for matching `"'

      foo": -c: line 1: syntax error: unexpected end of file

Sembra essere correlato al fatto che la mia stringa non sia terminata con un EOF.

Esiste un modo per inserire un EOF specifico della piattaforma in una stringa Java? O dovrei cercare un altro approccio, come scrivere su uno script temporaneo prima di invocare " sh " ?

È stato utile?

Soluzione

Usa questo:

Runtime.getRuntime().exec(new String[] {"sh", "-l", "-c", "./foo"});

Punto principale: non inserire le doppie virgolette. Viene usato solo quando si scrive una riga di comando nella shell!

ad esempio, echo " Ciao, mondo! " (come digitato nella shell) viene tradotto in:

Runtime.getRuntime().exec(new String[] {"echo", "Hello, world!"});

(Dimentica per il momento che la shell normalmente ha un builtin per echo , e invece chiama / bin / echo . :-))

Altri suggerimenti

Le righe di comando di Windows differiscono da UNIX, Mac OS X e GNU / Linux.

Su Windows il processo riceve il testo di input come dopo il nome eseguibile (e lo spazio). Spetta quindi al programma analizzare la riga di comando (che di solito viene eseguita in modo implicito e il programmatore è spesso all'oscuro).

In GNU / Linux la shell elabora la riga di comando e genera l'array familiare di stringhe passate alla C principale. Non hai quella conchiglia. L'approccio migliore (anche su Windows) è utilizzare la forma di exec in cui si passa ogni argomento della riga di comando singolarmente nella propria stringa.

Se vuoi davvero, puoi ottenere una shell per l'analisi per te. Il che farebbe sembrare un esempio simile (non testato):

Runtime.getRuntime().exec(new String[] {
    "sh", "-c", "sh -l -c \"echo foo; echo bar;\""
});

EOF NON è un personaggio, quindi non c'è modo di scrivere un EOF. Hai dimenticato di chiudere una stringa tra virgolette.

La causa di questo errore è molto probabilmente un token di sintassi mancante che bash si aspetta ma la stringa che passi termina prima che bash lo incontrasse. Cerca if, fors ecc. Che non hanno fi chiusura o fatto.

Le virgolette devono essere evase all'interno di una stringa. Invece di scrivere " scrivi \ " ;.

per es.

strcpy (c, " Questa è una stringa \ " con \ " virgolette ");

se fossi in te, scriverei il contenuto della stringa in un file bash temporaneo e vedrei se bash lo esegue senza alcun errore. Se ciò viene eseguito senza errori, prenderei in considerazione il debug ulteriormente;

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top