बैश मैनुअल के अनुसार , पर्यावरण चर BASH_COMMAND
में शामिल है
कमांड को वर्तमान में निष्पादित किया जा रहा है या निष्पादित किया जा रहा है, जब तक कि शेल कमांड को ट्रैप के परिणाम के रूप में निष्पादित नहीं कर रहा है, जिस स्थिति में यह ट्रैप के समय निष्पादित कमांड है।
उस जाल कोने के मामले को एक तरफ ले जाना, अगर मैं सही ढंग से समझता हूं इसका मतलब है कि जब मैं एक कमांड निष्पादित करता हूं, तो चर BASH_COMMAND
में वह कमांड होता है। यह पूरी तरह स्पष्ट नहीं है कि क्या उस चर आदेश निष्पादन के बाद सेट नहीं होने पर (यानी, केवल avaialble है , जबकि , आदेश चल रहा है, लेकिन उसके बाद नहीं) हालांकि एक तर्क कर सकता है कि क्योंकि यह है "कमांड वर्तमान में मार डाला या जा रहा है के बारे में किए जाने की मार डाला" , यह कमांड नहीं है जिसे अभी निष्पादित किया गया था ।
लेकिन आइए देखें:
$ set | grep BASH_COMMAND=
$
खाली करें। मुझे देखने की उम्मीद होगी BASH_COMMAND='set | grep BASH_COMMAND='
या शायद BASH_COMMAND='set'
, लेकिन खाली ने मुझे आश्चर्यचकित कर दिया।
चलो कुछ और कोशिश करते हैं:
$ echo $BASH_COMMAND
echo $BASH_COMMAND
$
खैर यह समझ में आता है। मैं कमांड निष्पादित करता हूं echo $BASH_COMMAND
और इसलिए चर BASH_COMMAND
में स्ट्रिंग शामिल है echo $BASH_COMMAND
। इस बार क्यों काम किया, लेकिन पहले नहीं?
चलो set
फिर बात करते हैं:
$ set | grep BASH_COMMAND=
BASH_COMMAND='echo $BASH_COMMAND'
$
तो इंतज़ार करो। यह सेट किया गया था जब मैंने उस echo
कमांड को निष्पादित किया था , और यह बाद में परेशान नहीं था। लेकिन जब मैंने set
फिर से निष्पादित किया, तो कमांड के लिए सेट BASH_COMMAND
नहीं किया गया थाset
। कोई फर्क नहीं पड़ता कि मैं set
यहां कितनी बार कमांड निष्पादित करता हूं , परिणाम वही रहता है। तो, निष्पादित करते समय चर सेट है echo
, लेकिन निष्पादित करते समय नहीं set
? चलो देखते हैं।
$ echo Hello AskUbuntu
Hello AskUbuntu
$ set | grep BASH_COMMAND=
BASH_COMMAND='echo $BASH_COMMAND'
$
क्या? जब मैं निष्पादित किया गया था तो चर सेट किया गया था echo $BASH_COMMAND
, लेकिन जब मैंने निष्पादित नहीं किया था echo Hello AskUbuntu
? अब फर्क कहां है? क्या वैरिएबल केवल तब सेट होता है जब करंट कमांड ही वास्तव में शेल को मूल्यांकन करने के लिए मजबूर करता है? चलिए कुछ अलग करने की कोशिश करते हैं। हो सकता है कि कुछ बाहरी आदेश इस बार, एक बदलाव के लिए बैश बिलिन नहीं।
$ /bin/echo $BASH_COMMAND
/bin/echo $BASH_COMMAND
$ set | grep BASH_COMMAND=
BASH_COMMAND='/bin/echo $BASH_COMMAND'
$
हम्म, ठीक है ... फिर से, चर सेट किया गया था। तो क्या मेरा वर्तमान अनुमान सही है? क्या चर केवल तब निर्धारित किया जाता है जब उसका मूल्यांकन करना होता है? क्यूं कर? क्यूं कर? प्रदर्शन कारणों से? चलो एक और कोशिश करते हैं। हम $BASH_COMMAND
एक फ़ाइल के लिए grep करने का प्रयास करेंगे , और $BASH_COMMAND
तब से एक grep
कमांड सम्मिलित grep
होनी चाहिए , उस grep
कमांड के लिए grep चाहिए (जैसे, अपने लिए)। तो चलो एक उपयुक्त फ़ाइल बनाते हैं:
$ echo -e "1 foo\n2 grep\n3 bar\n4 grep \$BASH_COMMAND tmp" > tmp
$ grep $BASH_COMMAND tmp
grep: $BASH_COMMAND: No such file or directory
tmp:2 grep <-- here, the word "grep" is RED
tmp:4 grep $BASH_COMMAND tmp <-- here, the word "grep" is RED
tmp:2 grep <-- here, the word "grep" is RED
tmp:4 grep $BASH_COMMAND tmp <-- here, the word "grep" is RED
$ set | grep BASH_COMMAND=
BASH_COMMAND='grep --color=auto $BASH_COMMAND tmp'
$
ठीक है, दिलचस्प है। कमांड grep $BASH_COMMAND tmp
का विस्तार हो गया grep grep $BASH_COMMAND tmp tmp
(वैरिएबल का विस्तार केवल एक बार, निश्चित रूप से हो जाता है), और इसलिए मैंने grep
एक बार फाइल में $BASH_COMMAND
मौजूद नहीं है, और फ़ाइल में दो बार के लिए grepped किया है tmp
।
Q1: क्या मेरी वर्तमान धारणा सही है:
BASH_COMMAND
केवल तभी सेट होता है जब कोई कमांड वास्तव में इसका मूल्यांकन करने की कोशिश करता है; तथा- यह एक आदेश के निष्पादन के बाद परेशान नहीं है , भले ही विवरण हमें ऐसा करने के लिए प्रेरित कर सकता है?
Q2: यदि हाँ, तो क्यों? प्रदर्शन? यदि नहीं, तो उपरोक्त आदेश अनुक्रम में व्यवहार को और कैसे समझाया जा सकता है?
Q3: अंत में, क्या ऐसा कोई परिदृश्य है जिसमें इस चर का वास्तव में सार्थक उपयोग किया जा सकता है? मैं वास्तव में इसका उपयोग करने की कोशिश कर रहा था $PROMPT_COMMAND
ताकि कमांड का विश्लेषण किया जा सके (और उसके आधार पर कुछ सामान किया जा सके), लेकिन मैं नहीं कर सकता, क्योंकि जैसे ही मेरे भीतर $PROMPT_COMMAND
, मैं चर को देखने के लिए एक कमांड निष्पादित करता हूं , $BASH_COMMAND
चर उस कमांड पर सेट हो जाता है। यहां तक कि जब मैं MYVARIABLE=$BASH_COMMAND
अपनी शुरुआत में सही करता हूं $PROMPT_COMMAND
, तो MYVARIABLE
स्ट्रिंग शामिल होती है MYVARIABLE=$BASH_COMMAND
, क्योंकि एक असाइनमेंट एक कमांड भी है। (यह सवाल इस बारे में नहीं है कि मैं एक $PROMPT_COMMAND
निष्पादन के भीतर वर्तमान कमांड कैसे प्राप्त कर सकता हूं । अन्य तरीके भी हैं, मुझे पता है।)
यह हाइजेनबर्ग के अनिश्चितता सिद्धांत के साथ थोड़ा सा है। बस चर को देखकर, मैं इसे बदल देता हूं।
bash
über- gurus हैं ।