Un comando de shell es un comando que podemos activar usando un teclado y una línea de comandos o un shell en lugar de una interfaz gráfica de usuario. Por lo general, activaríamos los comandos de shell manualmente. Sin embargo, puede haber casos en los que esto deba hacerse mediante programación a través de Java.
Java proporciona soporte para ejecutar comandos de shell nativos con dos clases: RunTime y ProcessBuilder . La principal desventaja de usar estas clases y ejecutar comandos de shell desde dentro de un programa Java es que Java pierde su portabilidad.
¿Qué significa perder la portabilidad?
Java se rige por el principio » compilar una vez, ejecutar en cualquier lugar «. Esto significa que un programa Java escrito y compilado en un sistema operativo puede ejecutarse en cualquier otro sistema operativo sin realizar ningún cambio.
Cuando usamos las clases ProcessBuilder o Runtime para ejecutar comandos de shell nativos, hacemos que el programa Java dependa del sistema operativo subyacente. Por ejemplo, un programa Java que ejecuta específicamente comandos de shell de Linux no puede ejecutarse tal cual en una máquina con Windows principalmente porque Windows tiene una estructura de carpetas y comandos de shell diferentes.
Ejemplos:
Los tres primeros ejemplos analizarán la implementación de la clase ProcessBuilder para ejecutar comandos de shell en Java. El siguiente ejemplo es para la clase RunTime.
Ejemplo 1: Pérdida de portabilidad.
Este ejemplo muestra lo que sucede si ejecutamos un programa Java destinado al sistema operativo Linux/Unix en un sistema operativo Windows.
Java
// if we execute a Java program meant for the Linux/Unix // operating system on a Windows operating system import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; public class ShellCommandRunner4 { public static void main(String[] args) { try { System.out.println( System.getProperty("os.name")); System.out.println(); // This process cannot be run on Windows. So the // program will throw an exception. ProcessBuilder pb = new ProcessBuilder("sh", "-c", "ls"); // Exception thrown here because folder // structure of Windows and Linux are different. pb.directory( new File(System.getProperty("user.home"))); // It will throw and exception Process process = pb.start(); StringBuilder output = new StringBuilder(); BufferedReader reader = new BufferedReader(new InputStreamReader( process.getInputStream())); String line; while ((line = reader.readLine()) != null) { output.append(line + "\n"); } int exitVal = process.waitFor(); if (exitVal == 0) { System.out.println( "**************************** The Output is ******************************"); System.out.println(output); System.exit(0); } } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }
Ejemplo 2: ejecutar un comando de shell simple
Este ejemplo muestra cómo ejecutar un comando simple de shell de Windows. Usamos una lista para construir comandos y luego los ejecutamos usando el método de «inicio» de la clase ProcessBuilder. El programa ejecuta el comando para encontrar los procesos del navegador Chrome de la lista de tareas que se ejecuta en la máquina.
Java
// Run a simple Windows shell command import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class ShellCommandRunner { public static void main(String[] args) { ProcessBuilder processBuilder = new ProcessBuilder(); List<String> builderList = new ArrayList<>(); // add the list of commands to a list builderList.add("cmd.exe"); builderList.add("/C"); builderList.add("tasklist | findstr chrome"); try { // Using the list , trigger the command processBuilder.command(builderList); Process process = processBuilder.start(); // To read the output list BufferedReader reader = new BufferedReader(new InputStreamReader( process.getInputStream())); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } int exitCode = process.waitFor(); System.out.println("\nExited with error code : " + exitCode); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }
Ejemplo 3: ejecutar un archivo bat
Este ejemplo muestra cómo ejecutar un programa .bat simple en la consola de Java. El archivo .bat muestra la información del sistema de Windows.
Java
// Run a simple .bat program in the Java console import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; public class ShellCommandRunner3 { public static void main(String[] args) { try { // File location for the bat script File dir = new File("D:\\bat_scripts"); // Command to run the bat file in the same // console ProcessBuilder pb = new ProcessBuilder( "cmd.exe", "/C", "sysinfo.bat"); pb.directory(dir); Process process = pb.start(); StringBuilder output = new StringBuilder(); BufferedReader reader = new BufferedReader(new InputStreamReader( process.getInputStream())); String line; while ((line = reader.readLine()) != null) { output.append(line + "\n"); } int exitVal = process.waitFor(); if (exitVal == 0) { System.out.println( "**************************** The Output is ******************************"); System.out.println(output); System.exit(0); } } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }
Ejemplo 4: Ejecute un comando de shell utilizando la clase RunTime.
Este ejemplo muestra cómo ejecutar un comando simple usando la clase RunTime. Usamos el método exec() de la clase Runtime.
Java
// Run a simple command using the RunTime class import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; public class ShellCommandRunner2 { public static void main(String[] args) { try { Process process = Runtime.getRuntime().exec("where java"); StringBuilder output = new StringBuilder(); BufferedReader reader = new BufferedReader(new InputStreamReader( process.getInputStream())); String line; while ((line = reader.readLine()) != null) { output.append(line + "\n"); } int exitVal = process.waitFor(); if (exitVal == 0) { System.out.println( "**************************** The Output is ******************************"); System.out.println(output); System.exit(0); } } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }
Publicación traducida automáticamente
Artículo escrito por reshmasathe y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA