2016-02-03 10 views
10

Utilizzo di Groovy ed è il supporto java.lang.Process, come posso collegare più comandi shell?Utilizzando groovy, come si collegano più comandi shell?

considerare questo comando bash (e assumere il nome utente è foo):

ps aux | grep ' foo' | awk '{print $1}' 

Questo stamperà i nomi utente - una linea per alcuni processi relativi al proprio account utente.

Utilizzando Groovy, la documentazione e il codice ProcessGroovyMethods dice che dovrei essere in grado di fare questo per ottenere lo stesso risultato:

def p = "ps aux".execute() | "grep ' foo'".execute() | "awk '{print $1}'".execute() 
p.waitFor() 
println p.text 

Tuttavia, non posso ottenere alcun output di testo per altro che questo:

def p = "ps aux".execute() 
p.waitFor() 
println p.text 

Non appena avvii la connessione, il println non stampa nulla.

Pensieri?

risposta

8

Questo funziona per me:

def p = 'ps aux'.execute() | 'grep foo'.execute() | ['awk', '{ print $1 }'].execute() 
p.waitFor() 
println p.text 

per un motivo sconosciuto, i parametri di awk non possono essere inviate con una sola stringa (non so perché! Forse bash sta citando qualcosa di diverso). Se scarichi con il tuo comando il flusso di errori, vedrai l'errore relativo alla compilazione dello script awk.

Edit: In realtà,

  1. "-string-".execute() delegato al Runtime.getRuntime().exec(-string-)
  2. E 'compito bash per gestire gli argomenti che contengono spazi con' o" Runtime.exec o il sistema operativo non sono a conoscenza delle citazioni
  3. .
  4. Eseguendo "grep ' foo'".execute() esegui il comando grep, con ' come i primi parametri e foo' come il secondo: non è valido. Lo stesso per awk
+0

Mentre la risposta di @ tim_yates ha risolto il mio particolare problema in un modo diverso (e sono molto grato per questo), questa risposta affronta la domanda OP di Groovy 'o' operator e' Processo 'oggetti, quindi lo assegnerò. Grazie! –

8

È possibile farlo per lasciare solo la shell sort it out:

// slash string at the end so we don't need to escape ' or $ 
def p = ['/bin/bash', '-c', /ps aux | grep ' foo' | awk '{print $1}'/].execute() 
p.waitFor() 
println p.text 
+0

Sì, ho potuto, e che può essere il modo in cui ho bisogno di andare, ma sai perché il metodo 'o' non funziona come definito nel Documenti? –

+1

Ha qualcosa a che fare con awk. Non sei sicuro di cosa, ma non mi piace essere eseguito in questo modo –

+0

Interessante: l'approccio fasullo ha funzionato. Usando le virgolette non ha fatto. Vai a capire! –

0

Se lo vuoi asincrono vi consiglio

proc.consumeProcessOutputStream(new LineOrientedOutputStream() { 
     @Override 
     protected void processLine(String line) throws IOException { 
      println line 
     } 
    } 
    ); 
Problemi correlati