यहाँ कुछ काम कर रहे हैं:
$ comm -3 <(declare | sort) <(declare -f | sort)
टूट - फूट:
declare
प्रत्येक परिभाषित चर (निर्यात या नहीं) और फ़ंक्शन को प्रिंट करता है।
declare -f
प्रिंट केवल कार्य करता है।
comm -3
दोनों के लिए सभी लाइनों को आम हटा देगा। वास्तव में यह केवल चर को छोड़कर, कार्यों को हटा देगा।
केवल उन वेरिएबल्स को प्रिंट करने के लिए जिन्हें निर्यात नहीं किया जाता है:
$ comm -3 <(comm -3 <(declare | sort) <(declare -f | sort)) <(env | sort)
एक और समाधान:
$ declare -p
यह केवल चर को प्रिंट करेगा, लेकिन कुछ बदसूरत विशेषताओं के साथ।
declare -- BASH="/bin/bash"
declare -ir BASHPID=""
declare -A BASH_ALIASES='()'
declare -a BASH_ARGC='()'
...
आप विशेषताओं का उपयोग करके काट सकते हैं ... कट:
$ declare -p | cut -d " " -f 3
एक नकारात्मक पहलू यह है कि IFS का मूल्य प्रदर्शित होने के बजाय व्याख्या किया जाता है।
तुलना:
$ comm -3 <(declare | sort) <(declare -f | sort)
...
IFS=$' \t\n'
...
$ declare -p | cut -d " " -f 3
...
IFS="
"
...
यह उस उत्पादन को आगे की प्रक्रिया के लिए उपयोग करने में काफी कठिन बनाता है, क्योंकि यह "
एक पंक्ति में अकेला है। इसे रोकने के लिए शायद कुछ IFS- फू किया जा सकता है।
अभी तक एक और समाधान, का उपयोग कर compgen
:
$ compgen -v
बैश बिलिन compgen
का उपयोग पूर्ण स्क्रिप्ट में किया जाना था। इसके लिए, compgen -v
सभी परिभाषित चर सूचीबद्ध करता है। नकारात्मक पक्ष: यह केवल चर नामों को सूचीबद्ध करता है, मूल्यों को नहीं।
मूल्यों को सूचीबद्ध करने के लिए यहां एक हैक भी है।
$ compgen -v | while read var; do printf "%s=%q\n" "$var" "${!var}"; done
लाभ: यह एक शुद्ध बैश समाधान है। नुकसान: कुछ मूल्यों की व्याख्या के कारण गड़बड़ हो जाती है printf
। इसके अलावा पाइप और / या लूप से उपधारा कुछ अतिरिक्त चर जोड़ते हैं।