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


3

निम्नलिखित स्क्रिप्ट है जो मैं चला रहा हूं

#$1 - Argument
declare IPATH="sample/"
declare F=$IPATH$1
echo $F
ls $F

इनपुट है ./script.sh "Fil*"

इको आउटपुट है -

sample/Fil*

जब मैं कमांड चलाता हूं तो मुझे ls sample/Fil*आवश्यक आउटपुट मिलता है - फाइलों की एक सूची जिसका नाम FIL से शुरू होता है और इस तरह से नमूना फ़ोल्डर में हैं -

sample/File  sample/File1  sample/File2

लेकिन स्क्रिप्ट नीचे अपवाद फेंकता है। मैं क्या गलत कर रहा हूं?

ls: sample/Fil*: No such file or directory ls: $IPATH: No such file or directory

यहाँ कुछ बहुत अजीब हो रहा है। ls: $IPATH: No such file or directoryत्रुटि का हिस्सा कोई मतलब नहीं है - जैसा कि पटकथा लिखी गई है, lsकमांड को कभी नहीं देखना $IPATHचाहिए, कि इसे पास होने से बहुत पहले इसके मूल्य से प्रतिस्थापित किया जाना चाहिए lsset -xट्रेसिंग को सक्षम करने के लिए शुरुआत में जोड़ने का प्रयास करें , और देखें कि यह कैसे चल रहा है इसके बारे में प्रिंट करता है।
गॉर्डन डेविसन

जवाबों:


9

Globs में विस्तार नहीं कर रहे हैं उद्धरण । आप उन्हें स्क्रिप्ट के भीतर विस्तारित कर सकते हैं, लेकिन यह वास्तव में बुरा अभ्यास है (क्या होगा अगर किसी के पास फ़ाइल नाम था *या ?वे? वे आपकी स्क्रिप्ट का उपयोग हेरफेर करने में सक्षम नहीं होंगे)। सबसे अच्छा अभ्यास स्क्रिप्ट के भीतर सभी चर संदर्भों को उद्धृत करना है, और स्क्रिप्ट के लिए वास्तविक पथों को पास करना है:

$ mkdir sample
$ touch sample/File1 sample/File2
$ cat script.sh 
#!/bin/sh
F="$1"
echo "$F"
ls "$F"
$ ./script.sh sample/Fil*
sample/File1
sample/File1

या इससे भी बेहतर, सभी फाइलों पर लूप करें:

$ cat script.sh 
#!/bin/sh
for path
do
    echo "$path"
    ls "$path"
done
$ ./script.sh sample/Fil*
sample/File1
sample/File1
sample/File2
sample/File2

यदि आप पथ का हार्ड कोड भाग चाहते हैं, तो आप इसकाfind विस्तार कर सकते हैं :

while IFS= read -r -d '' -u 9 path
do
    ls -- "$path"
done 9< <( find "sample" -name "$1" -exec printf '%s\0' {} + )

मुझे लगता है कि यह समस्या है। लेकिन, मुझे वाइल्ड कार्ड कैरेक्टर चाहिए। ' '। हम कहते हैं कि मुझे पता है कि फ़ाइल नामों में ' ' नहीं है। लेकिन मैं उन्हें स्क्रिप्ट में विस्तार करना नहीं चाहता। क्या कोई और रास्ता नहीं है?
user657592

इसके अलावा, मैं हार्ड कोडित फ़ाइल के पथ का एक भाग चाहता हूं।
user657592

आप ग्लोब के साथ स्क्रिप्ट को कॉल कर रहे हैं, इसलिए आपको केवल ग्लोब को उद्धृत किए बिना कॉल करना होगा । शेल इसे विस्तारित करने का ध्यान रखेगा, और जब तक आप इसे स्क्रिप्ट के अंदर उद्धृत करते हैं तब तक आपको कोई समस्या नहीं होनी चाहिए।
l0b0

-1

ls एक अलग खोल में चलता है। उस शेल पर, IPATH परिभाषित नहीं है, क्योंकि आपने इसे निर्यात नहीं किया है।

"निर्यात" के साथ "घोषित" बदलें और यह काम करेगा।


मैंने आपके सुझाव की कोशिश की, लेकिन यह मदद करने के लिए प्रतीत नहीं होता है।
user657592

-1

लो घोषित कीवर्ड बाहर है और यह काम करेंगे। बाश में टाइप करने की कोई जरूरत नहीं :

   #!/bin/sh
   IPATH="sample/"
   F=$IPATH$1
   echo $F
   ls $F

यह आपकी अपेक्षा के अनुरूप काम करेगा।


यह AFAICT कुछ भी नहीं बदलता है ls: cannot access sample/Fil*: No such file or directory:।
l0b0

@ l0b0 क्योंकि यह गलत तरीके से उपयोग किया जाता है: पहले, आप -r / -f / -a ... विकल्प को याद कर रहे हैं, फिर आप स्टेटमेंट में एक चर का उपयोग नहीं कर सकते, $ IPATH $ 1।
मारियसमाटुटिया

आपको उन विकल्पों में से एक का उपयोग करने की आवश्यकता नहीं है। कोशिश करो declare -p | grep 'declare --'IFS, HOSTNAMEऔर दूसरों को एक प्रकार के बिना घोषित किया जाता है, जिसका अर्थ है कि वे केवल तार हैं।
l0b0

@ l0b0: सच नहीं है, यह पूरी तरह से काम करता है, बस इसे आज़माएँ।
मारियसमाटुटिया

@ l0b0 मैंने आपके द्वारा पोस्ट किए गए कोड को कॉल ,/script.sh "tst *" के साथ चलाया।
MariusMatutiae
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.