Clojure: Wie kann man Shell-Befehle mit Piping ausführen?

8

Ich habe (use '[clojure.java.shell :only [sh]]) gefunden, um Shell-Befehle mit clojure auszuführen. Während (sh "ls" "-a") den Job ausführt, funktioniert (sh "ls" "-a" "| grep" "Doc") nicht. Was ist der Trick?

    
shakedzy 20.04.2016, 09:58
quelle

1 Antwort

12

clojure.java.shell/sh führt einen Befehl (das erste an sh function übergebene Argument) mit angegebenen Argumenten aus (der Rest der Parameter wird an sh übergeben).

Wenn Sie Folgendes ausführen:

(sh "ls" "-a" "| grep" "Doc")

Sie bitten% ce_de% mit den Parametern ls , -a und | grep auszuführen.

Wenn Sie Doc in Ihr Terminal eingeben, interpretiert die Shell es als ls -a | grep Doc , wobei es seine Standardausgabe ausgibt und als std in einen anderen Prozess ( ls ) übergibt, der von der Shell gestartet werden soll.

Sie könnten simulieren, was die Shell macht, indem Sie grep als einen Prozess starten, ihre std-Ausgabe nehmen und dann ls ausführen und die Ausgabe von grep als Eingabe übergeben.

Die einfachere Lösung wäre, einfach einen ls -Prozess anzufordern, alles so auszuführen, als wäre es in Terminal eingetippt:

shell

Es ist wichtig, (sh "bash" "-c" "ls -a | grep Doc") und -c als separate Argumente zu übergeben, damit bash sie als separate Parameter erhält. Sie müssen auch den gesamten Befehl, den Sie ausführen möchten, als eine Zeichenfolge ( ls ... ) haben. Andernfalls wird nur das erste Argument nach ls -a | grep Doc als Befehl behandelt. Zum Beispiel wird dies nicht tun, was Sie möchten:

-c

    
Piotrek Bzdyl 20.04.2016, 10:21
quelle

Tags und Links