2009-02-28 14 views
7

Quiero abrir el terminal (símbolo del sistema) en una máquina Linux usando código Java. Yo sé cómo abrir el símbolo del sistema en windows.The siguiente código que he utilizado en ventanas¿Cómo abrir un terminal de comando en Linux?

String command= "cmd c/start cmd.exe" 
Runtime rt = Runtime.getRuntime(); 
Process pr = rt.exec(command); 

necesito lo mismo en Linux.

Gracias por su respuesta. Me gustaría ejecutar un script sh también.

Si el siguiente código funciona.

String command= "usr/bin/xterm myshell.sh"; 
Runtime rt = Runtime.getRuntime(); 
Process pr = rt.exec(command); 
+0

¿Puedes aclarar? ¿Desea abrir un terminal o desea ejecutar un script? Los usuarios tienen una variedad de terminales diferentes, y sería difícil garantizarle que puede abrir una. Pero al ejecutar un script, casi todos los linux box tienen/bin/sh (simplemente no necesariamente en esa ruta absoluta) – num1

Respuesta

3

No hay comando "terminal" en Linux estándar único - los que están disponibles dependen de la interfaz gráfica de usuario está presente (es decir, si KDE, o Gnome, etc.).

Usted debe ser capaz de confiar en xterm estar presente, pero en moderno variantes de Linux que no es el terminal de elección:

String command= "/usr/bin/xterm"; 
Runtime rt = Runtime.getRuntime(); 
Process pr = rt.exec(command); 

Por supuesto, "xterm" no podría estar en ese camino particular. ..

1

No existe realmente un terminal "the". Lo que realmente quieres es shell. La mayoría de Linuxes usa BaSH como un shell, pero para mantener el lado seguro debe limitarse a/bin/sh

Editar: Hmm Probablemente no entendí la pregunta. Si desea un terminal interactivo, debe considerar el uso de un conjunto de herramientas que proporcione un componente para eso.

Edit2: Tal vez sus necesidades pueden ser atendidas por VTE, que es un componente GTK + para incrustar un terminal.

3

En Gnome, es gnome-terminal.

En KDE, es konsole.

O podría utilizar el programa de terminal más genérico xterm.

Probablemente querrá usar opciones con la mayor parte de esto, así que busque las páginas del manual que desee.

8

En Linux, hay una serie de emuladores de terminal que le permiten interactuar con diversas conchas. Cada shell es básicamente un intérprete de comandos que entiende los comandos de Linux (GNU & los comandos Unix son más correctos, supongo ...). Un emulador de terminal proporciona una interfaz (ventana) para el shell y algunas otras facilidades para usar el símbolo del sistema. Para abrir una ventana de terminal, sólo hay que modificar la cadena de comando como el siguiente: -

import java.io.*; 

class TerminalLauncher 
{ 
    public static void main(String args[]) throws IOException 
    { 
     String command= "/usr/bin/xterm"; 
     Runtime rt = Runtime.getRuntime(); 
     Process pr = rt.exec(command); 
    } 
} 

El supuesto básico que he hecho es que desea abrir xterm, que está disponible en casi cualquier sistema (con X instalado por supuesto). Es posible que desee abrir otro emulador de terminal como rxvt, eterm, aterm, gnome-terminal o konsole. La cadena de comandos también se puede modificar para usar diferentes shells como zsh. Sugiero que capture una excepción en caso de que el terminal que eligió no esté presente y lo maneje pidiéndole al usuario que lo instale.Una mejor solución es aceptar argumentos de línea de comando para el shell preferido de los usuarios o usar un archivo de configuración que el usuario puede cambiar para hacer que el script abra el shell de su elección.

Nota
1. Como otros ya han señalado, xterm (o cualquier otro terminal de su elección) no pueden estar en la ruta especificada (/ usr/bin/...) y pueden incluso no ser instalado, por lo que es posible que tenga que utilizar una cadena de comandos de lujo (por ejemplo: pipelining find a grep para obtener la ruta a xterm antes de iniciar), que no es una gran idea. Creo que la mejor manera es dejar que el usuario configure todo.

2. Recibí un comentario sobre esta respuesta (por ypnos), sugiriendo que evito el uso de rutas absolutas y confío en que el comando está en la variable de entorno PATH. Debo decir que estoy de acuerdo. En ese caso, la cadena de comandos debe ser -

String command = "xterm" 

se fijan en el comentario, ya que también señala el problema con el uso hallazgo.

+2

No _no_ usa rutas absolutas en Linux para binarios. El comando observa la variable PATH. Si solo lo llama en "xterm", se encontrará xterm, si está presente en el sistema. – ypnos

+1

p.s .: encontrar es una idea terrible. localizar sería un poco mejor. donde es correcto PERO: para llamar a find/locate/whereis, también tendrías que saber sus rutas absolutas ;-)) .... simplemente no uses rutas absolutas que te volverían loco: D – ypnos

+0

@ypnos Acabo de ver tu comentario . Gracias por el consejo. Siendo un principiante, realmente aprecio el consejo. Lo tendré en cuenta. – batbrat

0

Definitivamente proporcionaría una manera fácil de configurar la ruta al terminal deseado en un lugar que se pueda editar fácilmente. Por ejemplo, tal vez en un archivo XML de configuración.

Distintas distribuciones mantendrán esto en diferentes lugares, por lo que probablemente sea mejor verificar la documentación por distribución para las plataformas a las que apunta (y documentar cómo cambiarla).

"/ usr/bin/xterm" debería estar en la mayoría de las máquinas, pero no apostaría necesariamente por la granja.

1

Creo que sería bueno si su aplicación abrirá la aplicación de terminal predeterminada del usuario.

Lamentablemente, parece que no hay una forma universal de determinarlo.

En mi opinión la solución más preferible sería (se detiene cada vez que puede abrir algo):

  • tratar de recongnize entorno de escritorio del usuario y determinar su aplicación de terminal por defecto. Puede leer algo al respecto here.
  • verifique la variable de entorno $ TERM
  • Pregunte al usuario su preferencia y guárdela en el archivo de configuración.

Encontrar el entorno de escritorio del usuario y su terminal predeterminado puede ser demasiado complicado para su propósito, así que usaría dos últimas opciones. Puede ejecutar la aplicación desde $ term con código como el siguiente:

String command = System.getenv().get("TERM"); 
Runtime rt = Runtime.getRuntime(); 
Process pr = rt.exec(command); 
+0

No pensé en usar $ TERM. En cualquier caso, sé que no siempre es exacto. Tanto gnome-terminal como konsole lo establecen en xterm (de acuerdo con su enlace). – batbrat

+0

Correcto TERM no significa que contenga el nombre del binario, sino un nombre que se puede buscar en/etc/termcap. gnome-terminal y xfce-terminal ambos usan "xterm". Cuando se ejecuta una sesión de pantalla, es "pantalla". –

+0

Además, si alguien inicia una aplicación Java desde el Escritorio, TERM podría ser la verdadera consola virtual desde la que se inició X y toda la sesión. – ypnos

0

ya que hay que asumir que sabe casi nada sobre el sistema está ejecutando en esta, yo diría más bajo denominador común sería:

String command = "/ bin/sh";

  • o incluso más 'garantizado' -

comando String = "sh";

+0

Eso no iniciará un emulador de terminal, solo un shell. También debe usar '/ bin/sh' en lugar de '/ usr/bin/sh' ya que el primero es un requisito POSIX (es decir, se garantiza que estará allí para cada sistema Unix). –

+0

El OP dijo: Quiero abrir el terminal (símbolo del sistema), por lo que no quieren un emulador de terminal, pero estoy de acuerdo con el/usr/bin/sh (y lo han editado) – KevinDTimm

3

xterm probablemente estará disponible en la mayoría de los sistemas operativos basados ​​en Linux y, si está presente, se encontrará en la variable de ruta.

Por lo tanto, tendrá que hacer algo como esto:

try { 
    Runtime r = Runtime.getRuntime(); 
    String myScript = ..... 
    String[] cmdArray = {"xterm", "-e", myScript + " ; le_exec"}; 
    r.exec(cmdArray).waitFor(); 
} catch (InterruptedException ex){ 
    ex.printStackTrace(); 
} catch (IOException ex) { 
    ex.printStackTrace(); 
} 

La opción -e se puede utilizar para invocar un script o de otro programa, por ejemplo: javac. En este caso, harías una tarea como: myScript = "javac".

Necesitará la pieza " ; le_exec" si no desea que la ventana se cierre inmediatamente después de la ejecución, de lo contrario, deséchela. El punto y coma se usa para separar los comandos y le_exec es solo un script simple que espera que el usuario presione Enter.

Sin embargo, si su script necesita argumentos, entonces tendría que reemplazar el String myScript por una matriz de cadenas.

Cuestiones relacionadas