क्या "फ़ाइल" और "। फ़ाइल" पथ के बीच कोई अंतर है?


12

जैसा कि शीर्षक कहता है, क्या * NIX फाइल सिस्टम के लिए कोई अंतर है? जैसे ls fileऔरls ./file


1
आप unix.stackexchange.com से पूछ सकते हैं - अब तक के सभी उत्तर उनमें अच्छी जानकारी रखते हैं, लेकिन न तो वास्तव में उत्तर की तरह लगता है ।
रोब स्टारिंग

जवाबों:


14

मैं SmallLoanOf1M द्वारा स्पष्टीकरण के बारे में पागल नहीं हूं। यह तकनीकी रूप से सही है लेकिन इस तरह से उत्तर देता है जो प्रश्न में उपयोग के उदाहरण से मेल नहीं खाता है।

इसलिए, उदाहरण के लिए, यहां प्रश्न से दोनों के बीच एक महत्वपूर्ण अंतर है: "फ़ाइल" और "./ile"।

क्या होगा यदि फ़ाइल को उस वर्ण से नाम दिया गया है जो शेल द्वारा पार्स किया गया है? विशेष रूप से कमांड एक द्वारा चलाए जा रहे पात्रों के बारे में।

विशेष रूप से, "डैश" वर्ण: "-"। लेकिन अन्य वर्ण शेल के लिए सार्थक हैं।

उदाहरण। मेरी फ़ाइल का नाम "-डिंगल" था

फ़ाइल को सूचीबद्ध करने का प्रयास करें:

ls -dingle
# ls -dingle
ls: invalid option -- 'e'

इससे भी बदतर, क्या होगा अगर फ़ाइल का नाम " -rf rmbomb *" था? अब इसे हटाने का प्रयास करें

rm "-rf rmbomb *"

मैं भी उस उदाहरण को चलाने की कोशिश नहीं कर रहा हूं, लेकिन उम्मीद है कि आपको यह विचार मिलेगा।

तो आप डैश के साथ घूर फ़ाइल को कैसे सूचीबद्ध करते हैं? ./सामने प्रयोग करें ।

# ls ./-dingle
./-dingle

के लिए डिट्टो rm


यह अजीब फाइलों के साथ कुछ फ़ाइलों को संसाधित करने का एक वैध तरीका है, और मेरे जवाब ने उस तरह की फाइलों पर विचार नहीं किया। ऊपर दिए गए सभी उदाहरणों की जगह एक शाब्दिक का भी उपयोग किया जा सकता है, बैकस्लैश पूर्ववर्ती विषम वर्णों के रूप में, ऊपर निर्दिष्ट रिक्त स्थान सहित। इसका एक उदाहरण ऐसा होगा: ls \-dingleया ls \-rf\ rmbomb\ \*। यह सुनिश्चित करने का एक अच्छा तरीका हो सकता है कि दिए गए आदेशों में से कोई भी सेट कम से कम सुसंगत हो, जैसा ./कि किसी नाम के बाद वर्णों से बचने से पहले निर्दिष्ट करना होगा ./
स्पूलर

2
ऐसा होता है कि, चूंकि शेल शेल से बच जाता है, कमांड नहीं, और कमांड द्वारा पार्स किया जाता है, भागने - या उद्धृत करने से - कुछ भी उपयोगी नहीं है।
डेवी मोर्गन

2
आप इसे ध्वनि की तरह बनाते हैं rm "-rf rmbomb *"कि वास्तव में कुछ बुरा होगा, बजाय केवल rmएक त्रुटि प्रिंट करने के। यह केवल खतरनाक है अगर आप फ़ाइल नाम को उद्धृत करना भूल जाते हैं, तो शब्द-विभाजन होता है। (esp; एक शेल स्क्रिप्ट में जहां आप चलाने के rm $fileबजाय चलाते हैं rm "$file"। लेकिन उस स्थिति में, *विस्तार नहीं होगा, क्योंकि ग्लोब विस्तार वैरिएबल विस्तार की सामग्री पर नहीं होता है। यदि आप चाहते हैं कि, आपको एक की आवश्यकता होगी eval।) वैसे भी, यदि आपका स्क्रिप्ट शब्द-विभाजन rm से गुजरने से पहले फाइलनाम करता है, तो मैं एक फाइल बनाऊंगा जिसे space -rf .कुछ कहा जाएगा , इसलिए rm ./$iयह मदद नहीं करता है।
पीटर कॉर्ड्स

1
BTW, वास्तविक त्रुटि संदेश है rm: invalid option -- ' ', जब से यह -rfएकल-वर्ण स्विच के रूप में अंतरिक्ष की व्याख्या करने की कोशिश करता है , क्योंकि यह उसी तर्क का हिस्सा है। (और हां, मैंने इसे एक खाली निर्देशिका के अंदर ही चलाया था जब मैंने कुछ अनदेखी की थी और यह वास्तव में खतरनाक था: पी)
पीटर कॉर्ड्स

2
@PeterCordes: शब्दविश्लेषण और ग्लोबिंग डीओईएस बिना किसी परिवर्तनशील परिवर्तन और कमांड प्रतिस्थापन के परिणामों पर होते हैं, जब तक कि इसके द्वारा IFS=''और -fक्रमशः दबाया न जाए । एक दुर्लभ उदाहरण यह है कि awkएक ऑपरेंड (एक पहले ऑपरेंड के अलावा जो स्क्रिप्ट है) foo=barको निष्पादित करने के लिए असाइनमेंट के ./foo=barरूप में लेकिन पढ़ने के लिए एक फ़ाइल के रूप में होता है।
dave_thompson_085

7

हाँ।

fileकमांड लाइन पर जारी करके , BASH उस नाम की एक फ़ाइल के लिए आपके $ PATH पर्यावरण चर की खोज करेगा। जब तक फ़ाइल आपके PATH चर के भीतर एक निर्देशिका में नहीं रहती है, तब तक यह नहीं मिलेगी।

.वर्तमान निर्देशिका का मतलब है। ./साधन के भीतर मौजूदा निर्देशिका, सापेक्ष दृष्टि से। यह निर्देशिका में काम करते /home/sheogorath/shivering/isles.imgसमय आह्वान करने जैसा कुछ कहने के बराबर है ।./isles.img/home/sheogorath/shivering/

जैसे, यह आमतौर पर "आपके स्थान पर" कार्यशील निर्देशिका में फ़ाइलों को निष्पादित करने के लिए उपयोग किया जाता है।

संपादित करें: आपके उदाहरण में, lsशेल द्वारा बुलाया जा रहा है और पाथ वेरिएबल का उपयोग करके पाया जाता है। इसके तर्क को आपकी कार्यशील निर्देशिका में संसाधित किया जाएगा, जो कुछ भी हो सकता है। चूंकि यह डिफ़ॉल्ट है ls, इसलिए आप निर्दिष्ट करने fileऔर स्पष्ट रूप से निर्दिष्ट करने के बीच कोई अंतर नहीं देखेंगे ./fileक्योंकि वे दोनों आपकी वर्तमान निर्देशिका को इंगित करते हैं।

सभी कमांड काम कर रहे डायरेक्टरी में फाइल पाथ को स्वीकार नहीं करेंगे, और कुछ आपको एक डायरेक्टरी में स्टेट फाइल रखने की उम्मीद करते हैं, जो वे स्वयं कॉन्फ़िगरेशन के माध्यम से पूर्व-परिभाषित करते हैं। उन आदेशों के बीच जो फाइलों को तर्क के रूप में स्वीकार करते हैं, ये आदेश कम सामान्य हैं


1
यह बैश है, लेकिन मैं सामान्य रूप से पथ संकल्प के बारे में सोच रहा था
सर्गेई अलाव

1
यह एक ऐसा तरीका है जो मैंने कभी भी काम के बारे में सुना है। BASH केवल सबसे अधिक इस्तेमाल किया जाता है।
स्पूलर

4
$ PATH केवल आदेशों के लिए प्रासंगिक है और फ़ाइल नाम तर्कों के साथ कुछ भी नहीं है lsजो मूल प्रश्न में उल्लिखित आदेश का पालन करते हैं। यही कारण है कि एक सापेक्ष पथ (वर्तमान कार्यशील निर्देशिका के सापेक्ष) ../../dir/filename /path/to/dir/filename
Iff

1
शोगोरथ के लिए +1 ... और एक सही उत्तर।
कोरी ओगबर्न

1
यदि वे एक कमांड के तर्क हैं जो डिफ़ॉल्ट रूप से कार्य निर्देशिका में फ़ाइलों को खोजने का प्रयास करते हैं, तो वे समान होंगे। इस प्रकार, lsउनके लिए हमेशा एक ही रास्ता होगा, एक दूसरे की तुलना में अधिक स्पष्ट रूप से निर्दिष्ट होगा। तर्कों को संसाधित करते समय सभी कमांड इस तरह से व्यवहार नहीं करते हैं, लेकिन अधिकांश करते हैं।
स्पूलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.