बैश स्क्रिप्ट स्रोत: ऐसी कोई फ़ाइल या निर्देशिका नहीं


9

मेरे पास एक स्क्रिप्ट है जो इस तरह से शुरू होती है

#!/bin/bash
VALKYRIE=~/myProjects/valkyrie
source $VALKYRIE/cluster.conf

लेकिन जब मैं इसे चलाता हूं तो यह वापस आ जाता है line 2: ~/myProjects/valkyrie/cluster.conf: No such file or directory

लेकिन फ़ाइल मौजूद है और जब मैं source ~/myProjects/valkyrie/cluster.confइसे चलाता हूँ तो ठीक चलता है। कोई उपाय? मैंने VALKYRIEचर को कहीं और सेट किया है ताकि मार्ग में हार्ड-कोड एक विकल्प न हो।


अगर यह मदद करेगा, तो मुझे 100% यकीन नहीं है, लेकिन आप ~ में रिक्त स्थान होने पर, चर को पूरी तरह से उद्धृत करने का प्रयास कर सकते हैं। इसलिए, source "${VALKYRIE}/cluster.conf"
स्पर्हुक

नहीं, यह मदद नहीं करता है।
खोई

1
मुझे लगता है कि यह ~ठीक से विस्तार नहीं करने के साथ कुछ करना है। जब मैं आपकी स्क्रिप्ट को जानबूझकर नकली रास्ते से चलाता हूं, तो त्रुटि नहीं कहती है ~, लेकिन पथ का विस्तार करता है। क्या आप ~अपनी लिपि में निरपेक्ष पथ से प्रतिस्थापित करने का प्रयास कर सकते हैं ? इसके अलावा, एक स्क्रिप्ट में निम्नलिखित को चलाने का प्रयास करें echo ~
स्पार्हुक

2
आप $HOMEइसके बजाय भी प्रयास कर सकते हैं ~
स्पारवुक

3
@Khoi जो इसे समझाती है। ~/.pam_environmentतो यह इस तरह के टिल्ड विस्तार और पैरामीटर विस्तार के रूप में आम बातें आप एक खोल से उम्मीद थी, ऐसा नहीं करता है, इसलिए कोई भी, एक खोल स्क्रिप्ट नहीं है ~और न ही $HOMEबदल दिया जाएगा। यदि आप ~/.profileइसके बजाय उस पंक्ति को आगे बढ़ाते हैं, और export सामने जोड़ते हैं , तो यह काम करना चाहिए।
जिरह

जवाबों:


8

~ठीक से विस्तारित नहीं होता है। जब मैं आपकी स्क्रिप्ट को जानबूझकर नकली पथ के साथ चलाता हूं, तो त्रुटि नहीं कहती है ~, लेकिन पथ का विस्तार करता है (अर्थात /home/sparhawk/fakepathनहीं ~/fakepath। आप $HOMEइसके बजाय ~स्क्रिप्ट में पूर्ण पथ का उपयोग करने का प्रयास कर सकते हैं या कर सकते हैं।

(मुझे यकीन नहीं है कि ~आपके सिस्टम पर काम क्यों नहीं होता, क्योंकि आपकी स्क्रिप्ट मेरे लिए ठीक काम करती है।)


जब आप उस आदेश को देखते हैं जो बैश विस्तार करता है ( gnu.org/software/bash/manual/bashref.html#Shell-Expansions ), तो आप देखेंगे कि परिवर्तनीय विस्तार से पहले टिल्ड का विस्तार होता है । यही कारण $HOMEहै कि ~एक चर की तुलना में बेहतर है
ग्लेन जैकमैन

@glennjackman मुझे यकीन नहीं है कि मैं समझ रहा हूँ। वैरिएबल बनाम के लिए प्राथमिकता की बात क्यों होगी ~?
स्पार्हुक

1
यह बिल्कुल "प्राथमिकता" नहीं है, यह बस वही है जो पहले आता है। विचार करें x="~/.bashrc"; ls $x- "एलएस" कमांड के लिए विस्तार के क्रम में, बैश एक टिल्ड के लिए दिखता है और एक नहीं पाता है; अंततः बैश एक चर को देखता है और इसे विस्तारित करता है। बैश वापस नहीं जाता है और फिर से टिल्ड्स की तलाश करता है, इस बिंदु पर यह सिर्फ एक सादे चरित्र है। और करंट डाइरेक्टरी में कोई फाइल नहीं है जो एक टिल्ड से शुरू होती है।
ग्लेन जैकमैन

आह ठीक है। मुझे लगता है कि मैंने इसे पा लिया है। मुझे हमेशा आश्चर्य होता है कि वह आदेश विफल क्यों होता है और x=~/".bashrc"; ls $xकाम करता है। जानकारी के लिए धन्यवाद।
स्पार्हुक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.