2016-04-20 8 views
8

क्लोजर के साथ खोल आदेशों को निष्पादित करने के लिए मुझे (use '[clojure.java.shell :only [sh]]) मिला। अब, जबकि (sh "ls" "-a") नौकरी करता है, (sh "ls" "-a" "| grep" "Doc") नहीं करता है। चाल क्या है?क्लोजर: पाइपिंग के साथ खोल कमांड कैसे निष्पादित करें?

उत्तर

12

clojure.java.shell/sh एक कमांड निर्दिष्ट तर्क के साथ (पहला तर्क sh कार्य करने के लिए पारित कर दिया) (मापदंडों sh के लिए पारित के बाकी) निष्पादित करता है।

जब आप निष्पादित करें:

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

आप मापदंडों -a, | grep और Doc साथ ls निष्पादित करने के लिए पूछना।

आप अपने टर्मिनल में ls -a | grep Doc टाइप करते हैं तो खोल ls को क्रियान्वित करने, अपने एसटीडी बाहर ले और एक अन्य प्रक्रिया (grep) कि खोल द्वारा शुरू किया जाना चाहिए करने के लिए एसटीडी के रूप में इसे पारित के रूप में यह व्याख्या करता है।

आप एक प्रक्रिया के रूप में ls शुरू करके खोल कर सकते हैं, इसके std आउटपुट लेते हैं और उसके बाद grepls से इनपुट इनपुट के रूप में आउटपुट निष्पादित करते हैं।

सरल समाधान सिर्फ सब कुछ पर अमल करने के लिए एक shell प्रक्रिया पूछने के लिए किया जाएगा, जैसे कि वह टर्मिनल में टाइप किया गया था: तो पार्टी उन्हें हो जाता है

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

यह महत्वपूर्ण है अलग तर्कों के रूप -c और ls ... पारित करने के लिए एक अलग पैरामीटर। आपको एक पूर्ण स्ट्रिंग (ls -a | grep Doc) के रूप में निष्पादित करना भी पूरा आदेश होना चाहिए। अन्यथा -c के बाद केवल पहला तर्क कमांड के रूप में माना जाएगा। उदाहरण के लिए यह आप चाहते हैं क्या काम नहीं चलेगा:

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

+0

यह एक बहुत ही अच्छी तरह से समझाया जवाब है, धन्यवाद! अब सिर्फ शुद्ध ज्ञान के लिए, वास्तव में '(": आउट (sh" ls "" -a ") के आउटपुट को भेजकर ऐसा करने का एक तरीका है)' दूसरे को '(sh" grep "" डॉक्टर ")'? – shakedzy

+0

आप पिछली प्रक्रिया से ': आउट' के मान को पारित करने के लिए 'sh' के' इन 'विकल्प का उपयोग कर सकते हैं। हालांकि, इसका उपयोग करके आप एक प्रक्रिया से दूसरे प्रक्रिया में डेटा स्ट्रीमिंग की सुविधा खो देते हैं - आप सभी को बफर करेंगे एक प्रक्रिया से आउटपुट और जब यह खत्म हो जाता है तो आप अपनी सभी सामग्री को दूसरे में पास कर देंगे। शैल पाइपलाइनों का उपयोग करती है जहां डेटा को एक प्रक्रिया से दूसरी प्रक्रिया में स्ट्रीम किया जाता है, बिना सब कुछ बफर करने की आवश्यकता के। आप 'java.lang.Runtime.exec()' और 'java.lang.Process.getOutputStream' पहली प्रक्रिया से आउटपुट डेटा प्राप्त करने के लिए और इसे अगली तक पास करने के लिए, लेकिन क्लोजर 'sh' इसका समर्थन नहीं करता है। –

+1

आप https: // github पर भी एक नज़र डाल सकते हैं .com/Raynes/conch। यह पाइपलाइनों का समर्थन करता है: https://github.com/Raynes/conch#piping –

संबंधित मुद्दे