एक समारोह में स्थानीय रूप से बैश स्क्रिप्टिंग गूंज


13

बैश लिपियों में मैं अपने चरों को स्थानीय कार्यों के लिए रखने की कोशिश करता हूँ जहाँ भी मैं कर सकता हूँ और फिर पास कर सकता हूँ जो मुझे बलो जैसे कार्यों से बाहर चाहिए

#!/bin/bash

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"   # return this variable
}

GLOBAL=$(FUNCTION)

echo "$GLOBAL"

लेकिन क्या ऐसा करना संभव है, जबकि फ़ंक्शन के स्वयं के इकोस भी शामिल हैं ताकि यदि फ़ंक्शन के पास आउटपुट के लिए स्वयं संदेश हैं, तो मुझे उन्हें एक चर में पकड़ना नहीं है

#!/bin/bash

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"                      # return this variable
    echo "This function is done now"   # do not return this variable
}

GLOBAL=$(FUNCTION)

echo "$GLOBAL"                         # should only echo 'value'

1
अरे तुम लोग पुराने, गैर-पॉसिक्स function foo()सिंटैक्स का उपयोग क्यों कर रहे हो ? आप 9 कम कीपंच के साथ बेहतर पोसिक्स संगतता प्राप्त कर सकते हैं।
आर्थर

2
यह वाक्य रचना मेरे लिए अधिक परिचित है
TheLovelySausage

1
@ Arthur2e5 प्राथमिक रूप से क्योंकि "[a-zA-Z0-9] + \ _ (\) \" की तुलना में "फ़ंक्शन" टाइप करना आसान है, कोड के माध्यम से खोजते समय
एलेक्स जेनसेन

जवाबों:


17

यदि आप सही आउटपुट स्ट्रीम पर कब्जा करते हैं, तो फ़ंक्शन द्वारा मुद्रित कुछ भी कैप्चर किया जा सकता है। तो कुछ को प्रिंट करने और कुछ अन्य आउटपुट को सहेजने का सबसे आसान तरीका मानक त्रुटि के लिए उत्कृष्ट उत्पादन को पुनर्निर्देशित करना है:

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"
    echo "This function is done now" >&2
}

एक अन्य संभावना लॉग संदेश को सीधे प्रिंट करने के बजाय किसी फ़ाइल में लॉग इन करना है, उदाहरण के लिए कुछ इस तरह से उपयोग करना:

log() {
    printf '%s\n' "$@" > my.log
}

उस ने कहा, बैश फंक्शन चर नहीं लौटा सकते । केवल वास्तविक "वापसी" मान निकास कोड है। इस कारण से, ( और कई अन्य ), यदि आप विश्वसनीय लॉगिंग, रिटर्न मान, अपवाद हैंडलिंग और अधिक चाहते हैं तो आप पायथन, रूबी या जावा जैसी किसी अन्य भाषा का उपयोग करना चाहेंगे।


6

आप मानक त्रुटि पर जानकारी संदेश प्रस्तुत कर सकते हैं:

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"                      # return this variable
    echo "This function is done now" > /dev/stderr  # goes to the screen
}

कुछ अन्य सुझाव इस लिनक्स जर्नल लेख में हैं : वैश्विक चर का उपयोग करें (जिसका आपने उल्लेख किया है कि आप पसंद नहीं करते हैं), या परिणाम में वापस आने के लिए चर का नाम पारित करें।


/dev/stderrअंक 2 को fd और अभी भी पुनर्निर्देशित किया जा सकता है &>blahया 2>blah/dev/ttyशायद अच्छा हो।
आर्थर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.