PS1 = '$ (pwd)' यह क्यों काम करता है और यह PS1 = $ (pwd) से अलग क्यों है


18

जब मैं इस कमांड को दर्ज करता हूं, तो मेरी निर्देशिका में शीघ्र परिवर्तन होता है?

PS1='$(pwd)'

मैं एकल उद्धरण का उपयोग कर रहा हूं, जिसका अर्थ है कोई प्रक्षेप नहीं, उर्फ echo '$(pwd)'- →$(pwd)

इसके अलावा, यह कहें कि हमने स्पष्ट किया कि यह क्यों काम करता है ... यह अलग तरीके से क्यों काम कर रहा है PS1=$(pwd)? (कोई उद्धरण नहीं)

अलग से मेरा मतलब है कि अगर मैं उद्धरण का उपयोग करता हूं, तो प्रॉम्प्ट मेरी वर्तमान निर्देशिका में बदलता रहेगा क्योंकि मैं टर्मिनल के माध्यम से नेविगेट करता हूं। लेकिन अगर मैं उद्धरण का उपयोग नहीं करता हूं, तो प्रॉम्प्ट हमेशा उस निर्देशिका में रहेगा जो मैंने पहली बार कमांड में दर्ज करते समय किया थाPS1=$(pwd)

क्यों?


2
कुछ सीपीयू चक्रों को सहेजें और बराबर PS1 = '$ PWD' का उपयोग करें
jlliagre

जवाबों:


29

जब आप किसी वैरिएबल को केवल एक मान देते हैं, तो $(...)अभिव्यक्ति का मूल्यांकन तब तक किया जाता है जब तक कि यह एकल उद्धरण (या बैकस्लैश-एस्केप) में संलग्न न हो। इन दोनों को समझने, कोशिश करने और तुलना करने के लिए:

A=$(pwd)
echo "$A"
B='$(pwd)'
echo "$B"

Aतुरंत मान स्ट्रिंग बन जाता है /home/yourusernameऔर जाहिर है यह याद नहीं है कि यह स्ट्रिंग कहां से आती है, यह निर्देशिका बदलने पर भी समान रहता है। मूल्य B, हालांकि, $(pwd)व्याख्या किए बिना शाब्दिक स्ट्रिंग बन जाता है ।

अब, PS1कुछ विशेष के मूल्य में होता है: जब भी संकेत मुद्रित होता है, तो कुछ विशेष निर्माणों की व्याख्या की जाती है, उदाहरण के लिए कमांड प्रतिस्थापन $(...)को ठीक उसी तरह से किया जाता है, जैसा कि Aचर को असाइनमेंट में ऊपर हुआ था । जाहिर है कि अगर आपके PS1घर की निर्देशिका का शाब्दिक स्ट्रिंग है (जैसा कि ऊपर दिया गया है A) तो ऐसा कोई तरीका नहीं है जो इसे बदल सके। लेकिन अगर इसमें स्ट्रिंग है $(pwd)(जैसा कि ऊपर दिया गया है B) तो इसका मूल्यांकन तब किया जाता है जब भी प्रॉम्प्ट प्रिंट होता है और इसलिए आपकी वास्तविक निर्देशिका प्रदर्शित होती है।


14

बाश और zsh दोनों में, मूल्य का PS1उपयोग शीघ्र-के रूप में नहीं किया जाता है, यह कुछ विस्तार से गुजरता है। नियम दो गोले के लिए अलग है, लेकिन दोनों ही मामलों में, कदम से एक सामान्य खोल वाक्य रचना में के रूप में ही वाक्य रचना के साथ "डॉलर" विस्तार (चर प्रतिस्थापन, आदेश प्रतिस्थापन, गणित मूल्यांकन) प्रदर्शन करने के लिए है ( , , या , , ) ।$VARIABLE${VARIABLE}$(COMMAND)`COMMAND`$((EXPRESSION))$[EXPRESSION]

  • बाश में, डॉलर के विस्तार को डिफ़ॉल्ट रूप से चालू किया जाता है, लेकिन इसके साथ बंद किया जा सकता है shopt -u promptvars
  • Zsh में, डॉलर का विस्तार डिफ़ॉल्ट रूप से बंद है, लेकिन कई लोग (और वेब पर आपको मिलने वाले अधिकांश कॉन्फ़िगरेशन फ़्रेमवर्क) इसे चालू करेंगे setopt prompt_subst

शीघ्रता में डॉलर के विस्तार के साथ, 6-वर्ण मान पर PS1='$(pwd)'सेट PS1होता है $(pwd)और इस प्रकार $(pwd)प्रतिस्थापित किया जाता है, और इसलिए pwdकमांड को निष्पादित किया जाता है, हर बार शेल एक नया संकेत प्रदर्शित करता है। दूसरी ओर, उस समय जो भी शेल की वर्तमान कार्यशील निर्देशिका है , उसे PS1=$(pwd)सेट PS1करता है। यदि आपके पास डॉलर का विस्तार बंद था, तो PS1='$(pwd)'संकेत का शाब्दिक स्ट्रिंग होगा $(pwd)

ध्यान दें कि प्रॉम्प्ट में कार्यशील निर्देशिका प्राप्त करने के लिए और अधिक सुविधाजनक तरीके हैं:

  • बैश में, एक बैकस्लैश भागने के साथ जैसे कि \w, जो आपके होम डायरेक्टरी को संक्षिप्त करता है ~और सेटिंग द्वारा ट्रिम किया जा सकता है PROMPT_DIRTRIM
  • Zsh में, एक प्रतिशत से बचने के साथ जैसे ( %/या%~%/ जैसा है $PWD, %~होम निर्देशिकाओं को संक्षिप्त करता है), जिसमें ट्रिमिंग सेटिंग हो सकती है।
  • किसी भी शेल (और किसी अन्य बॉर्न-शैली शेल) में, $PWDइसके बराबर है $(pwd): आपको वर्तमान कार्यशील निर्देशिका प्राप्त करने के लिए उपप्रोसेस चलाने की आवश्यकता नहीं है।

7

क्योंकि उद्धरण के बिना, PS1 के सेट होने पर $ (pwd) का मूल्यांकन किया जाता है। उद्धरण के साथ, जब तक संकेत प्रदर्शित नहीं किया जाता है तब तक $ (पीडब्ल्यूडी) का मूल्यांकन स्थगित कर दिया जाता है।

उद्धरण के बिना, PS1 को उस समय वर्तमान निर्देशिका पर सेट किया जाता है जब PS1 सेट किया जाता है। एकल उद्धरणों के साथ PS1 को $ (pwd) पर सेट किया गया है, जिसका अर्थ है कि यह प्रत्येक बार प्रॉम्प्ट प्रदर्शित होने पर वर्तमान निर्देशिका का मूल्यांकन और प्रिंट करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.