मैं वर्णों को एक कमांड में कैसे भेज सकता हूं जैसे कि वे एक फाइल से आए थे?
उदाहरण के लिए मैंने कोशिश की:
wc < "apple pear orange"
-bash: apple pear orange: No such file or directory
मैं वर्णों को एक कमांड में कैसे भेज सकता हूं जैसे कि वे एक फाइल से आए थे?
उदाहरण के लिए मैंने कोशिश की:
wc < "apple pear orange"
-bash: apple pear orange: No such file or directory
जवाबों:
गोले में, जो यहाँ तार का समर्थन करते हैं , सहित bash
, zsh
और ksh93
, आप उपयोग कर सकते हैं
wc <<< "apple pear orange"
दो अन्य दृष्टिकोण (जो बिना किसी अतिरिक्त प्रयास के कई-लाइन इनपुट की अनुमति देते हैं):
"यहाँ दस्तावेज़" का उपयोग करें:
$ wc << EOF सेब नाशपाती नारंगी EOF १ ३ १ 18 $
EOF
स्ट्रिंग एक सीमांकक है। आप किसी भी तार का उपयोग कर सकते हैं; EOF
सिर्फ एक पारंपरिक विकल्प है।
इनपुट के रूप में ट्टी का उपयोग करें:
$ wc सेब नाशपाती नारंगी Ctrl+D १ ३ १ 18 $
इसका दोष यह है कि प्रोग्राम चलना शुरू हो जाता है, और जैसे ही आप उसका नाम लिखते हैं, इनपुट पढ़ना शुरू कर देता है। यह डिस्कॉन्सरिंग हो सकता है; उदाहरण के लिए:
$ grep वी जल्दी भूरे रंग का लोमड़ी (टाइप किया हुआ) कूदता है (टाइप किया हुआ) कूदता है (यह ग्रीप से आउटपुट है!) आलसी कुत्ता। (टाइप किया हुआ) Ctrl + D (यहां कोई आउटपुट नहीं) $
<<<
फॉर्म बिना किसी अतिरिक्त प्रयास के कई-लाइन इनपुट की भी अनुमति देता है, क्योंकि "
--स्ट्रिंग स्ट्रिंग में नई सुर्खियाँ हो सकती हैं। << EOF
यदि आपके पास मल्टी-लाइन इनपुट है, तो निश्चित रूप से फॉर्म (यहां का मूल-डॉक सिंटैक्स) पढ़ना आसान है।
<<<
word
- निश्चित रूप से, शेल के संदर्भ में, word
एक उद्धृत स्ट्रिंग हो सकता है, जिसमें रिक्त स्थान और newlines होते हैं! डी 'ओह! यह इतना स्पष्ट है कि यह बिना कहे चला जाता है (और, वास्तव में, मुझे इसका उल्लेख मैन पेज में बिल्कुल नहीं दिखता)। :-( मुझे इस ओर इशारा करने के लिए धन्यवाद!
word
को मैनपेज में "शेल द्वारा एकल इकाई के रूप में माने जाने वाले पात्रों का एक क्रम" (उर्फ "टोकन") के रूप में परिभाषित किया गया है, और आपको यह जानना होगा कि उद्धृत स्ट्रिंग को प्रासंगिक अर्थ में "एकल इकाई" के रूप में माना जाता है (बाद में) बैकस्लैश प्रोसेसिंग, वैरिएबल एक्सपेंशन आदि। "लेकिन वास्तव में शेल में डबल-कोटिंग का पूरा उद्देश्य है। (एकल उद्धरण विस्तार से रक्षा करते हैं।) शेल का प्रोसेसिंग मॉडल बहुत अच्छी तरह से सोचा गया है, और सरल लेकिन कुछ भी नहीं है।
हालांकि यहां कई वैध समाधान हैं, एक और वाक्यविन्यास जो कभी-कभी उपयोगी हो सकता है, वह है कमांड चलाना <()
। यह आपको कमांड लाइन पर 1 से अधिक फ़ाइल-डिस्क्रिप्टर ऑब्जेक्ट बनाने की अनुमति देगा।
यह तब उपयोगी हो सकता है जब आप पाठ के लंबे तार की तुलना करने जैसा कुछ कर रहे हों, या यदि आप कुछ ऐसी सामग्री को अलग करना चाहते हैं जो किसी फ़ाइल में नहीं है।
उदाहरण के लिए, होस्ट्स फ़ाइल को लोकलहोस्ट पर कॉपी किए बिना दो नोड्स पर होस्ट फ़ाइलों की तुलना करना:
diff -Naur <(cat /etc/hosts) <(ssh -q otherhost 'cat /etc/hosts')
<
STDIN के लिए एक फ़ाइल पुनर्निर्देश, और ()
कोष्ठक के बीच कमांड को चलाने के लिए एक subshell पैदा करते हैं। यह उपखंड से उपजा है जो कि चलाए जा रहे कमांड के STDIN के पास है।
यह एक आसान तरीका है 1 कमांड से अधिक "इनपुट" फ़ाइल बनाने के लिए, जो यहां कई डॉक्स का उपयोग करने की कोशिश कर रहा है या अंतिम कमांड को एक पाइप लाइन के लिए कई कमांडों को गूंजने की कोशिश कर रहा है।
<fileorpathname
स्टड पुनर्निर्देशित <(subcmd)
करता है , लेकिन नहीं करता है; यह एक नाम को प्रतिस्थापित करता है, जब प्रोग्राम द्वारा खोला जाता है, तो सबकेड से stdout पढ़ सकता है। < <(subcmd)
(space आवश्यक) लगभग उस तरह से फ़ाइल से रीडायरेक्ट करता है subcmd |
। आप दोनों के तर्क को निर्दिष्ट करके स्टड से इसके एक इनपुट diff
को पढ़ सकते हैं , लेकिन दोनों को नहीं। -
cmd <(cmd2 ...)
और cmd < <(cmd2 ...)
। पूर्व में एक फ़ाइल नाम के स्थान पर व्युत्पन्न डेटा (cmd2 का आउटपुट) का उपयोग करने की अनुमति देता है। बाद वाले के बराबर है cmd2 ... | cmd
। कमांड को स्पष्ट रूप से स्टड इनपुट स्वीकार करने के लिए लिखा जाना चाहिए और कई नहीं हैं। यह विशेष रूप से शेल स्क्रिप्ट का सच है।
आप अपेक्षा के अनुरूप कुछ उपयोग करना चाह सकते हैं। रिमोट टेलनेट सत्र खोलने का एक सरल उदाहरण निम्नलिखित है, शीघ्र प्रतीक्षा करना, कुछ डेटा भेजना, प्रतिक्रिया की प्रतीक्षा करना, सोना और बाहर निकलना।
#!/usr/bin/expect
spawn telnet localhost 8555
expect "Escape character is '^]'."
send "Hello World\n"
expect "Connection closed by foreign host."
sleep 1