2015-07-29 4 views
5

यू-बूट में अंदर एक वातावरण चर का मूल्यांकन करने के मैं इन दो वातावरण चर है:यू-बूट: कैसे एक और

filepath=myimages 
kernelfile=${filepath}/uImage.bin 

जब मैं इस कमांड चलाएँ:

echo ${kernelfile} 

मैं इस आउटपुट प्राप्त :

${filepath}/uImage.bin 

हालांकि, मैं यह बजाय इस तरह filepath चर का मूल्यांकन करना चाहते:

myimages/uImage.bin 

यह कैसे प्राप्त किया जा सकता है?

उत्तर

6

जैसा कि यह खड़ा है, यह यू-बूट echo और अभी खोल के साथ पूरा नहीं किया जा सकता है। ऐसा इसलिए है क्योंकि echo के साथ आप देखे गए मैक्रो प्रतिस्थापन को echo कमांड लॉन्च करने से पहले यू-बूट कमांड लाइन दुभाषिया द्वारा किया जा रहा है। सभी गूंज कमांड मूल रूप से इसे पारित तारों की सरणी मुद्रित करता है।

विशेष रूप से, यदि आप यू-बूट के वर्तमान (7/29/15) गिट भंडार से common/cli_simple.c देखते हैं, तो आपको cli_simple_run_command फ़ंक्शन मिलेगा। यह फ़ंक्शन एक स्ट्रिंग cmd पारित किया गया है जिसमें ; से अलग एकाधिक आदेश हो सकते हैं। यदि आप इस स्ट्रिंग को विभाजित करने वाले लूप के अंदर देखते हैं तो आपको cli_simple_process_macros मिलेगा और उसके बाद आपको cli_simple_parse_line पर cmd_process पर कॉल मिलेगा। cli_simple_process_macros अब छोड़कर, cli_simple_parse_line मूल रूप से एक स्ट्रिंग लेता है और एक शेल की तरह स्ट्रिंग्स की एक सरणी में विभाजित होता है, जिससे आपको argv और argc दिया जाता है जो cmd_process पर जाता है जो argv[0] में आदेश को निष्पादित करता है।

दिलचस्प हिस्सा cli_simple_process_macros है। यह इनपुट स्ट्रिंग को दूसरे तर्क के रूप में पहली तर्क और आउटपुट स्ट्रिंग के रूप में लेता है। यह फ़ंक्शन एक साधारण राज्य मशीन है जो यू-बूट पर्यावरण चर (या फ़ंक्शन नाम के रूप में मैक्रोज़) के रूप में दिखता है और उन्हें पर्यावरण चर के मान के साथ बदल देता है। इसे getenv पर कॉल के साथ देखा जाता है और फिर आउटपुट स्ट्रिंग में प्रतिलिपि होती है। यदि आप देखते हैं कि cli_simple_process_macros काम करता है तो आप देखेंगे कि यह केवल एक पास करता है, यह है कि यदि एक पर्यावरण परिवर्तक में एक और पर्यावरण चर होता है तो यह दूसरे पर्यावरण चर को संसाधित नहीं करता है, बल्कि यह केवल स्ट्रिंग मान की प्रतिलिपि बनाता है।

अंत में, यदि आप echo कमांड के स्रोत को देखते हैं तो आप देखेंगे कि यह बहुत आसान है, बस मूल रूप से argv के माध्यम से इसे लूपिंग और उचित रिक्त स्थान के साथ प्रत्येक स्ट्रिंग को प्रिंट करना।

तो मूल रूप से, यदि आप वांछित व्यवहार चाहते हैं, तो आपको पर्यावरणीय चर के लिए पुनरावृत्त होने के लिए cli_simple_process_macros या तो echo बदलने के लिए पर्यावरण चरों को देखने की आवश्यकता होगी। आप cli_simple_process_macros कई बार आमंत्रित करने के लिए शायद cli_simple_run_command बदल सकते हैं ताकि सभी घोंसला वाले वातावरण चर का विस्तार हो सके।

4

या एक आलसी जिस तरह से आप कुछ इस तरह कर सकता है के रूप में:

filepath=myimages 
set_kernelfile= setenv kernelfile ${filepath}/uImage.bin 

तो कार्य करें:

run set_kernelfile; echo ${kernelfile} 
संबंधित मुद्दे