2016-04-20 13 views

Antwort

12

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

Wenn Sie ausführen:

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

Sie ls mit Parametern -a, | grep und Doc auszuführen fragen.

Wenn Sie ls -a | grep Doc in Ihrem Terminal geben Sie interpretiert die Shell als ls Ausführung seiner std heraus zu nehmen und es als std passieren in einem anderen Verfahren (grep), die von der Shell gestartet werden soll.

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

Die einfachere Lösung wäre einfach zu bitten, einen shell Prozess alles auszuführen, als ob es im Terminal eingegeben wurde:

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

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

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

+0

Dies ist eine sehr gut erklärt Antwort, danke! Jetzt nur für reines Wissen, gibt es eine Möglichkeit, es zu tun, indem Sie tatsächlich die Ausgabe von '(": out (sh "ls" "a")) 'zu einem anderen' (sh "grep" "Doc") ''? – shakedzy

+0

Sie können die Option ': in' von' sh' verwenden, um den Wert von ': out' aus einem vorherigen Prozess zu übernehmen.Sie verlieren jedoch die Eigenschaft des Datenstreams von einem Prozess zum anderen - Sie puffern alle Wenn Shell Shell eine Pipeline von einem Prozess in einen anderen überträgt, ohne dass alles gepuffert werden muss, können Sie 'java.lang.Runtime.exec()' verwenden und 'java.lang.Process.getOutputStream', um die Ausgabedaten aus dem ersten Prozess zu erhalten und sie an die nächste weiterzuleiten, aber Clojure' sh' unterstützt das nicht. –

+1

Sie können sich auch https: // github ansehen .com/Raynes/Conch. Es unterstützt Pipelines: https://github.com/Raynes/conch#piping –

Verwandte Themen