मतलब '2>> (कमांड)' बैश में पुनर्निर्देशन


18

कुछ समय पहले मैंने एक स्क्रिप्ट बनाई और मैंने उसके चारों ओर कुछ लॉगिंग जोड़ दी, लेकिन मैं भूल गया कि लॉगिंग के लिए पुनर्निर्देशन कैसे किया जाता है :-(

इसका सार यह है:

#!/bin/bash

LOGFILE=/some/path/mylogfile

(
  # here go my commands which produce some stdout
  # and, if something goes wrong, also some stderr
) 1>>${LOGFILE} 2> >( tee -a ${LOGFILE} >&2 )

जब मैं स्क्रिप्ट चलाता हूं, तो यह कुछ भी प्रिंट नहीं करता है stdout, लेकिन केवल प्रिंट करता है कि क्या होता है stderr। Logfile ${LOGFILE}stdout और stderr दोनों को कैप्चर करता है।

जब मैं स्क्रिप्ट चलाता हूं और मेरे टर्मिनल पर कोई आउटपुट नहीं है, तो मुझे पता है कि सब कुछ ठीक है। यदि कोई आउटपुट है, तो मुझे पता है कि कुछ गलत हो गया है और मैं लॉगफाइल की जांच कर पता लगा सकता हूं कि समस्या क्या है।

पुनर्निर्देशन का वह हिस्सा जो अब मुझे पहेली बना रहा है: 2> >( some command )

क्या कोई समझा सकता है कि वहां क्या चल रहा है?

जवाबों:


23

>(...)प्रक्रिया प्रतिस्थापन कहा जाता है । यह "बाहरी" प्रोग्राम को "इनर" प्रोग्राम को लिखने देता है जैसे कि यह एक फाइल था।

इस मामले में यह लिख रहा है stderrकि tee -a ${LOGFILE} >&2कौन आगे बढ़ेगा LOGFILEऔर फिर सब कुछ वापस लिख देगा stderr

पुनर्निर्देशन ऑपरेटर प्रक्रिया प्रतिस्थापन के लिए किसी भी दिशा में जा सकता है, इसलिए आप इसे इस उदाहरण में लिख सकते हैं, या <(...)इसे पढ़ने के लिए उपयोग कर सकते हैं, जो कि एक आसान तरीका है, उदाहरण के लिए, whileइसे बिना किसी उपश्रेणी के चल रहा है। अपने आप।


5
समझ गया :-) अगर मैं निष्पादित करता हूं echo <(date), तो यह मुझे प्रतिस्थापित फ़ाइल का नाम देता है /dev/fd/63:। अगर मैं निष्पादित करता हूं cat <(date), तो यह मुझे तारीख, यानी प्रतिस्थापित फ़ाइल की सामग्री देता है Fri Nov 18 14:11:09 NZDT 2016:।
NZD

@ एनजेडडी, हाँ - लेकिन कल्पना न करें कि यह एक नियमित फ़ाइल है - जो आप देख रहे हैं /devवह प्रक्रियाओं के बीच पाइप के लिए एक नाम है।
टोबी स्पाइट नाइट

क्या इस तकनीक का उपयोग किया जाता है क्योंकि स्टडर को पाइप नहीं किया जा सकता है ( teeइस मामले में)?
ब्ली

@bli हाँ, चूंकि stdout पहले से ही कहीं और पुनर्निर्देशित किया जा रहा है, इसलिए मुझे ऐसा लगता है जैसे teestderr के लिए सबसे सीधा रास्ता है और इसे stdout से अलग रखना है।
एरिक रेनॉफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.