2009-02-28 16 views
7

Voglio aprire il terminale (prompt dei comandi) su una macchina Linux utilizzando il codice Java. So come aprire prompt dei comandi in Windows.I seguente codice che ho usato in finestreCome aprire un terminale di comando in Linux?

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

Ho bisogno della stessa cosa in Linux.

Grazie per le vostre risposte. Mi piacerebbe anche scrivere un copione.

Se il seguente codice funziona.

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

Potete chiarire? Vuoi aprire un terminale o vuoi eseguire uno script? Gli utenti hanno una varietà di terminali diversi, e sarebbe difficile riuscire a garantirne l'apertura. Ma eseguendo uno script, quasi ogni box Linux ha/bin/sh (solo non necessariamente in quel percorso assoluto) – num1

risposta

3

Non c'è standard unico comando "terminale" a Linux - quelli disponibili dipendono dal GUI è presente (vale a dire se KDE o Gnome, ecc).

È dovrebbe essere in grado di contare su xterm essere presenti, ma sulla moderna Linux varianti che non è il terminale di scelta:

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

Naturalmente, "xterm" potrebbe non essere in quel particolare percorso. ..

1

In realtà non esiste un terminale "the". Quello che vuoi veramente è shell. La maggior parte dei Linux usa BaSH come shell, ma per restare al sicuro devi limitarti a/bin/sh

Modifica: Hmm probabilmente ho capito la domanda. Se vuoi un terminale interattivo dovresti esaminare l'uso di un kit di strumenti che fornisca un componente per questo.

Edit2: Forse le tue esigenze possono essere servite da VTE, che è un componente GTK + per l'incorporamento di un terminale.

3

Sotto Gnome, è gnome-terminal.

Sotto KDE, è konsole.

Oppure è possibile utilizzare il programma terminale più generico xterm.

Probabilmente vorrete usare le opzioni con la maggior parte di questo, quindi cercate le pagine man per quella che volete.

8

In Linux, ci sono una serie di emulatori di terminale che permettono di interagire con i vari conchiglie. Ogni shell è fondamentalmente un interprete di comandi che capisce i comandi di Linux (GNU & i comandi Unix sono più corretti, suppongo ...). Un emulatore di terminale fornisce un'interfaccia (finestra) per la shell e alcune altre funzionalità per l'utilizzo del prompt dei comandi. Per aprire una finestra di terminale, è sufficiente modificare la stringa di comando in questo modo: -

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); 
    } 
} 

L'assunto di base che ho fatto è che si vuole aprire xterm, che è disponibile su quasi tutti i sistemi (con X installato ovviamente). Potresti voler aprire un altro emulatore di terminale come rxvt, eterm, aterm, gnome-terminal o konsole. La stringa di comando può anche essere modificata per utilizzare shell differenti come zsh. Ti suggerisco di rilevare un'eccezione nel caso in cui il terminale che hai scelto non sia presente e gestirlo chiedendo all'utente di installarlo.Una soluzione migliore è accettare gli argomenti della riga di comando per la shell preferita dagli utenti o utilizzare un file di configurazione che l'utente può modificare per far sì che lo script apra la shell di sua scelta.

Nota
1. Come altri hanno già fatto notare, xterm (o qualsiasi altro terminale di vostra scelta), non possono essere nel percorso specificato (/ usr/bin/...) e potrebbe anche non essere installato, quindi potrebbe essere necessario utilizzare una stringa di comando di fantasia (Ex: pipelining find tramite grep per ottenere il percorso di xterm prima dell'avvio), che non è una grande idea. Penso che il modo migliore sia lasciare che l'utente configuri il tutto.

2. Ho ricevuto un commento su questa risposta (di ypnos), suggerendo di evitare l'uso di percorsi assoluti e piuttosto di fare affidamento sul comando presente nella variabile d'ambiente PATH. Devo dire che sono d'accordo. In tal caso, la stringa di comando dovrebbe essere -

String command = "xterm" 

Do un'occhiata al commento, perché sottolinea anche il problema con l'utilizzo di ritrovamento.

+2

Do _non_ usa percorsi assoluti su Linux per i binari. Il comando osserva la variabile PATH. Se lo chiami semplicemente su "xterm", verrà trovato xterm, se è presente nel sistema. – ypnos

+1

p.s .: trovare è una pessima idea. localizzare sarebbe leggermente migliore. dove è corretto. MA: per chiamare find/locate/whereis, dovresti conoscere anche i loro percorsi assoluti ;-)) .... solo non usare percorsi assoluti ti farebbero impazzire: D – ypnos

+0

@ypnos Ho appena visto il tuo commento . Grazie per il consiglio. Essendo un principiante, apprezzo molto la mancia. Lo terrò a mente. – batbrat

0

Fornirei sicuramente un modo semplice per configurare il percorso del terminale desiderato in un luogo che può essere facilmente modificato. Ad esempio, forse in un file XML di configurazione.

Diverse distro lo manterranno in luoghi diversi, quindi è probabilmente meglio controllare la documentazione di distribuzione per le piattaforme a cui si sta mirando (e documentare come modificarla).

"/ usr/bin/xterm" dovrebbe essere sulla maggior parte delle macchine, ma non necessariamente scommetterei la farm su di esso.

1

Penso che sarebbe bello se l'applicazione aprisse l'applicazione terminale predefinita dell'utente.

Sfortunatamente, sembra che non ci sia un modo universale per determinarlo.

A mio parere la soluzione più preferibile sarebbe (fermata ogni volta che si può aprire qualcosa):

  • cercare di recongnize ambiente desktop dell'utente e determinare la sua applicazione terminale predefinito. Puoi leggere qualcosa a riguardo here.
  • verificare la variabile di ambiente $ TERM
  • Chiedere all'utente le sue preferenze e salvarlo nel file di configurazione.

Trovare l'ambiente desktop dell'utente e il terminale predefinito potrebbe essere troppo complicato per il tuo scopo, quindi userei due ultime opzioni. È possibile eseguire l'applicazione da $ TERM con codice come questo:

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

Non pensavo di usare $ TERM. In ogni caso, so che non è sempre preciso. Sia gnome-terminal che konsole lo impostano su xterm (secondo il tuo link). – batbrat

+0

Proprio così TERM non è pensato per contenere il nome del binario, ma piuttosto un nome che può essere cercato in/etc/termcap. gnome-terminal e xfce-terminal usano entrambi "xterm". Quando si esegue una sessione video è "schermo". –

+0

Inoltre, se qualcuno avvia un'applicazione Java da Desktop, TERM potrebbe probabilmente essere la vera console virtuale da cui X e l'intera sessione sono state avviate. – ypnos

0

poiché è necessario assumere si sa quasi nulla circa il sistema è in esecuzione su questo, direi minimo comune denominatore potrebbe essere:

Comando stringa = "/ bin/sh";

  • o anche di piu 'garantiti' -

comando String = "sh";

+0

Questo non avvierà un emulatore di terminale, solo una shell. Dovresti anche usare '/ bin/sh' invece di '/ usr/bin/sh' dato che il primo è un requisito POSIX (cioè garantito per tutti i sistemi Unix). –

+0

L'OP ha detto: Voglio aprire il terminale (prompt dei comandi), in modo che non vogliano un emulatore di terminale - ma sono d'accordo sul/usr/bin/sh (e così ho editato) – KevinDTimm

3

xterm molto probabilmente sarà disponibile sulla maggior parte dei sistemi operativi basati su Linux e se presente sarà trovato nella variabile percorso.

Pertanto, è necessario fare qualcosa di simile:

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(); 
} 

L'opzione -e può essere utilizzato per richiamare uno script o un altro programma, ad esempio: javac. In questo caso dovresti eseguire un compito come: myScript = "javac".

È necessario la parte " ; le_exec" se non si desidera chiudere immediatamente la finestra dopo l'esecuzione, altrimenti scartarla. Il punto e virgola è usato per separare i comandi e le_exec è solo un semplice script che aspetta che l'utente prema Invio.

Tuttavia, se lo script necessita di argomenti, è necessario sostituire lo String myScript con l'array di Stringhe.