bash - गूंजने के लिए outputs गूंज




(9)

आप एक समारोह को परिभाषित कर सकते हैं:

echoerr() { echo "[email protected]" 1>&2; }
echoerr hello world

यह एक स्क्रिप्ट से तेज़ होगा और इसकी कोई निर्भरता नहीं होगी।

कैमिलो मार्टिन के बैश विशिष्ट सुझाव "यहां स्ट्रिंग" का उपयोग करते हैं और जो भी आप पास करते हैं उसे मुद्रित करेंगे, जिसमें तर्क (-n) शामिल हैं जो गूंज सामान्य रूप से निगलते हैं:

echoerr() { cat <<< "[email protected]" 1>&2; }

ग्लेन जैकमैन का समाधान समस्या निगलने के तर्क से भी बचाता है:

echoerr() { printf "%s\n" "$*" >&2; }

क्या कोई मानक बैश टूल है जो गूंज की तरह कार्य करता है लेकिन stdout की बजाय stderr पर आउटपुट करता है?

मुझे पता है कि मैं echo foo 1>&2 कर सकता हूं लेकिन यह थोड़ी बदसूरत है और, मुझे संदेह है, त्रुटि प्रवण (उदाहरण के लिए चीजों को बदलने पर गलत संपादित होने की अधिक संभावना है)।


इसका उत्तर पहले से ही और बहुत सारे वोटों के साथ दिया गया है। सिर्फ रिकार्ड के लिए:

echo "my errz" > /proc/self/fd/2

प्रभावी ढंग से stderr उत्पादन होगा। स्पष्टीकरण: /proc/self वर्तमान प्रक्रिया का एक लिंक है और /proc/self/fd प्रक्रिया फाइल डिस्क्रिप्टर खोला गया है। फिर, 0 , 1 , और 2 क्रमशः stdin , stdout और stderr के लिए खड़ा है।

मैंने इसे और अधिक पठनीय पाया। यह भी अधिकांश लिनक्स distibutions में काम कर सकते हैं:

echo "my errz" > /dev/stderr

इसे बहुत अधिक पठनीय बनाना।


एक स्क्रिप्ट बनाएं

#!/bin/sh
echo $* 1>&2

वह आपका टूल होगा।

या यदि आप अलग फ़ाइल में कोई स्क्रिप्ट नहीं चाहते हैं तो एक फ़ंक्शन बनाएं।


चूंकि 1 मानक आउटपुट है, इसलिए आपको इसे आउटपुट रीडायरेक्शन के सामने स्पष्ट रूप से नामित करने की आवश्यकता नहीं है > लेकिन इसके बजाय बस टाइप कर सकते हैं:

echo This message goes to stderr >&2

चूंकि आप चिंतित हैं कि 1>&2 आपके लिए विश्वसनीय रूप से टाइप करना मुश्किल होगा, अनावश्यक 1 का उन्मूलन आपके लिए थोड़ा सा प्रोत्साहन हो सकता है!


यदि आपको syslog पर संदेश लॉगिंग करने पर कोई फर्क नहीं पड़ता है, तो not_so_ugly तरीका है:

logger -s $msg

-s विकल्प का अर्थ है: "मानक त्रुटि के साथ-साथ सिस्टम लॉग के लिए संदेश आउटपुट करें।"


यह एक साधारण एसटीडीईआरआर फ़ंक्शन है, जो पाइप इनपुट को STDERR पर रीडायरेक्ट करता है।

#!/bin/bash
# *************************************************************
# This function redirect the pipe input to STDERR.
#
# @param stream
# @return string
#
function STDERR () {

cat - 1>&2

}

# remove the directory /bubu
if rm /bubu 2>/dev/null; then
    echo "Bubu is gone."
else
    echo "Has anyone seen Bubu?" | STDERR
fi


# run the bubu.sh and redirect you output
[email protected]:~$ ./bubu.sh >/tmp/bubu.log 2>/tmp/bubu.err

cat प्रयोग न करें क्योंकि यहां कुछ उल्लेख किए गए हैं। cat एक कार्यक्रम है जबकि echo और printf bash (खोल) buildins हैं। एक प्रोग्राम या एक अन्य स्क्रिप्ट लॉन्च करना (ऊपर वर्णित) का मतलब है कि इसकी सभी लागतों के साथ एक नई प्रक्रिया बनाएं। बिल्टिन का उपयोग करना, लेखन कार्य काफी सस्ते हैं, क्योंकि किसी प्रक्रिया (निष्पादन) को बनाने की आवश्यकता नहीं है (-इन्वायरमेंट)।

ओपनर पूछता है "क्या आउटपुट ( पाइप ) को stderr के लिए कोई मानक उपकरण है", schort उत्तर है: नहीं ... क्यों? ... rediredcting पाइप यूनिक्स (लिनक्स ...) और bash (sh) जैसे सिस्टम में एक असाधारण अवधारणा है इन अवधारणाओं पर बनाता है।

मैं सलामी बल्लेबाज से सहमत हूं कि इस तरह की टिप्पणियों के साथ पुनर्निर्देशन: &2>1 आधुनिक प्रोग्रामर के लिए बहुत सुखद नहीं है, लेकिन यह बाश है। बैश का उद्देश्य विशाल और मजबूत कार्यक्रम लिखना नहीं था, इसका उद्देश्य प्रशासकों को कम कीप्रेस के साथ काम करने में मदद करना है ;-)

और कम से कम, आप लाइन में कहीं भी पुनर्निर्देशन रख सकते हैं:

$ echo This message >&2 goes to stderr 
This message goes to stderr

read एक शेल बिल्टिन कमांड है जो stderr को प्रिंट करता है, और रीडायरेक्शन चाल के बिना गूंज की तरह इस्तेमाल किया जा सकता है:

read -t 0.1 -p "This will be sent to stderr"

-t 0.1 एक टाइमआउट है जो पढ़ने की मुख्य कार्यक्षमता को अक्षम करता है, जो एक चर में stdin की एक पंक्ति संग्रहीत करता है।


मैक ओएस एक्स: मैंने स्वीकृत उत्तर और कुछ अन्य उत्तरों की कोशिश की और उन सभी ने मेरे मैक पर STDOUT नहीं STDOUT लिखने का परिणाम दिया।

पर्ल का उपयोग कर मानक त्रुटि को लिखने के लिए यहां एक पोर्टेबल तरीका है:

echo WARNING! | perl -ne 'print STDERR'




bash