जैसा कि शीर्षक कहता है, क्या * NIX फाइल सिस्टम के लिए कोई अंतर है? जैसे ls file
औरls ./file
जैसा कि शीर्षक कहता है, क्या * NIX फाइल सिस्टम के लिए कोई अंतर है? जैसे ls file
औरls ./file
जवाबों:
मैं SmallLoanOf1M द्वारा स्पष्टीकरण के बारे में पागल नहीं हूं। यह तकनीकी रूप से सही है लेकिन इस तरह से उत्तर देता है जो प्रश्न में उपयोग के उदाहरण से मेल नहीं खाता है।
इसलिए, उदाहरण के लिए, यहां प्रश्न से दोनों के बीच एक महत्वपूर्ण अंतर है: "फ़ाइल" और "./ile"।
क्या होगा यदि फ़ाइल को उस वर्ण से नाम दिया गया है जो शेल द्वारा पार्स किया गया है? विशेष रूप से कमांड एक द्वारा चलाए जा रहे पात्रों के बारे में।
विशेष रूप से, "डैश" वर्ण: "-"। लेकिन अन्य वर्ण शेल के लिए सार्थक हैं।
उदाहरण। मेरी फ़ाइल का नाम "-डिंगल" था
फ़ाइल को सूचीबद्ध करने का प्रयास करें:
ls -dingle
# ls -dingle
ls: invalid option -- 'e'
इससे भी बदतर, क्या होगा अगर फ़ाइल का नाम " -rf rmbomb *
" था? अब इसे हटाने का प्रयास करें
rm "-rf rmbomb *"
मैं भी उस उदाहरण को चलाने की कोशिश नहीं कर रहा हूं, लेकिन उम्मीद है कि आपको यह विचार मिलेगा।
तो आप डैश के साथ घूर फ़ाइल को कैसे सूचीबद्ध करते हैं? ./
सामने प्रयोग करें ।
# ls ./-dingle
./-dingle
के लिए डिट्टो rm
ls \-dingle
या ls \-rf\ rmbomb\ \*
। यह सुनिश्चित करने का एक अच्छा तरीका हो सकता है कि दिए गए आदेशों में से कोई भी सेट कम से कम सुसंगत हो, जैसा ./
कि किसी नाम के बाद वर्णों से बचने से पहले निर्दिष्ट करना होगा ./
।
rm "-rf rmbomb *"
कि वास्तव में कुछ बुरा होगा, बजाय केवल rm
एक त्रुटि प्रिंट करने के। यह केवल खतरनाक है अगर आप फ़ाइल नाम को उद्धृत करना भूल जाते हैं, तो शब्द-विभाजन होता है। (esp; एक शेल स्क्रिप्ट में जहां आप चलाने के rm $file
बजाय चलाते हैं rm "$file"
। लेकिन उस स्थिति में, *
विस्तार नहीं होगा, क्योंकि ग्लोब विस्तार वैरिएबल विस्तार की सामग्री पर नहीं होता है। यदि आप चाहते हैं कि, आपको एक की आवश्यकता होगी eval
।) वैसे भी, यदि आपका स्क्रिप्ट शब्द-विभाजन rm से गुजरने से पहले फाइलनाम करता है, तो मैं एक फाइल बनाऊंगा जिसे space -rf .
कुछ कहा जाएगा , इसलिए rm ./$i
यह मदद नहीं करता है।
rm: invalid option -- ' '
, जब से यह -rf
एकल-वर्ण स्विच के रूप में अंतरिक्ष की व्याख्या करने की कोशिश करता है , क्योंकि यह उसी तर्क का हिस्सा है। (और हां, मैंने इसे एक खाली निर्देशिका के अंदर ही चलाया था जब मैंने कुछ अनदेखी की थी और यह वास्तव में खतरनाक था: पी)
IFS=''
और -f
क्रमशः दबाया न जाए । एक दुर्लभ उदाहरण यह है कि awk
एक ऑपरेंड (एक पहले ऑपरेंड के अलावा जो स्क्रिप्ट है) foo=bar
को निष्पादित करने के लिए असाइनमेंट के ./foo=bar
रूप में लेकिन पढ़ने के लिए एक फ़ाइल के रूप में होता है।
हाँ।
file
कमांड लाइन पर जारी करके , BASH उस नाम की एक फ़ाइल के लिए आपके $ PATH पर्यावरण चर की खोज करेगा। जब तक फ़ाइल आपके PATH चर के भीतर एक निर्देशिका में नहीं रहती है, तब तक यह नहीं मिलेगी।
.
वर्तमान निर्देशिका का मतलब है। ./
साधन के भीतर मौजूदा निर्देशिका, सापेक्ष दृष्टि से। यह निर्देशिका में काम करते /home/sheogorath/shivering/isles.img
समय आह्वान करने जैसा कुछ कहने के बराबर है ।./isles.img
/home/sheogorath/shivering/
जैसे, यह आमतौर पर "आपके स्थान पर" कार्यशील निर्देशिका में फ़ाइलों को निष्पादित करने के लिए उपयोग किया जाता है।
संपादित करें:
आपके उदाहरण में, ls
शेल द्वारा बुलाया जा रहा है और पाथ वेरिएबल का उपयोग करके पाया जाता है। इसके तर्क को आपकी कार्यशील निर्देशिका में संसाधित किया जाएगा, जो कुछ भी हो सकता है। चूंकि यह डिफ़ॉल्ट है ls
, इसलिए आप निर्दिष्ट करने file
और स्पष्ट रूप से निर्दिष्ट करने के बीच कोई अंतर नहीं देखेंगे ./file
क्योंकि वे दोनों आपकी वर्तमान निर्देशिका को इंगित करते हैं।
सभी कमांड काम कर रहे डायरेक्टरी में फाइल पाथ को स्वीकार नहीं करेंगे, और कुछ आपको एक डायरेक्टरी में स्टेट फाइल रखने की उम्मीद करते हैं, जो वे स्वयं कॉन्फ़िगरेशन के माध्यम से पूर्व-परिभाषित करते हैं। उन आदेशों के बीच जो फाइलों को तर्क के रूप में स्वीकार करते हैं, ये आदेश कम सामान्य हैं
ls
जो मूल प्रश्न में उल्लिखित आदेश का पालन करते हैं। यही कारण है कि एक सापेक्ष पथ (वर्तमान कार्यशील निर्देशिका के सापेक्ष) ../../dir/filename
/path/to/dir/filename
ls
उनके लिए हमेशा एक ही रास्ता होगा, एक दूसरे की तुलना में अधिक स्पष्ट रूप से निर्दिष्ट होगा। तर्कों को संसाधित करते समय सभी कमांड इस तरह से व्यवहार नहीं करते हैं, लेकिन अधिकांश करते हैं।