कैसे बताएं कि पुनर्निर्देशन ऑपरेटर के साथ कमांड को किस पैरामीटर की आपूर्ति की जा रही है?


9

यह काम:

$ गूंज "सूचना भेजें-हेलो" | अब से

यह नहीं है:

अभी $ पर <echo "सूचना भेजें-हेलो"

यह कहता है 'फ़ाइल या निर्देशिका नहीं मिली "।

मैं समझता हूं कि -fइस कमांड का एक विकल्प है, जिसके साथ मैं किसी दिए गए क्षण में फ़ाइल को निष्पादित कर सकता हूं।

तो यह मुझे सोच रहा था ... सामान्य तौर पर, मुझे कैसे पता चलता है कि किस पैरामीटर के लिए पुनर्निर्देशन ऑपरेटर मूल्य की आपूर्ति करते हैं?


5
आपका प्रश्न बहुत स्पष्ट नहीं है। आपको "किस पैरामीटर" से क्या मतलब है। आपका मुद्दा शायद यह है कि आप (गलती से) ऐसा सोचते हैं foo | barऔर bar < fooसमान हैं। वो नहीं हैं।
टेराडॉन

जवाबों:


16

आप यहां दो अलग-अलग चीजों का उपयोग कर रहे हैं और एक तिहाई का उपयोग करना चाहिए। चलो देखते हैं:

  1. |: यह पाइप ऑपरेटर है, यह एक प्रक्रिया के आउटपुट को दूसरे के इनपुट के रूप में पारित करने का कार्य करता है:

    foo | bar

    यह प्रोग्राम चलाता है और प्रोग्राम के fooइनपुट के रूप में इसका आउटपुट पास करता है bar

  2. >, <, >>और <<: ये हैं पुनर्निर्देशन ऑपरेटरों , वे से / को डेटा भेजने के की सेवा फ़ाइलें :

    • foo > bar: प्रोग्राम चलाता है fooऔर फ़ाइल में इसके आउटपुट को सेव करता हैbar , इसकी सामग्री को ओवरराइट करके 1 करता है और अगर यह मौजूद नहीं है तो इसे बनाता है।

    • foo >> bar: प्रोग्राम चलाता है fooऔर फ़ाइल में इसके आउटपुट को सेव करता हैbar , इसके कंटेंट के साथ जुड़ता है और अगर मौजूद नहीं है तो इसे बनाता है।

    • foo < bar: चलाता है foo, यह फ़ाइल से इनपुट पढ़ने के लिए कह रहा है bar

    • यह <<एक विशेष मामला है, क्योंकि कमांड के लिए "एप्लाइड" इनपुट का कोई मतलब नहीं है, <<मुख्य रूप से (विशेष रूप से AFAIK) का उपयोग यहां दस्तावेजों के लिए किया जाता है :

      $ cat << EOF > file.txt
      > Hello World!
      > EOF
      

      निर्माण << SomeStringHere > Out.fileतब तक लिखे गए सभी पाठ को पुनर्निर्देशित करेगा जब तक कि वह समाप्त स्ट्रिंग ( EOFऊपर के उदाहरण में) को लक्ष्य फ़ाइल में न मिला दे। यहां डॉक्स आपको आसानी से मल्टी-लाइन स्ट्रिंग्स को प्रारूपित करने की अनुमति देता है और इसमें चर और विशेष वर्ण शामिल होते हैं।

  3. <<<ऑपरेटर, यहाँ स्ट्रिंग , एक यहाँ दस्तावेज की तरह है, लेकिन यह चर फैलता है। इसलिए, उदाहरण के लिए:

    grep foo <<< "$bar"

    ऊपर दिए गए आदेश के बराबर है echo "$bar" | grep foo

  4. जो आप वास्तव में देख रहे हैं उसे प्रक्रिया प्रतिस्थापन कहा जाता है और कमांड के आउटपुट को दूसरे में पारित करने का एक और तरीका है। इसमें शामिल हैं <(command)

    foo <(bar) 

    तो, आपके atउदाहरण के लिए, आप कर सकते हैं

    at now < <(echo "notify-send HELLO")

    उपरोक्त काम करता है क्योंकि प्रक्रिया प्रतिस्थापन वास्तव में एक फ़ाइल बनाता है (अधिक विवरण के लिए ऊपर दिए गए लिंक को पढ़ें) और यह उस फ़ाइल का फ़ाइल विवरणक है जिसे इसके साथ पारित किया <गया है at now


1 डिफ़ॉल्ट व्यवहार को अधिलेखित करना है, इसे noclobberबैश करने के विकल्प को सेट करके संशोधित किया जा सकता है । यदि सेट है, echo foo > barतो barमौजूद होने पर विफल हो जाएगा । उस मामले में, इसके echo foo |> barबजाय इसका उपयोग करने के लिए मजबूर किया जा सकता है । यहां खंड 3.6.2 देखें ।


1
अच्छा उत्तर! बहुत अच्छी तरह से (विशेष रूप से फ़ाइल पुनर्निर्देशकों के बीच के अंतरों सहित)
स्टीलड्रिव

@steeldriver aww, shucks, धन्यवाद :) और इसी तरह से यह सराहनीय रत्न था। काश, मैं आपको आपके समाधान से बचने वाले विभिन्न नुकसानों में से प्रत्येक के लिए एक +1 दे सकता था।
टेराडॉन

क्या आप कृपया विस्तार से कुछ जानकारी <<और <<<(जिसके उत्तर में @steeldriver का उल्लेख किया गया है) को शामिल कर सकते हैं। इसके अलावा, वहाँ अधिक हैं - >>>>>>या कुछ और <<<<<<<<<<?
आदित्य

@ आदित्य ने किया। और चिंता मत करो, यह <<<:) पर बंद हो जाता है
टेराडॉन

12

इस मामले में, एक फ़ाइल नहीं echo "notify-send HELLO"है एक प्रक्रिया है - इसलिए आपको फ़ाइल पुनर्निर्देशन के बजाय एक प्रक्रिया प्रतिस्थापन की आवश्यकता है

at now < <(echo "notify-send HELLO")

आप पूरी तरह से कमांड से बचने के लिए यहां एक स्ट्रिंग का उपयोग कर सकते हैंecho

at now <<< "notify-send HELLO"

5
आप जिस तरह के प्रश्नों को पसंद करते हैं, उन्हें देखते हुए (मैं जो भी करता हूं) मुझे लगता है कि आपको यूनिक्स और लिनक्स पर कुछ और समय बिताना चाहिए । हम रहते हैं और वहाँ पर शांत खोल चाल के लिए मर जाते हैं ..
टेराडॉन

@terdon: perl golfers के लिए एक ही बात?
सिल्वेन पिनेउ

1
@ सिल्वैनपीनो ऊह योह। बहुत ज़्यादा :)। गंभीरता से, जिस तरह का सवाल है, आप स्टीलड्राइवर और मुझे पसंद है, वहां पर बहुत अधिक सामान्य है। यह स्थान कमांडलाइन के जीक्स से भरा है , जिनमें से कुछ बेतुके जानकार हैं।
टेराडॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.