clojure ile kabuk komutlarını çalıştırmak için (use '[clojure.java.shell :only [sh]])
buldum. Şimdi, (sh "ls" "-a")
işini yaparken (sh "ls" "-a" "| grep" "Doc")
yapmıyor. Hilesi ne?Clojure: Kabuk komutlarını boru ile nasıl yürütülür?
cevap
clojure.java.shell/sh
belirtilen bağımsız değişkenlerle (sh
'a iletilen diğer parametrelerle) bir komutu (sh
işlevine iletilen ilk bağımsız değişken) yürütür.
Eğer çalıştırdığınızda:
(sh "ls" "-a" "| grep" "Doc")
Eğer parametreleri -a
, | grep
ve Doc
ile ls
yürütmek istiyoruz.
Eğer terminalde ls -a | grep Doc
yazın
grep
) için std olarak iletin,
ls
yürütme olarak yorumlar.
Kabuk ls
biri olarak süreci başlatarak ne yaptığını taklit olabilir, onun std çıkışını alıp daha sonra girdi olarak ls
çıktı geçen grep
yürütün. bash olarak alır bu yüzden önemlidir
(sh "bash" "-c" "ls -a | grep Doc")
ayrı argümanlar olarak -c
ve ls ...
geçmek: Bu terminalde yazdığınız sanki
basit bir çözüm sadece her şeyi yürütmek için bir shell
sürecini sormaya olacaktır ayrı bir parametre. Ayrıca, tek bir dize (ls -a | grep Doc
) olarak yürütmek istediğiniz tüm komutu sahip olmanız gerekir. Aksi halde, sadece -c
'dan sonraki ilk argüman bir komut olarak ele alınacaktır. Örneğin bu ne istiyorsunuz yapmayacağım:
(sh "bash" "-c" "ls -a" "|" "grep Doc")
Bu çok iyi bir şekilde açıklanmıştır cevabı, teşekkür ederim! Şimdi sadece saf bilgi için, aslında başka bir "(sh" grep "" Doc ")' '' '' (': out (sh" ls "" -a "))' nin çıktısını göndererek bunu yapmanın bir yolu var mıdır? – shakedzy
'' '' '' 'seçeneğini' '' seçeneğini kullanarak önceki bir işlemden '' out' 'değerini geçirebilirsiniz.Ancak onu kullanarak bir işlemden diğerine veri akışı özelliğini kaybedersiniz. bir işlemden çıktığında ve tamamlandığında, tüm içeriğini bir diğerine aktarırsınız.Tüm, verileri bir süreçten diğerine akıtmaya gerek kalmadan pipeline kullanır ve herşeyi arabelleğe almanıza gerek kalmaz.' java.lang.Runtime.exec() işlevini kullanabilirsiniz. ve ilk işlemden çıktı verilerini elde etmek için java.lang.Process.getOutputStream' ve onu bir sonraki bölüme geçirin, fakat Clojure 'sh' onu desteklemiyor. –
Ayrıca https: // github'a da bakabilirsiniz. .com/Raynes/conch. Boru hatlarını destekliyor: https://github.com/Raynes/conch#piping –