varios proyecto ejemplo ejecutar desde consola compilar comandos comando java shell command-line

proyecto - Quiere invocar un comando linux shell desde Java



processbuilder en java (3)

Basándose en el ejemplo de @ Tim para hacer un método autónomo:

import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; import java.util.ArrayList; public class Shell { /** Returns null if it failed for some reason. */ public static ArrayList<String> command(final String cmdline, final String directory) { try { Process process = new ProcessBuilder(new String[] {"bash", "-c", cmdline}) .redirectErrorStream(true) .directory(new File(directory)) .start(); ArrayList<String> output = new ArrayList<String>(); BufferedReader br = new BufferedReader( new InputStreamReader(process.getInputStream())); String line = null; while ( (line = br.readLine()) != null ) output.add(line); //There should really be a timeout here. if (0 != process.waitFor()) return null; return output; } catch (Exception e) { //Warning: doing this is no good in high quality applications. //Instead, present appropriate error messages to the user. //But it''s perfectly fine for prototyping. return null; } } public static void main(String[] args) { test("which bash"); test("find . -type f -printf ''%T@////t%p////n'' " + "| sort -n | cut -f 2- | " + "sed -e ''s/ ///////// /g'' | xargs ls -halt"); } static void test(String cmdline) { ArrayList<String> output = command(cmdline, "."); if (null == output) System.out.println("/n/n/t/tCOMMAND FAILED: " + cmdline); else for (String line : output) System.out.println(line); } }

(El ejemplo de prueba es un comando que enumera todos los archivos en un directorio y sus subdirectorios, recursivamente, en orden cronológico ).

Por cierto, si alguien puede decirme por qué necesito cuatro y ocho barras invertidas allí, en lugar de dos y cuatro, puedo aprender algo. Hay un nivel más de desaparición que lo que estoy contando.

Editar: ¡Acabo de probar este mismo código en Linux, y resulta que necesito la mitad de las barras invertidas en el comando de prueba! (Es decir: el número esperado de dos y cuatro). Ahora ya no es simplemente extraño, es un problema de portabilidad.

Estoy intentando ejecutar algunos comandos de Linux desde Java usando la redirección (> &) y pipes (|). ¿Cómo puede invocar Java los comandos csh o bash ?

Intenté usar esto:

Process p = Runtime.getRuntime().exec("shell command");

Pero no es compatible con redirecciones o tuberías.


Use ProcessBuilder para separar comandos y argumentos en lugar de espacios. Esto debería funcionar independientemente del shell utilizado:

import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class Test { public static void main(final String[] args) throws IOException, InterruptedException { //Build command List<String> commands = new ArrayList<String>(); commands.add("/bin/cat"); //Add arguments commands.add("/home/narek/pk.txt"); System.out.println(commands); //Run macro on target ProcessBuilder pb = new ProcessBuilder(commands); pb.directory(new File("/home/narek")); pb.redirectErrorStream(true); Process process = pb.start(); //Read output StringBuilder out = new StringBuilder(); BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); String line = null, previous = null; while ((line = br.readLine()) != null) if (!line.equals(previous)) { previous = line; out.append(line).append(''/n''); System.out.println(line); } //Check result if (process.waitFor() == 0) { System.out.println("Success!"); System.exit(0); } //Abnormal termination: Log command parameters and output and throw ExecutionException System.err.println(commands); System.err.println(out.toString()); System.exit(1); } }


exec no ejecuta un comando en tu caparazón

tratar

Process p = Runtime.getRuntime().exec(new String[]{"csh","-c","cat /home/narek/pk.txt"});

en lugar.

EDIT :: No tengo csh en mi sistema, así que usé bash en su lugar. Lo siguiente funcionó para mí

Process p = Runtime.getRuntime().exec(new String[]{"bash","-c","ls /home/XXX"});