मैं कुछ चरों को छोड़कर सभी पर्यावरण चर मुद्रित करना चाहता हूं।

इसलिए मुझे स्टैक ओवरफ्लो पर एक समाधान मिला: नाम

while IFS='=' read -r name value; do
    if [ ! "$name" = "SOMEVAR" -a ! "$name" = "SOMEOTHERVAR" ]; then
        echo "$name=$value"
    fi
done < <(env)

हालाँकि यह काम नहीं करता है यदि मेरे पर्यावरण चर में नई पंक्तियाँ हैं, जैसे:

export SOMEVAR="some
text with
newlines"

उपरोक्त समाधान के साथ यह प्रिंट होगा:

text with=
newlines=
PWD=/home/...
...

मैंने sed के साथ नल-टर्मिनेटेड स्ट्रिंग्स और मल्टीलाइन मिलान का उपयोग करने का भी प्रयास किया:

env -0 | sed -e '{N; s@SOMEVAR.*\x0@@ ; D}' | tr '\0' '\n'

लेकिन यह आउटपुट को काट देता है और हमेशा एक चर की अंतिम पंक्ति को पहले मल्टीलाइन सामग्री के साथ प्रिंट करता है:

newlines
PWD=/home/...
...

क्या उन्हें प्रिंट करते समय मल्टीलाइन पर्यावरण चर को छोड़ने का कोई तरीका है?

1
m13r 17 जून 2019, 17:24

2 जवाब

सबसे बढ़िया उत्तर

आपके पास लगभग यह था, आपको बस env -0 के आउटपुट पर एक रीड कमांड और नल डिलीमीटर के साथ लूप करना होगा और रेगेक्स ऑपरेटर का उपयोग करके चर को बाहर करना होगा

while read -r -d '' line; do 
    [[ ! $line =~ ^(SOMEVAR|SOMEOTHERVAR)= ]] && printf '%s\n' "$line" 
done < <(env -0)

read कमांड के साथ d '' का अर्थ है कि इनपुट को शून्य परिसीमन वर्ण पर परिसीमित करना। जबकि लूप तब तक चलता है जब तक कि अंतिम सीमांकित रेखा को पार्स नहीं किया जाता है।

साथ ही यह केवल उन सभी चरों को प्रिंट करता है, जिन्हें आप टालना चाहते हैं। प्रत्येक पंक्ति की आगे की प्रक्रिया के लिए, आप कुंजी/मान जोड़े को विभाजित करने के लिए $line चर को पार्स कर सकते हैं और तदनुसार इसका उपयोग कर सकते हैं।

या यदि आपका इरादा बहु-पंक्ति स्ट्रिंग वाले किसी भी चर की पहचान करना था, तो आप इसे रेगेक्स के साथ बाहर कर सकते हैं

[[ ! $line =~ $'\n' ]] 
3
Inian 18 जून 2019, 16:00

आप बैश बिलिन compgen का उपयोग कर सकते हैं जो -v विकल्प के साथ उपयोग किए जाने पर सभी env चर नामों को आउटपुट करता है:

compgen -v # prints all variable names

अवांछित नामों को बाहर करने और बाकी प्रिंट करने के लिए अब आप इसे आसानी से लूप में उपयोग कर सकते हैं:

while read var; do
   echo "$var=${!var}"
done < <(compgen -v | grep -vxFE '(SOMEVAR|SOMEOTHERVAR)')
1
anubhava 17 जून 2019, 17:55