क्या $ (pwd) या $ PWD का उपयोग करना बेहतर है?


35

मुझे BASEDIR=$(pwd)एक स्क्रिप्ट में सामना करना पड़ा ।

हो BASEDIR="$PWD"सकता है, का उपयोग करने के अलावा अन्य कोई लाभ या नुकसान हो, जिसे $PWDअधिलेखित किया जा सकता है?



@ स्टीफनचेज़ेलस बहुत दिलचस्प लिखते हैं। मैं केवल आधे रास्ते में हूं और जारी रखूंगा, लेकिन जहां तक ​​मैंने इसे समझा, इसका उपयोग करना बेहतर है $(pwd), क्योंकि $PWDकुछ परिस्थितियों में पुराना हो सकता है।
मिनिक्स डे

2
केवल कुछ गोले में (उदाहरण के लिए बाश, डैश, zsh या ksh93 नहीं) pwdसंभवतः आपको $PWDकुछ कोने के मामलों की तुलना में कम बासी जानकारी देगा । $(pwd)दूसरी ओर काम नहीं करता है अगर वर्तमान निर्देशिका न्यूलाइन वर्णों में समाप्त हो जाती है, तो इसका मतलब है कि प्रक्रिया को रोकना (ksh93 को छोड़कर) और अतिरिक्त संसाधनों का उपयोग करें। मेरा विचार उपयोग $PWDका है $(pwd -P), यह उपयोग करने के लायक नहीं है $(pwd)
स्टीफन चेजालस

1
नीचे स्टीफन का उपयोग करने का उल्लेख है cd -P -- "$dir"। यदि $PWDआप के मूल्य के बारे में कोई संदेह है, तो आप हमेशा cd -P .पहले हो सकते हैं । यह इस रूप में भी फायदेमंद हो सकता है कि आपको वह भी मिल जाए जो $PWDपहले था $OLDPWDऔर इसलिए बाद में उनकी तुलना कर सकते हैं - और अगला cd ...; cd -क्रम आपको वापस उसी स्थान पर लाना सुनिश्चित करेगा जहाँ आप अभी हैं।
mikeserv

जवाबों:


41

यदि बैश का सामना होता है तो $(pwd)यह कमांड pwd को निष्पादित करेगा और $(pwd)इस कमांड के आउटपुट के साथ बदल देगा । $PWDएक चर है जो लगभग हमेशा सेट होता है। pwd एक बिलियन शेल कमांड है जो लंबे समय से है।

तो $PWDयह विफल हो जाएगा अगर यह चर सेट नहीं है और $(pwd)विफल हो जाएगा यदि आप एक शेल का उपयोग कर रहे हैं $()जो उस निर्माण का समर्थन नहीं करता है जो मेरे अनुभव के मामले में अक्सर होता है। तो मैं उपयोग करूंगा $PWD

के रूप में हर बेवकूफ मैं अपने स्वयं के खोल पटकथा ट्यूटोरियल है


6
मैं इस धारणा के तहत था कि `command`वाक्य रचना अवांछनीय थी और $(command)इसे प्राथमिकता दी जानी थी। जहां तक ​​मुझे पता है कि बाद वाला पोसिक्स कंप्लेंट है, लेकिन मुझे 100% यकीन नहीं है।
मिनिक्स डे

6
@Minix यह $()वास्तव में POSIX द्वारा निर्दिष्ट है, इसलिए /bin/shसोलारिस 10 और पुराने और cshव्युत्पन्न गोले पर उपलब्ध पूर्व POSIX के बाहर , मुझे संदेह है कि कई अन्य मुख्यधारा के गोले में उस सुविधा का अभाव है।
jlliagre

@Minix: यहाँ है कि बजाय बैकटिक उपयोग करने के साथ एक समस्या को दिखाता है इस साइट पर हाल ही में एक सवाल यह है कि$()
प्रधानमंत्री 2Ring

सही, $ के बजाय () आप बैकटिक्स का उपयोग कर सकते हैं, लेकिन यह
कैस्केडेबल

1
आपके ट्यूटोरियल पर अच्छा
मिनिमैप

6

यह भी उल्लेख किया जाना चाहिए कि $PWDइसके प्रदर्शन के कारण वांछनीय है। शेल चर के रूप में, इसे लगभग तुरंत हल किया जा सकता है। $(pwd)थोड़ा और अधिक भ्रमित है। यदि आप man 1 bulitinबैश के साथ एक सिस्टम पर निरीक्षण करते हैं, तो आप देखेंगे कि pwdयह एक अंतर्निहित कमांड है, जो आपको विश्वास दिला सकता है कि यह वैरिएबल एक्सेस करने के समान तेज़ होगा। हालांकि, $()निर्माण हमेशा अपनी सामग्री को चलाने के लिए एक नया उप-संस्करण (एक नई प्रक्रिया) लॉन्च करता है, भले ही अंदर क्या हो। यही बात बैकटिक्स के लिए भी जाती है। वास्तव में, जब मैं इसे बेंचमार्क करता हूं:

echo 'Benchmarking $(pwd)...'
time (for i in {1..1000}; do echo $(pwd) > /dev/null; done)
echo 'Benchmarking $PWD...'
time (for i in {1..1000}; do echo $PWD > /dev/null; done)

मुझे $(pwd)कॉल के लिए 1.52 सेकंड और 0.018 सेकंड मिलते हैं $PWD। उपधाराओं के अनावश्यक लॉन्चिंग, साथ ही साथ किसी भी अन्य बाहरी प्रक्रियाओं को, जब भी संभव हो, बचा जाना चाहिए। वे फ़ंक्शन कॉल की तुलना में बहुत अधिक महंगे हैं जिन्हें आप अन्य भाषाओं में उपयोग कर सकते हैं।


यह एक दिलचस्प बात है, लेकिन मुझे नहीं पता कि क्या मुझे अपने शेल स्क्रिप्ट पर प्रदर्शन की चिंता है। मुझे यह भी आश्चर्य है कि प्रदर्शन कैसे बदल जाएगा, अगर pwd इसे क्वेरी करने के बीच बदलता है।
मिनिक्स

@Minix मैंने लूप बॉडी के लिए अपनी स्क्रिप्ट को संशोधित किया है echo $PWD; pushd ..; echo $PWD; popd( >/dev/nullप्रत्येक कथन के बाद अतिरिक्त ), और इसमें 0.05 सेकंड लगते हैं। मैंने तब इको स्टेटमेंट्स को हटा दिया (केवल पुशड / पॉपड) और इसे 0.03 लिया। तो echo $PWDअभी तक का समय 0.01 सेकंड या तो था। मैंने ऐसा ही कुछ किया $(pwd), और प्रत्येक लूप के लिए 2.2 सेकंड का समय लिया, इसलिए प्रति $(pwd)कॉल 1.1 सेकंड ।
markasoftware

बहुत अचूक होने के लिए नहीं, लेकिन मैं कल्पना कर सकता हूं, कि गणना, जो कि प्रतिस्थापित $PWDहोगी, प्रतिध्वनि बयानों के मूल्यांकन से पहले पृष्ठभूमि में की जाएगी। लेकिन स्पष्ट रूप से, एक्सेस $PWDकरना अभी भी काफी तेज है, इसलिए यदि संगतता चिंता का विषय नहीं है, तो यह निश्चित रूप से एक को दूसरे पर लेने का एक कारण है। यह इतनी अच्छी तरह से परीक्षण में काम के लिए धन्यवाद। :)
मिनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.