पॉज़िक्स शेल: पर्यावरण चर नामों की प्रिंट सूची (मानों के बिना)


11

पॉज़िक्स-संगत तरीके से जो कई कार्यान्वयनों के साथ काम करता है, मैं उनके मूल्यों के बिना वर्तमान में परिभाषित पर्यावरण चर की सूची कैसे प्रिंट कर सकता हूं ?

कुछ कार्यान्वयनों पर (mksh, freebsd / bin / sh), बस exportस्वयं का उपयोग करके बिल फिट होगा:

$ export
FOO2
FOO

लेकिन कुछ अन्य कार्यान्वयन (बैश, ज़श, डैश) के लिए, exportमूल्य भी दर्शाता है। उदाहरण के लिए बैश के साथ:

$ export
export FOO2='as  df\
  asdk=fja:\
asd=fa\
asdf'
export FOO='sjfkasjfd  kjasdf:\
   asdkj=fkajdsf:\
       :askjfkajsf=asdfkj:\
   safdkj'
$ printenv | sed -n l
FOO2=as\tdf\$
  asdk=fja:\$
asd=fa\$
asdf$
FOO=sjfkasjfd  kjasdf:\$
   asdkj=fkajdsf:\$
\t:askjfkajsf=asdfkj:\$
   safdkj$

अन्य विकल्प जैसे मानों के बिना सिर्फ चर नामों को प्रिंट करने के विकल्प envया printenvनहीं हैं, कम से कम मैंने जिस लिनक्स और फ्रीबेसड प्लेटफ़ॉर्म पर कोशिश नहीं की है।

जागने के लिए पाइपिंग / sed / etc। या पैरामीटर विस्तार तकनीकों (उदाहरण के लिए ${foo%%=*}) के साथ सूची को ट्रिम करना स्वीकार्य है, लेकिन इसे उन मानों के साथ काम करना होगा जो लाइनों को फैला सकते हैं =और मूल्य में व्हाट्सएप (ऊपर उदाहरण देखें)।

विशेष रूप से शेल क्रियान्वयन के लिए विशिष्ट उत्तर दिलचस्प हैं, लेकिन मैं मुख्य रूप से ऐसी चीज़ की तलाश कर रहा हूं जो कार्यान्वयन के अनुकूल हो।


2
यदि आप किसी चीज़ को पार्स करने जा रहे हैं, तो आउटपुट के साथ जाएं export -pजो POSIX द्वारा निर्दिष्ट है आउटपुट को उत्पन्न करने के लिए जो शेल में इनपुट के लिए भी उपयुक्त है।
Kusalananda

मुझे शेल में इनपुट के लिए कुछ भी नहीं चाहिए। मैं सिर्फ पर्यावरण चर के नाम चाहता हूं। अतः अतिरिक्त क्रॉफ़्ट (जैसे, प्रत्येक पंक्ति के सामने स्थित 'निर्यात' शब्द) को वैसे भी निकालना होगा। मैं इसके लिए उपयोग क्यों करना चाहूंगा export -p?
जुआन

1
आप इसका उपयोग करना चाहते हैं export -pक्योंकि इससे आपको सभी पोसिक्स गोले में एक सुसंगत आउटपुट मिलेगा, जो आपने कहा था कि आप चाहते थे।
Kusalananda

मैं एक समाधान चाहता हूं जो केवल चर नामों को प्रिंट करेगा जो कि गोले के पार एक सुसंगत समाधान है। export -pपहली आवश्यकता फिट नहीं है - मूल्यों के बिना सिर्फ चर नाम मुद्रण।
जुआन

यदि आप कुछ पार्स करने जा रहे हैं, तो आउटपुट के साथ जाएं export -p। मैं उस पार्सिंग को लिखने नहीं जा रहा हूं, क्योंकि सामान्य स्थिति में, यह उचित उद्धरण पार्सिंग भी करना होगा, यदि आपके पास एक चर है जिसका मूल्य कुछ ऐसा है hello\nexport var=value। में से एक कुछ अन्य आदेशों कि आप सभी POSIX गोले में लगातार उत्पादन दे देंगे env, लेकिन यह उत्पादन होता है कठिन है, क्योंकि यह अभाव है पार्स करने के लिए export =बिट।
Kusalananda

जवाबों:


9

यह जाग में बहुत आसान है।

awk 'BEGIN{for(v in ENVIRON) print v}'

हालांकि सावधान रहना कुछ awk कार्यान्वयन अपने स्वयं के वातावरण चर (जैसे ग्नू awk कहते हैं जोड़ने AWKPATHऔर AWKLIBPATHकरने के लिए ENVIRON)।

आउटपुट अस्पष्ट है यदि एक पर्यावरण चर के नाम में एक नई रेखा है, जो बेहद असामान्य है लेकिन तकनीकी रूप से संभव है। एक शुद्ध श समाधान मुश्किल होगा। आपका सबसे अच्छा दांव शुरू करना है export -pलेकिन शुद्ध श में इसकी मालिश करना मुश्किल है। आप के आउटपुट की मालिश करने के लिए sed का उपयोग कर सकते हैं export -p, फिर evalइसे उद्धृत करने के लिए शेल को प्राप्त करने के लिए उपयोग करें। बैश और zsh गैर-मानक उपसर्ग प्रिंट करते हैं।

report () { echo "${1%%=*}"; };
eval "$(export -p | sed "s/^export /report /;
                         s/^declare -x /report /;
                         s/typeset -x /report /")"

ध्यान दें कि शेल के आधार पर, export -pवे चर दिखा सकते हैं या नहीं दिखा सकते हैं जिनका नाम शेल में मान्य नहीं है, और यदि ऐसा नहीं होता है, तो वे नामों को ठीक से उद्धृत या नहीं कर सकते हैं। उदाहरण के लिए, डैश, mksh और zsh omit वैरिएबल जिनके नाम में एक नई रेखा, बिजीबॉक्स डैश और ksh93 उन्हें कच्चे प्रिंट करते हैं, और बैश उन्हें उनके मूल्य के बिना कच्चे प्रिंट करता है। यदि आपको अविश्वासित इनपुट से बचाव करना है, तो शुद्ध POSIX समाधान पर भरोसा न करें, और निश्चित रूप evalसे आउटपुट से प्राप्त किसी भी चीज पर कॉल न करें export -p


मुझे यकीन नहीं है कि "आसान" यह वास्तव में sedil (1) मल्टीलाइन मूल्यों के साथ कैसे है - मैं इसे देखना चाहता हूं। लेकिन जाग के लिए धन्यवाद (1) विधि। मुझे लगता है कि यह अब तक का सबसे पोर्टेबल तरीका है (हालांकि मुझे नहीं लगता कि exitयह आवश्यक है)।
जुआन

ध्यान दें कि यदि आप प्राप्त करते हैं FOO<newline>BAR, तो आप नहीं जानते कि यह एक FOO<newline>BARपर्यावरण चर है (जो export -pअधिकांश गोले के साथ नहीं दिखाई देगा, देखें env $'FOO\nBAR=test' awk 'BEGIN{for (v in ENVIRON) print v}') या दोनों FOOऔर BARपर्यावरण चर।
स्टीफन चेजलस

ध्यान दें कि ग्नू awkअपने स्वयं के ( AWKPATHऔर AWKLIBPATHमेरे सिस्टम पर) पर्यावरण चर सेट करता है
स्टीफन चेज़लस

@ StéphaneChazelas - पुनः: var नाम में एम्बेडेड नईलाइन - सहमत - शेल कोड के साथ उस के खिलाफ बचाव करने के लिए कठिन। पुन :: AWKPATH और AWKLIBPATH प्रदूषण, मैंने देखा कि कपटी सम्मिलन भी। वह गुन अवेक है, बस्स अवेक नहीं।
जुआन

0

मुझे साधारण चीजें पसंद हैं; यह POSIX सिस्टम के लिए काम करेगा:

printenv | sed 's;=.*;;' | sort
HOME
HOSTNAME
PATH
PWD
SHLVL
TERM

5
export AAA=$'multi\nBBB=line'
रोज़ा

@todd_dsm - यह उन पर्यावरण चरों के लिए विफल होता है जिनमें ऐसे मान होते हैं जो एक से अधिक पंक्ति (जैसे, कभी-कभी TERMCAP - मैं एक स्क्रीन (1) सत्र, IIRC) में देखते हैं। तो यह उत्तर मूल प्रश्न में वर्णित आवश्यकताओं को पूरा नहीं करता है। मुझे भी सरल पसंद है, लेकिन यह आम तौर पर काम नहीं करता है।
जुआन

Tidbit को आपने अपनी मूल पोस्ट में संपादित किया जो बैश के लिए दिलचस्प था compgen -e:। यह मेरी पोर्टेबल स्क्रिप्टिंग के लिए मदद नहीं करता (उदाहरण के लिए, जब बैश उपलब्ध नहीं है), लेकिन यह दिलचस्प है।
जुआन

बस जिज्ञासु, क्यों खुद को बोर्न (पॉज़िक्स) खोल तक सीमित रखा? पॉज़िक्स-आज्ञाकारी होना बहुत अच्छा है, लेकिन आप उस खोज में बहुत अधिक कार्यक्षमता खो देते हैं। आप पोर्टेबल हो सकते हैं और बैश के साथ पॉज़िक्स-अनुरूप नहीं हो सकते हैं; यह GNU परिवार का हिस्सा है।
todd_dsm

dashडेबियन में उपयोग करने पर, मैं ऊपर दिए गए कमांड के साथ समान परिणाम प्राप्त करता हूं या printenv | sed 's;*=.;;' | sortमूल्यों को प्राप्त करने के लिए संशोधित करता हूं । मैंने चर को निर्यात किया yoऔर इसे आपकी पहली टिप्पणी सौंपी; यह कई लाइनों के साथ, अपेक्षित के रूप में मुद्रित हुआ। सुनिश्चित नहीं हैं कि आप क्या अनुभव कर रहे हैं, लेकिन आउटपुट को कम नहीं करना चाहिए। शेल में कमांड चलाएं; जो कुछ भी यह वहाँ आउटपुट करता है कि यह कैसे काम करना चाहिए; उम्मीद नहीं की जा रही है। फिर, TERMCAP / स्क्रीन / iirc के संदर्भ में; समान होना चाहिए। यदि आउटपुट मैच नहीं करता है, तो यह उन कार्यक्रमों में से एक के साथ एक समस्या है।
todd_dsm
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.