Ho trovato (use '[clojure.java.shell :only [sh]])
per l'esecuzione di comandi shell con clojure. Ora, mentre (sh "ls" "-a")
fa il lavoro, non lo è il (sh "ls" "-a" "| grep" "Doc")
. Qual è il trucco?Clojure: come eseguire comandi di shell con piping?
risposta
clojure.java.shell/sh
esegue un comando (il primo argomento passato alla funzione sh
) con argomenti specificati (il resto dei parametri passati a sh
).
quando si esegue:
(sh "ls" "-a" "| grep" "Doc")
vi chiedo di eseguire ls
con i parametri -a
, | grep
e Doc
.
Quando si digita ls -a | grep Doc
nel vostro terminale allora la shell interpreta come l'esecuzione di ls
, prendendo il suo std fuori e passarla come std a un altro processo (grep
) che dovrebbe essere avviato dalla shell.
Si può simulare quanto il guscio sta facendo avviando ls
come un unico processo, prendere la sua uscita std e quindi eseguire grep
passando uscita dal ls
come input.
La soluzione più semplice sarebbe quella di chiedere solo un processo shell
di eseguire tutto come se sia stata scritta nel terminale:
(sh "bash" "-c" "ls -a | grep Doc")
E 'importante passare -c
e ls ...
come argomenti separati in modo bash li manifestino come un parametro separato. È inoltre necessario disporre dell'intero comando che si desidera eseguire come una stringa (ls -a | grep Doc
). Altrimenti solo il primo argomento dopo -c
verrà trattato come un comando. Ad esempio, questo non farà ciò che si desidera:
(sh "bash" "-c" "ls -a" "|" "grep Doc")
- 1. Come eseguire comandi sulla shell attraverso pitone
- 2. Python - come eseguire i comandi della shell con pipe?
- 3. Problema con i comandi di piping in C
- 4. Comandi personalizzati con git-shell
- 5. Scala - comandi shell con pipe
- 6. Come si utilizza l'attività exec di Ant per eseguire i comandi di piping?
- 7. Come eseguire i comandi della shell da un'applicazione Mac/MacRuby?
- 8. Come eseguire comandi sulla stessa shell TCL usando Python
- 9. Posso utilizzare Fabric per eseguire comandi di shell interattivi?
- 10. Comandi di shell di escape In java?
- 11. Esecuzione comandi shell da Java
- 12. Esecuzione di comandi shell con NSTask - Objective-C Cacao
- 13. modi per eseguire comandi shell esterni in sbt
- 14. C# eseguire comandi shell e ottenere il risultato
- 15. Script Comandi shell Karaf?
- 16. Jenkins - Esegue comandi di shell con caratteri jolly
- 17. Come posso eseguire comandi esterni dal prompt dei comandi gdb?
- 18. Come eseguire 2 comandi con docker exec
- 19. Come eseguire manage.py dalla shell Python
- 20. Come combinare i comandi della shell
- 21. Come eseguire la shell django da Emacs?
- 22. supervisore - come eseguire più comandi
- 23. Come eseguire il comando shell in Javascript
- 24. Come eseguire shell integrata da Scala
- 25. Eseguire script di shell in pitone
- 26. Come eseguire i comandi zkCli.sh di zookeeper da bash?
- 27. Come si eseguono comandi shell MULTIPLE in un'attività gruntjs?
- 28. Come eseguire comandi shell in emacs su ubuntu evitando un errore di controllo del lavoro bash?
- 29. Come eseguire comandi complessi di linux in Qt?
- 30. Come eseguire un file Clojure?
Questa è una risposta molto ben spiegato-, grazie! Ora, solo per pura conoscenza, c'è un modo per farlo inviando effettivamente l'output di '(": out (sh "ls" "-a")) 'a un altro' (sh "grep" "Doc") '? – shakedzy
È possibile utilizzare l'opzione ': in' di' sh' per passare il valore di ': out' da un processo precedente, tuttavia, utilizzandolo, si perde la caratteristica dello streaming di dati da un processo a un altro - si bufferizzerà tutto uscita da un processo e quando termina passerai tutto il suo contenuto a un altro, Shell usa pipeline dove i dati sono trasmessi da un processo all'altro senza bisogno di bufferizzare tutto.Potresti usare 'java.lang.Runtime.exec()' e 'java.lang.Process.getOutputStream' per ottenere i dati di output dal primo processo e passarli al successivo, ma Clojure' sh' non lo supporta –
Puoi anche dare un'occhiata a https: // github .com/Raynes/conch. Supporta pipeline: https://github.com/Raynes/conch#piping –