बैश शेल, पाइपिंग के बाद खाली होने वाला ऐररेटिव ऐरे


0

बैश 4.3.30

मान लें कि आपके पास निम्नलिखित कोड है:

#!/bin/bash

declare -A map

f() {
    map[x]=a
    map[y]=b
}

g() {
    for k in "${!map[@]}"
    do
        echo "$k --> ${map[$k]}"
    done
}

f
g

यह आउटपुट

x --> a
y --> b

अगर मैं उपर्युक्त कार्यक्रम को बदलूं f | g यह कुछ भी नहीं है।

मुझे लगता है कि वैश्विक दायरे में साहचर्य सरणी की घोषणा करने से मुझे अपने मूल्यों को कभी भी और कहीं भी उपयोग करने की अनुमति मिलेगी। मैंने पाइपलाइन और स्कोप के साथ अजीब समस्याओं के बारे में पढ़ा है लेकिन मैं एक समाधान का पता लगाने में असमर्थ रहा हूं।

जवाबों:


2

जहाँ आप घोषित करते हैं कि चर कोई मायने नहीं रखता है। f एक अलग प्रक्रिया में चलता है क्योंकि यह एक पाइपलाइन में है, इसलिए कोई भी परिवर्तन f बनाता है map अलग-थलग हैं उस प्रक्रिया। इस मामले में सुधार आसान है; f कोई आउटपुट नहीं देता है, इसलिए इसे कनेक्ट करने के लिए पाइप का उपयोग करने का कोई कारण नहीं है g। बस चलाते हैं f, फिर g

f; g

अगर मुझे इस्तेमाल करना है तो क्या होगा cat file.txt | f; g इसलिये f कुछ इनपुट की जरूरत है? g उस मामले में कुछ भी नहीं आउटपुट।
Banex

1
खैर, एक के लिए, का उपयोग करें f < file.txt नहीं cat, लेकिन सामान्य तौर पर, आप या तो उपयोग कर सकते हैं lastpipe विकल्प ताकि अंतिम मौजूदा प्रक्रिया में एक पाइप लाइन में कमांड ( shopt -s lastpipe; somecommand | f; g ), या पाइप के बजाय प्रक्रिया प्रतिस्थापन का उपयोग करें ( f < <(somecommand); g )।
chepner
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.