Ich habe (use '[clojure.java.shell :only [sh]])
zum Ausführen von Shell-Befehlen mit Clojure gefunden. Jetzt, während (sh "ls" "-a")
den Job erledigt, (sh "ls" "-a" "| grep" "Doc")
nicht. Was ist der Trick?Clojure: wie Shell Befehle mit Rohrleitungen ausgeführt werden?
Antwort
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")
- 1. Wie mehrere Befehle mit subprocess.check_call auf einmal ausgeführt werden
- 2. Shell Scripting - Rohrleitungen und Umleitung
- 3. Supervisor - wie mehrere Befehle ausgeführt werden
- 4. Wie mehrere DOS-Befehle parallel ausgeführt werden?
- 5. Wie untersucht man tatsächliche Bitbake-Befehle, die ausgeführt werden
- 6. Mit Shell mit boot2docker Befehle
- 7. Shell-Befehle werden in welcher Sprache geschrieben?
- 8. Rohrleitungen von Shell in Jupyter Notebook Zelle
- 9. Scala - Shell Befehle mit Pipe
- 10. Wie Shell-Befehle in Makefile
- 11. Mit Groovy, wie Pipe mehrere Shell-Befehle?
- 12. Shell-Befehle in Makefiles
- 13. Emacs benutzerdefinierte Shell-Befehle
- 14. Windows-Shell-Befehle mit Python ausführen
- 15. Wie sehe ich die Befehle, die von GNU ausgeführt werden?
- 16. Groovy ausführende Shell-Befehle
- 17. Wie azure-cli Befehle von Java aus ausgeführt werden
- 18. Wie mehrere Befehle in einer einzigen Zeile ausgeführt werden?
- 19. Wie werden diese Powershell-Befehle in einer Batch-Datei ausgeführt?
- 20. Wie werden Autocomplete-Befehle in der CLI-Anwendung (Golang) ausgeführt?
- 21. Mehrere Shell-Befehle in Windows
- 22. Mac Shell Befehle in R mit Anführungszeichen
- 23. Shell-Skript für GIT-Befehle
- 24. Wie Befehle auf Shell durch Python laufen
- 25. Emacs und Long Shell-Befehle
- 26. Mehrere Befehle können nicht in einer Zeile ausgeführt werden
- 27. Wie zum Ausführen bestimmter Befehle in Shell-Skript ohne Sudo?
- 28. Python 2.6: Rohrleitungen bash Befehle enthält Python-Variablen (Innen-Python-Skript)
- 29. Wie verwende ich Rohrleitungen mit ffmpeg?
- 30. Reihenfolge des Betriebs mit Rohrleitungen
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
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. –
Sie können sich auch https: // github ansehen .com/Raynes/Conch. Es unterstützt Pipelines: https://github.com/Raynes/conch#piping –