सीडी के लिए आवरण लिखने के दौरान मुझे cd "$ 1" के बजाय cd "$ @" का उपयोग करने की आवश्यकता क्यों है?


25

अन्य जगहों पर मैंने नीचे जैसा सीडी फ़ंक्शन देखा है:

cd()
{
 builtin cd "$@"
}

$@इसके बजाय इसका उपयोग करने की अनुशंसा क्यों की जाती है $1?

मैंने एक परीक्षण निर्देशिका "आर सेंट" बनाई और इस फ़ंक्शन वाली स्क्रिप्ट को बुलाया और इसने किसी भी तरह से काम किया

$ . cdtest.sh "r st"

लेकिन $ . cdtest.sh r stअसफल रहा कि क्या मैंने इस्तेमाल किया "$@"या"$1"


1
cd "$*"1 से अधिक arg के साथ सही ढंग से काम नहीं करेगा।
गोफंडमोनिका - codidact.org

जवाबों:


57

क्योंकि, तर्क के अनुसार bash(1), cdलेता है

   cd [-L|[-P [-e]] [-@]] [dir]
          Change  the  current  directory to dir.  if dir is not supplied,
          ...

इसलिए इसलिए निर्देशिका वास्तव $1में उस रूप में नहीं हो सकती है जैसे कि एक विकल्प हो सकता है जैसे कि -Lया कोई अन्य ध्वज।

यह कितना बुरा है?

$ cd -L /var/tmp
$ pwd
/var/tmp
$ cd() { builtin cd "$1"; }
$ cd -L /var/tmp
$ pwd
/home/jhqdoe
$ 

हालात बहुत धराशायी हो जाना अगर तुम तुम कहाँ नहीं का उपयोग कर उम्मीद खत्म हो सकता है cd "$1"...


19

का उपयोग करते हुए "$@"सभी तर्कों को पारित cdकिया $1जाएगा जहां केवल पहले तर्क को पारित किया जाएगा।

अपने उदाहरणों में

$ . cdtest.sh "r st"

हमेशा काम करता है क्योंकि आप केवल एक तर्क में पास होते हैं, लेकिन अगर आप एक झंडे में भी गुजरते हैं तो जैसे

$ . cdtest.sh -L "r st"

तब केवल "$@"सही तरीके से निष्पादित होगा जहां पूरी तरह से निर्देशिका "$1"को cd -Lखोने का विस्तार होगा ।

तथापि

$ . cdtest.sh r st

दोनों मामलों में विफल रहता है क्योंकि आप सीडी में दो पैरामीटर पास कर रहे हैं, rऔर stजो सीडी को निष्पादित करने का एक वैध तरीका नहीं है। पैरामीटर रिक्त स्थान से अलग हो जाते हैं जिन्हें r\ stएक तर्क के रूप में माना जाना चाहिए (आपके पहले उदाहरण में) या बच ( )।

सीडी के मामले में हालांकि यह बहुत झंडे में पारित करने के लिए असामान्य है और आप एकाधिक निर्देशिका में पारित नहीं हो सकता है ताकि आप दोनों में से किसी एक असली दुनिया उपयोग में अंतर नहीं देखेंगे "$1"या "$@"सीडी के लिए। लेकिन अन्य आदेशों के लिए आपको एक अंतर दिखाई देगा, इसलिए "$@"जब भी आप इस तरह का रैपर फंक्शन या स्क्रिप्ट बनाना चाहते हैं, तो इसका उपयोग करना सबसे अच्छा अभ्यास है ।


14

वहाँ भी मामला है जब कोई तर्क नहीं हैं:

$ cd /tmp; cd; pwd
/home/muru
$ cd_func() { builtin cd "$1"; }
$ cd_func /tmp; cd_func; pwd
/tmp

cdबिना किसी तर्क के घर निर्देशिका में परिवर्तन होता है। किसी भी तर्क के बिना, "$@"कुछ भी नहीं फैलता है, लेकिन "$1"खाली स्ट्रिंग तक फैलता है। ये अलग हैं:

$ args() { for i in "$@"; do echo "|$i|"; done; }
$ args
$ args ""
||

कुछ हद तक असंबंधित, लेकिन: मैं अंत में समझता हूं कि क्यों एक अशक्त तर्क cdएक अच्छी बात है। यह होम निर्देशिका में बदलने के बजाय त्रुटि का कारण बनता है। कुछ अन्य आदेशों के साथ, विशेष रूप से rsync, एक अशक्त पहला तर्क अप्रत्याशित व्यवहार का कारण बनता है (स्थानांतरण के स्रोतों में वर्तमान निर्देशिका शामिल है)।
जो

4

एक बैश स्क्रिप्ट के तर्क अंतरिक्ष सीमांकित हैं। $ 1 पहला तर्क है। आपके उदाहरणों में ...

उदाहरण 1 में, $ 1 स्ट्रिंग "आर सेंट" है ... दूसरे उदाहरण में, $ 1 एक चरित्र स्ट्रिंग 'आर' है ...

$ @ सभी तर्क हैं।

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