it-swarm.com.de

Wie können Sie mithilfe von Groovy mehrere Shell-Befehle ausführen?

Wie nutze ich Groovy und Java.lang.Process-Unterstützung? Wie kann ich mehrere Shell-Befehle zusammen leiten?

Betrachten Sie diesen bash-Befehl (und nehmen Sie an, dass Ihr Benutzername foo ist):

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

Dadurch werden Benutzernamen gedruckt - eine Zeile für einige Prozesse, die sich auf Ihr Benutzerkonto beziehen.

Wenn Sie Groovy verwenden, sagt die ProcessGroovyMethods -Dokumentation und der Code, dass ich dazu in der Lage sein sollte, das gleiche Ergebnis zu erzielen:

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

Ich kann jedoch keine Textausgabe für etwas anderes erhalten:

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

Sobald ich mit dem Paspeln beginne, druckt der println nichts.

Gedanken?

11
Les Hazlewood

Das funktioniert für mich:

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

aus einem unbekannten Grund können die Parameter von awk nicht mit nur einer Zeichenfolge gesendet werden (ich weiß nicht warum! Vielleicht zitiert bash etwas anderes). Wenn Sie den Fehlerstrom mit Ihrem Befehl sichern, wird ein Fehler relativ zur Kompilierung des awk-Skripts angezeigt.

Bearbeiten : In der Tat 

  1. "-string-".execute() Delegierter an Runtime.getRuntime().exec(-string-)
  2. Es ist ein bash-Job, um Argumente zu behandeln, die Leerzeichen mit 'oder "enthalten. Runtime.exec oder das Betriebssystem kennen die Anführungszeichen nicht
  3. Wenn Sie "grep ' foo'".execute() ausführen, führen Sie den Befehl grep aus, mit ' als ersten Parametern und foo' als zweiten: Er ist ungültig. das gleiche für awk
15
Jérémie B

Sie können dies tun, damit die Shell das Problem lösen kann:

// 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
11
tim_yates

Das hat bei mir funktioniert

def command = '''
    ps aux | grep bash | awk '{print $1}'
'''
def proc = ['bash', '-c', command].execute()
proc.waitFor()
println proc.text

Wenn Sie mehrere Befehle ausführen möchten, können Sie sie dem Befehl hinzufügen.

def command = '''
    ls -ltr
    cat secret
'''
def proc = ['bash', '-c', command].execute()
proc.waitFor()
println proc.text
2
Here_2_learn

Wenn Sie es async wollen, empfehle ich 

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