शेल फ़ीचर का नाम क्या है `> (tee copyError.txt> & 2)`?


11

मुझे लॉगआउट करने के लिए stdout और stderr को लॉग इन करने की आवश्यकता है, लेकिन केवल स्क्रीन पर त्रुटि संदेश दिखाते हैं। मैं इसके साथ कर सकता हूं:

cp -rpv a/* b 1> copyLog.txt 2> >(tee copyError.txt >&2) 

जो मुझे वेब में कहीं मिला।

मैं सिर्फ यह जानना चाहता हूं कि इस >(tee copyError.txt >&2)चीज को कैसे कहा जाता है? मैं इसके लिए Google नहीं कर सकता, क्योंकि Google कोण कोष्ठक और कोष्ठक जैसे वर्णों की उपेक्षा करता है।


फ़ाइल पुनर्निर्देशन ( tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html )
कार्तिक

@terdon मुझे लगता है कि ओपी ने कहा है कि वह StdOut और StdErr को फ़ाइलों में लॉग इन करना चाहता था, लेकिन फिर भी स्क्रीन पर StdErr
दिमित्री एवोन्टोमोव

जवाबों:


11

से man bash:

   Process Substitution
       Process substitution is supported  on  systems  that  support
       named  pipes  (FIFOs)  or  the  /dev/fd method of naming open
       files.  It takes the form of <(list) or >(list).  The process
       list  is  run with its input or output connected to a FIFO or
       some file in /dev/fd.  The name of this file is passed as  an
       argument  to  the current command as the result of the expan
       sion.  If the >(list) form is used, writing to the file  will
       provide  input  for  list.   If the <(list) form is used, the
       file passed as an argument should be read to obtain the  out
       put of list.

आप /अपने खोज स्ट्रिंग को दबाकर और फिर मैनपेज खोज सकते हैं , जो इस तरह की जानकारी खोजने का एक अच्छा तरीका है। यह जरूर है कि आपको यह पता होना चाहिए कि किस मेन्यू में सर्च करना है :)

आपको (हालांकि उद्धृत करना होगा , क्योंकि खोज करते समय इसका एक विशेष अर्थ है। बैश मैनपेज में संबंधित अनुभाग को खोजने के लिए, टाइप करें />\(


मैं बहुत मार-पीट करता हूं, इसलिए मैंने एक आदमी को bash> bashman.txt किया और इसे केवल पढ़ा। अब, मैं अपने पाठ संपादक (केवल पढ़ने के लिए) में अन्य विंडो में bashman.txt लोड कर सकता हूं और खोज और कॉपी और पेस्ट करने के लिए संपादक की सभी सुविधाओं का उपयोग कर सकता हूं।
जो

8

>(tee copyError.txt >&2) वास्तव में कुछ अलग विशेषताएं हैं:

  • >(...)'प्रक्रिया प्रतिस्थापन' कहलाता है। यह एक नामित पाइप फ़ाइल बनाता है /dev/fdऔर उस फ़ाइल को लिखने से कोष्ठकों में प्रक्रिया को इनपुट मिलेगा।

  • >: सामान्य तौर पर, इसे 'आउटपुट रिडायरेक्शन' कहा जाता है और आपको फ़ाइल या प्रक्रिया में मानक आउटपुट ( >या 1>) या मानक त्रुटि ( 2>) भेजने की अनुमति मिलती है। >&2आउटपुट पुनर्निर्देशन है, लेकिन इस मामले में, का आउटपुट teeमानक त्रुटि पर भेजा जाता है (यह वही &2है, &1जो मानक आउटपुट है)

  • बिना >, कोष्ठक ( ()) एक उपधारा शुरू करेगा। कोष्ठक में कमांड चलाने से एक और शेल होगा जो केवल तब तक मौजूद रहेगा जब तक कि वे कमांड चल रहे हों। आप देख सकते हैं कि यह कैसे काम करता है यदि आप उप-संस्करण में एक चर घोषित करते हैं:

    $ foo='Tom';(foo='Dick'; echo "Sub: $foo"); echo "Orig: $foo"
    Sub: Dick
    Orig: Tom

    जैसा कि आप देख सकते हैं, $fooकि उपधारा में परिभाषित किया गया था, मूल शेल में परिभाषित एक से अलग है।


4
कोई >(...)पुनर्निर्देशन नहीं है। >(...)एक फ़ाइल नाम के लिए विस्तारित किया गया है। यदि आप आउटपुट को पुनर्निर्देशित करना चाहते हैं , तो आपको आवश्यकता है > >(...)लेकिन >(...)आमतौर पर इसका उपयोग किया जाता है जहां पुनर्निर्देशन का उपयोग नहीं किया जा सकता है। ओपी की कमान पारंपरिक पाइपों के साथ प्राप्त की जा सकती है, वहां प्रक्रिया प्रतिस्थापन की आवश्यकता नहीं है।
स्टीफन चेज़लस

@ स्टेफेनचैचेलस आपके मन में जो समाधान था उसे देखकर अच्छा लगेगा
दिमित्री एवोन्टोमोव

3
@ शंख,cmd 2>&1 > output | tee err >&2
स्टीफन चेज़लस

@ स्टेफेनचैचेलस thx!
दिमित्री एवोन्टोमोव

इस उत्तर की पहली छमाही गलत है, या कम से कम अत्यधिक भ्रामक है; यह सच है कि >आउटपुट-पुनर्निर्देशन ()को निरूपित कर सकता है और यह एक उपधारा को निरूपित कर सकता है, लेकिन >(...)वास्तव में एक एकल, एकात्मक विशेषता है जिसमें शामिल नहीं है >और ()
बरबाद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.