Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: Shell bash in java

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    79

    Shell bash in java

    Salve a tutti, chiedo se qualcuno sa come poter fare un piccolo programma Java che preso in input un comando bash, riesca ad eseguire tala comando. I comandi che mi servono sono di ripulitura e filtraggio di un file txt (grep, cut, ecc...).
    Non mi sembra un progrmmma lungo, però mi servirebbe almeno un aiuto su come impostarlo. So di dover utilizzare qualche libreria, io ho provato con la VNGX-JSCH trovata su Internet, ma poco mi è chiaro l'utilizzzo.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da rizz1 Visualizza il messaggio
    Salve a tutti, chiedo se qualcuno sa come poter fare un piccolo programma Java che preso in input un comando bash, riesca ad eseguire tala comando. I comandi che mi servono sono di ripulitura e filtraggio di un file txt (grep, cut, ecc...).
    Non mi sembra un progrmmma lungo, però mi servirebbe almeno un aiuto su come impostarlo. So di dover utilizzare qualche libreria, io ho provato con la VNGX-JSCH trovata su Internet, ma poco mi è chiaro l'utilizzzo.
    Se si tratta di eseguibili esterni alla shell (indipendentemente dal S.O./shell), come grep e cut (che sono eseguibili esterni a qualuque shell ... non sono comandi "builtin" della bash!), allora basta usare il classico java.lang.Runtime (con i suoi vari exec() ) oppure da Java 5, il java.lang.ProcessBuilder.

    Questo vale per qualunque "eseguibile". E l'unica cosa da tenere presente è che se il processo lanciato fa dell'output su standard-output/error, questo output deve essere letto lato Java.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    79
    Provo ad utilizzare java.lang.Runtime dato che i comandi non sono builtin. Mi manca un pò di pratica con tale libreiria, dovrei trovare esempi su Internet, nel caso provo a chiederti.
    Grazie mille dell'aiuto

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    79
    Il metodo exec() esegue un comando prendendo come parametro il file eseguibile del comando bash , giusto?
    Per eseguire il comando cut, dovrei avere tale file a disposizione. In ambiente Linux è semplce. In Windows devo scaricare una bash contentente tali file?

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    79
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Se si tratta di eseguibili esterni alla shell (indipendentemente dal S.O./shell), come grep e cut (che sono eseguibili esterni a qualuque shell ... non sono comandi "builtin" della bash!), allora basta usare il classico java.lang.Runtime (con i suoi vari exec() ) oppure da Java 5, il java.lang.ProcessBuilder.

    Questo vale per qualunque "eseguibile". E l'unica cosa da tenere presente è che se il processo lanciato fa dell'output su standard-output/error, questo output deve essere letto lato Java.
    Hai suggerimenti su come posso visualizzare l'output da Java. Nel programma che ho fatto, il risultato del metodo exec() su un oggetto di tipo Runtime, è stato salvato in una variabile di tipo Process.Come posso vedere a video il risultato dell'esecuzione?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da rizz1 Visualizza il messaggio
    Il metodo exec() esegue un comando prendendo come parametro il file eseguibile del comando bash , giusto?
    Gli exec sono in diverse varianti. Puoi passare un eseguibile+argomenti in unico String o separati in un String[].

    Quote Originariamente inviata da rizz1 Visualizza il messaggio
    Per eseguire il comando cut, dovrei avere tale file a disposizione. In ambiente Linux è semplce. In Windows devo scaricare una bash contentente tali file?
    Esistono "porting" su Windows dei tools di Linux/Unix.
    https://www.google.it/#q=grep+cut+windows

    Quote Originariamente inviata da rizz1 Visualizza il messaggio
    Hai suggerimenti su come posso visualizzare l'output da Java. Nel programma che ho fatto, il risultato del metodo exec() su un oggetto di tipo Runtime, è stato salvato in una variabile di tipo Process.Come posso vedere a video il risultato dell'esecuzione?
    Process ha getInputStream() / getErrorStream() che forniscono un InputStream (non conviene però leggere "a byte" ma incapsularli in InputStreamReader e/o altro di più alto livello).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    79
    Il mio codice è il seguente:

    codice:
            public static void main(String[] args) {
                
                String command = "C:\\Users\\Peppone\\Desktop\\shell.w32-ix86\\grep.exe";
                String[] env = {"prova","C:\\Users\\Peppone\\Desktop\\prova.txt"};
                OutputStream o = null;
                
                Runtime rt = Runtime.getRuntime();
                Process proc;
                try
                {
                    proc = rt.exec(command, env);
                    o = proc.getOutputStream();
                    OutputStreamWriter out = new OutputStreamWriter(o);
    
                    int status_proc = proc.waitFor();
                } 
                catch (IOException e1) {  
                    e1.printStackTrace();   
                }
                catch (InterruptedException e1) {
                    e1.printStackTrace();   
                }
    
            }

    Vorrei visualizzare su console Java il risultato della grep sul file prova. E' solo un errore di visualizzazione dell'output oppure ho sbagliato in origne sull'esecuzione del cmadno?
    Ultima modifica di LeleFT; 08-11-2013 a 10:26

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da rizz1 Visualizza il messaggio
    String command = "C:\\Users\\Peppone\\Desktop\\shell.w32-ix86\\grep.exe";
    String[] env = {"prova","C:\\Users\\Peppone\\Desktop\\prova.txt"} ;
    Prima questione fondamentale: il parametro String[] envp dei vari exec non è per gli "argomenti"!! È per le variabili di "ambiente" da passare al processo.

    Quote Originariamente inviata da rizz1 Visualizza il messaggio
    proc = rt.exec(command, env);
    o = proc.getOutputStream();
    OutputStreamWriter out = new OutputStreamWriter(o);
    Seconda questione importante:
    getErrorStream() --> per leggere da standard-error del processo
    getInputStream() --> per leggere da standard-output del processo
    getOutputStream() --> per scrivere su standard-input del processo
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    79
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Prima questione fondamentale: il parametro String[] envp dei vari exec non è per gli "argomenti"!! È per le variabili di "ambiente" da passare al processo.

    Seconda questione importante:
    getErrorStream() --> per leggere da standard-error del processo
    getInputStream() --> per leggere da standard-output del processo
    getOutputStream() --> per scrivere su standard-input del processo


    Ho capito tutto, un pò du ruggine di Java che non si dovrebbe mai dimenticare.L'unico problema che ho è quello di utilizzare dei parametri sull'esecuzione del comando.E' possibile farlo? Mi viene da pensare di NO, dato che il metodo exec() non fa nient'altro che eseguire un file eseguibile

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da rizz1 Visualizza il messaggio
    Ho capito tutto, un pò du ruggine di Java che non si dovrebbe mai dimenticare.L'unico problema che ho è quello di utilizzare dei parametri sull'esecuzione del comando.E' possibile farlo? Mi viene da pensare di NO, dato che il metodo exec() non fa nient'altro che eseguire un file eseguibile
    L'ho già detto prima: l'eseguibile più argomenti può essere passato in singola String (per gli exec con String command) oppure separati in array (per gli exec con String[] cmdarray).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.