$ {PATH: +: $ {PATH}} का क्या अर्थ है?


24

मैंने हाल ही में अपनी साइबर प्रोफाइल में निम्नलिखित पर ध्यान दिया, और अधिक सटीक:

/usr/local/bin:/usr/bin${PATH:+:${PATH}}

इसका क्या मतलब है? सिर्फ $ PATH क्यों नहीं है? क्या यह 'अगर $ पेट मौजूद है तो जोड़: $ पेट'? मेरा उद्देश्य आदेश की अदला-बदली करना है और विंडोज़ पथ के पीछे साइबरविन पथों को डालना है। अतीत में मैं होता

$PATH:/usr/local/bin:/usr/bin

लेकिन यह मुझे भ्रमित करता है। शायद मुझे करना चाहिए

PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"

को जोड़ने के लिए: $ पथ के अंत में?


1
आपका प्रश्न शीर्षक वास्तव में एसई हॉट प्रश्न पक्ष बार में प्रारूपण के साथ गड़बड़ कर रहा है i.imgur.com/g6pPmzf.png
ब्राड

जवाबों:


38

:+का एक रूप है पैरामीटर विस्तार :

$ {पैरामीटर: + [शब्द]} : वैकल्पिक मूल्य का उपयोग करें।

यदि पैरामीटर परेशान है या अशक्त है, अशक्त प्रतिस्थापित किया जाएगा; अन्यथा, शब्द का विस्तार (या यदि शब्द छोड़ा गया है तो एक रिक्त स्ट्रिंग) प्रतिस्थापित किया जाएगा।

दूसरे शब्दों में, यदि चर $varको परिभाषित किया गया है, echo ${var:+foo}तो प्रिंट करेगा fooऔर यदि यह नहीं है, तो यह खाली स्ट्रिंग को प्रिंट करेगा।

दूसरा :कुछ खास नहीं है। यह निर्देशिका में सूची में विभाजक के रूप में उपयोग किया जाने वाला चरित्र है $PATH। तो, PATH="/usr/local/bin:/usr/bin${PATH:+:${PATH}}"लिखने का एक संक्षिप्त तरीका है:

if [ -z "$PATH" ]; then
    PATH=/usr/local/bin:/usr/bin
else
    PATH=/usr/local/bin:/usr/bin:$PATH
fi

सेट नहीं :होने पर अतिरिक्त जोड़ने से बचने के लिए यह सिर्फ एक चतुर चाल है $PATH। उदाहरण के लिए:

$ PATH="/usr/bin"
$ PATH="/new/dir:$PATH" ## Add a directory
$ echo "$PATH"
/new/dir:/usr/bin

लेकिन अगर PATHपरेशान है:

$ unset PATH
$ PATH="/new/dir:$PATH"
$ echo "$PATH"
/new/dir:

A :स्वयं ही वर्तमान निर्देशिका को जोड़ता है $PATH। इसका उपयोग करने PATH="/new/dir${PATH:+:$PATH}"से बचा जाता है। इसलिए, PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"यदि आप चाहें, PATH="$PATH:/usr/local/bin:/usr/bin"तो आप उपयोग कर सकते हैं या यदि आप चाहें तो उपयोग कर सकते हैं। अंतर केवल इतना है कि पूर्व एक अतिरिक्त जोड़ सकता है :, जिससे आपकी वर्तमान निर्देशिका आपके पास आ जाएगी $PATH


क्या अतिरिक्त :हानिकारक है?
बिल्ली

4
@ वास्तव में नहीं, यह सिर्फ वर्तमान निर्देशिका को आपके $PATH(@ एंडीबी का जवाब देखें ) जोड़ता है । यह कुछ स्थितियों में एक सुरक्षा जोखिम हो सकता है (कहते हैं कि एक हमलावर ने आपकी वर्तमान निर्देशिका में एक विनाशकारी स्क्रिप्ट अपलोड की है और इसे lsकुछ नाम दिया है) लेकिन ज्यादातर मामलों में, आपको वास्तव में कोई आपत्ति नहीं है। वास्तव में, कुछ सिस्टम PATHवैसे भी वर्तमान निर्देशिका को डिफ़ॉल्ट रूप से जोड़ते हैं ।
terdon

पथ है एक जगह है जहाँ मैं वे पसंद करते हैं जिस तरह से cshतो एक सरणी के रूप में हैंडल यह।
गृहनगर

8

आप सही हैं, इसका मतलब है 'अगर $ पेट मौजूद है - और अशक्त नहीं है - तो जोड़ें: $ पथ'।

आपको यह जाँचने की आवश्यकता है कि क्या $ PATH मौजूद है क्योंकि आप $ PATH अपरिभाषित होने पर अग्रणी (या अनुगामी) कॉलन को जोड़ना नहीं चाहते हैं। एक शून्य लंबाई (शून्य) निर्देशिका पथ में नाम, के रूप में :/usr/local/bin:/usr/bin, या /usr/local/bin:/usr/bin:, या /usr/local/bin::/usr/bin, साधन वर्तमान निर्देशिका खोज

इससे अंश man bash:

   PATH   ...
          A zero-length (null) directory name in the value of PATH indicates 
          the current directory.  A  null  directory name may appear as two 
          adjacent colons, or as an initial or trailing colon.
          ...

शायद ऐसा नहीं है कि आप क्या करना चाहते हैं।

निम्नलिखित दो लाइनें एक ही काम करती हैं:

PATH=":/bin"        # search current directory, then /bin
PATH=".:/bin"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.