मैं वर्णों को एक कमांड में कैसे भेज सकता हूं जैसे कि वे एक फाइल से आए थे?


22

मैं वर्णों को एक कमांड में कैसे भेज सकता हूं जैसे कि वे एक फाइल से आए थे?

उदाहरण के लिए मैंने कोशिश की:

wc < "apple pear orange"
-bash: apple pear orange: No such file or directory

जवाबों:



18

दो अन्य दृष्टिकोण (जो बिना किसी अतिरिक्त प्रयास के कई-लाइन इनपुट की अनुमति देते हैं):

  1. "यहाँ दस्तावेज़" का उपयोग करें:

    $ wc << EOF
    सेब नाशपाती नारंगी
    EOF
      १ ३ १ 18
    $

    EOFस्ट्रिंग एक सीमांकक है। आप किसी भी तार का उपयोग कर सकते हैं; EOFसिर्फ एक पारंपरिक विकल्प है।

  2. इनपुट के रूप में ट्टी का उपयोग करें:

    $ wc
    सेब नाशपाती नारंगी
    Ctrl+D
      १ ३ १ 18
    $

    इसका दोष यह है कि प्रोग्राम चलना शुरू हो जाता है, और जैसे ही आप उसका नाम लिखते हैं, इनपुट पढ़ना शुरू कर देता है। यह डिस्कॉन्सरिंग हो सकता है; उदाहरण के लिए:

    $ grep वी
    जल्दी भूरे रंग का लोमड़ी              (टाइप किया हुआ) 
    कूदता है                       (टाइप किया हुआ) 
    कूदता है                       (यह ग्रीप से आउटपुट है!) 
    आलसी कुत्ता।                   (टाइप किया हुआ)
    Ctrl + D
                                    (यहां कोई आउटपुट नहीं) 
    $

रिकॉर्ड के लिए: <<<फॉर्म बिना किसी अतिरिक्त प्रयास के कई-लाइन इनपुट की भी अनुमति देता है, क्योंकि "--स्ट्रिंग स्ट्रिंग में नई सुर्खियाँ हो सकती हैं। << EOFयदि आपके पास मल्टी-लाइन इनपुट है, तो निश्चित रूप से फॉर्म (यहां का मूल-डॉक सिंटैक्स) पढ़ना आसान है।
एलेक्सिस

मैन पेज कहता है कि यहां स्ट्रिंग सिंटैक्स है <<< word- निश्चित रूप से, शेल के संदर्भ में, wordएक उद्धृत स्ट्रिंग हो सकता है, जिसमें रिक्त स्थान और newlines होते हैं! डी 'ओह! यह इतना स्पष्ट है कि यह बिना कहे चला जाता है (और, वास्तव में, मुझे इसका उल्लेख मैन पेज में बिल्कुल नहीं दिखता)। :-( मुझे इस ओर इशारा करने के लिए धन्यवाद!
जी-मैन कहते हैं, 'मोनिका' को पुनः स्थापित करें '

मैं इसे सरल या स्पष्ट नहीं कहूंगा, वास्तव में। ए wordको मैनपेज में "शेल द्वारा एकल इकाई के रूप में माने जाने वाले पात्रों का एक क्रम" (उर्फ "टोकन") के रूप में परिभाषित किया गया है, और आपको यह जानना होगा कि उद्धृत स्ट्रिंग को प्रासंगिक अर्थ में "एकल इकाई" के रूप में माना जाता है (बाद में) बैकस्लैश प्रोसेसिंग, वैरिएबल एक्सपेंशन आदि। "लेकिन वास्तव में शेल में डबल-कोटिंग का पूरा उद्देश्य है। (एकल उद्धरण विस्तार से रक्षा करते हैं।) शेल का प्रोसेसिंग मॉडल बहुत अच्छी तरह से सोचा गया है, और सरल लेकिन कुछ भी नहीं है।
एलेक्सिस

@alexis: जब मैं उस तरह शीर्ष पर जाता हूं और एक इमोटिकॉन शामिल करता हूं, तो किसी को इस संभावना पर विचार करना चाहिए कि मैं विडंबनापूर्ण हूं।
जी-मैन

10

हालांकि यहां कई वैध समाधान हैं, एक और वाक्यविन्यास जो कभी-कभी उपयोगी हो सकता है, वह है कमांड चलाना <()। यह आपको कमांड लाइन पर 1 से अधिक फ़ाइल-डिस्क्रिप्टर ऑब्जेक्ट बनाने की अनुमति देगा।

यह तब उपयोगी हो सकता है जब आप पाठ के लंबे तार की तुलना करने जैसा कुछ कर रहे हों, या यदि आप कुछ ऐसी सामग्री को अलग करना चाहते हैं जो किसी फ़ाइल में नहीं है।

उदाहरण के लिए, होस्ट्स फ़ाइल को लोकलहोस्ट पर कॉपी किए बिना दो नोड्स पर होस्ट फ़ाइलों की तुलना करना:

diff -Naur <(cat /etc/hosts) <(ssh -q otherhost 'cat /etc/hosts')

<STDIN के लिए एक फ़ाइल पुनर्निर्देश, और ()कोष्ठक के बीच कमांड को चलाने के लिए एक subshell पैदा करते हैं। यह उपखंड से उपजा है जो कि चलाए जा रहे कमांड के STDIN के पास है।

यह एक आसान तरीका है 1 कमांड से अधिक "इनपुट" फ़ाइल बनाने के लिए, जो यहां कई डॉक्स का उपयोग करने की कोशिश कर रहा है या अंतिम कमांड को एक पाइप लाइन के लिए कई कमांडों को गूंजने की कोशिश कर रहा है।


<fileorpathnameस्टड पुनर्निर्देशित <(subcmd)करता है , लेकिन नहीं करता है; यह एक नाम को प्रतिस्थापित करता है, जब प्रोग्राम द्वारा खोला जाता है, तो सबकेड से stdout पढ़ सकता है। < <(subcmd)(space आवश्यक) लगभग उस तरह से फ़ाइल से रीडायरेक्ट करता है subcmd |। आप दोनों के तर्क को निर्दिष्ट करके स्टड से इसके एक इनपुट diffको पढ़ सकते हैं , लेकिन दोनों को नहीं। -
dave_thompson_085

यह प्रक्रिया प्रतिस्थापन है जो समर्थित नहीं है, आपके द्वारा दावा किए गए भागों के विपरीत इसे बंद कर दिया गया है (लेकिन यह उतना स्पष्ट नहीं है)।
phk

1
उबंटू 16.04, और सोलारिस 11.2 सिस्टम पर मेरे द्वारा किए गए टेस्ट में मेरे डिस्क्स ठीक काम करते हैं। यह संभव है कि यह सभी ऑपरेटिंग सिस्टम पर सभी गोले के लिए काम न करे। यह वास्तव में फ़ाइल डिस्क्रिप्टर बना रहा है जिसका उपयोग उपप्रकार से आउटपुट को पढ़ने के लिए किया जा सकता है जैसे कि यह एक फ़ाइल पढ़ रहा था। चूंकि अंतर दो फ़ाइल तर्क लेता है, यह बनाए गए फ़ाइल विवरणकों के माध्यम से दोनों उपप्रकारों के आउटपुट को पढ़ने में सक्षम है, और उनकी तुलना करें।
टिम केनेडी

आप अपने जवाब देने के लिए बीच का अंतर जोड़ने के लिए इच्छा हो सकती है cmd <(cmd2 ...)और cmd < <(cmd2 ...)। पूर्व में एक फ़ाइल नाम के स्थान पर व्युत्पन्न डेटा (cmd2 का आउटपुट) का उपयोग करने की अनुमति देता है। बाद वाले के बराबर है cmd2 ... | cmd। कमांड को स्पष्ट रूप से स्टड इनपुट स्वीकार करने के लिए लिखा जाना चाहिए और कई नहीं हैं। यह विशेष रूप से शेल स्क्रिप्ट का सच है।
डोकलासवगर

8

आप एक पाइप का उपयोग कर सकते हैं

echo "apple pear orange" | wc

8
एक पाइप ist "फ़ाइल से पढ़ने" के समान नहीं है। उदाहरण के लिए आप एक पाइप में पीछे की ओर नहीं तलाश सकते हैं, जबकि आप एक फाइल में कर सकते हैं।
rbialon

0

आप अपेक्षा के अनुरूप कुछ उपयोग करना चाह सकते हैं। रिमोट टेलनेट सत्र खोलने का एक सरल उदाहरण निम्नलिखित है, शीघ्र प्रतीक्षा करना, कुछ डेटा भेजना, प्रतिक्रिया की प्रतीक्षा करना, सोना और बाहर निकलना।

#!/usr/bin/expect
spawn telnet localhost 8555
expect "Escape character is '^]'."
send "Hello World\n"
expect "Connection closed by foreign host."
sleep 1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.