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




(11)

एक अन्य विकल्प

echo foo >>/dev/stderr

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

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


नहीं, यह करने का मानक तरीका है। यह त्रुटियों का कारण नहीं बनना चाहिए।


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

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

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


यह सवाल पुराना है, लेकिन आप ऐसा कर सकते हैं, जो पढ़ने की सुविधा प्रदान करता है:

>&2 echo "error"

ऑपरेटर >&2 शाब्दिक अर्थ है फ़ाइल कमांडर 1 ( stdout ) के पते को उस आदेश 1 के लिए फ़ाइल वर्णनकर्ता 2 ( stderr ) के पते पर पुनर्निर्देशित करें। इस पर निर्भर करते हुए कि आप इसे कितना गहराई से समझना चाहते हैं, इसे पढ़ें: http://wiki.bash-hackers.org/howto/redirection_tutorial

अन्य पुनर्निर्देशन के साथ बातचीत से बचने के लिए सबहेल का उपयोग करें

(>&2 echo "error")

1 >&2 प्रतियां फाइल डिस्क्रिप्टर # 2 फ़ाइल डिस्क्रिप्टर # 1 फ़ाइल करने के लिए। इसलिए, इस पुनर्निर्देशन के बाद, दोनों फ़ाइल डिस्क्रिप्टर एक ही फ़ाइल का संदर्भ लेंगे: एक फ़ाइल वर्णनकर्ता # 2 मूल रूप से संदर्भित था।


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

echo This message goes to stderr >&2

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


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

इरादे और स्रोत को लागू करने के लिए एक फ़ंक्शन का उपयोग करें जो आप चाहते हैं। उदाहरण के लिए

#!/bin/bash

[ -x error_handling ] && . error_handling

filename="foobar.txt"
config_error $filename "invalid value!"

output_xml_error "No such account"

debug_output "Skipping cache"

log_error "Timeout downloading archive"

notify_admin "Out of disk space!"

fatal "failed to open logger!"

और error_handling होने:

[email protected]

config_error() { filename="$1"; shift; echo "Config error in $filename: $*" 2>&1; }

output_xml_error() { echo "<error>$*</error>" 2>&1; }

debug_output() { [ "$DEBUG"=="1" ] && echo "DEBUG: $*"; }

log_error() { logger -s "$*"; }

fatal() { which logger >/dev/null && logger -s "FATAL: $*" || echo "FATAL: $*"; exit 100; }

notify_admin() { echo "$*" | mail -s "Error from script" "$ADMIN_EMAIL"; }

ओपी में चिंताओं को संभालने के कारण:

  • सबसे अच्छा वाक्यविन्यास संभव (बदसूरत प्रतीकों के बजाय सार्थक शब्द)
  • एक त्रुटि करने के लिए कठिन (विशेष रूप से यदि आप स्क्रिप्ट का पुन: उपयोग करते हैं)
  • यह मानक बैश उपकरण नहीं है, लेकिन यह आपके या आपकी कंपनी / संगठन के लिए मानक शैल लाइब्रेरी हो सकता है

अन्य कारण:

  • स्पष्टता - अन्य रखरखाव करने वालों के लिए इरादे दिखाती है
  • गति - कार्य शैल स्क्रिप्ट से तेज़ होते हैं
  • पुन: प्रयोज्यता - एक फ़ंक्शन एक और फ़ंक्शन कॉल कर सकता है
  • कॉन्फ़िगरेशन - मूल स्क्रिप्ट को संपादित करने की आवश्यकता नहीं है
  • डिबगिंग - किसी त्रुटि के लिए ज़िम्मेदार रेखा को ढूंढना आसान है (विशेष रूप से यदि आप रीडायरेक्टिंग / फ़िल्टरिंग आउटपुट के टन के साथ मर रहे हैं)
  • मजबूती - यदि कोई फ़ंक्शन गुम है और आप स्क्रिप्ट को संपादित नहीं कर सकते हैं, तो आप उसी नाम के साथ बाहरी टूल का उपयोग करने के लिए वापस आ सकते हैं (उदाहरण के लिए लॉग_error को लिनक्स पर लॉगर करने के लिए अलिया किया जा सकता है)
  • स्विचिंग कार्यान्वयन - आप पुस्तकालय के "एक्स" विशेषता को हटाकर बाहरी उपकरणों पर स्विच कर सकते हैं
  • आउटपुट अज्ञेयवादी - अगर आपको एसटीडीईआरआर या अन्य जगहों पर जाना है तो आपको अब परवाह नहीं है
  • वैयक्तिकृत करना - आप पर्यावरण चर के साथ व्यवहार को कॉन्फ़िगर कर सकते हैं

यह एक साधारण एसटीडीईआरआर फ़ंक्शन है, जो पाइप इनपुट को 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

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

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

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

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

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

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

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

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

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

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

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


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

logger -s $msg

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


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




bash