किसी फ़ाइल को निष्पादित करने के लिए हम "./" का उपयोग क्यों करते हैं?


84

हम ./filenameएक फाइल को लिनक्स में निष्पादित करने के लिए क्यों उपयोग करते हैं ?

क्यों न इसे अन्य कमांड्स की तरह दर्ज करें gcc, lsआदि ...


क्या पहली पंक्ति को बेहतर नहीं लिखा जाएगा "हम लिनक्स में ./command_nameएक कमांड निष्पादित करने के लिए क्यों उपयोग करते हैं ?"

जवाबों:


78

लिनक्स में, यूनिक्स और संबंधित ऑपरेटिंग सिस्टम, .वर्तमान निर्देशिका को दर्शाता है। चूंकि आप अपनी वर्तमान निर्देशिका में फ़ाइल चलाना चाहते हैं और वह निर्देशिका आपके पास नहीं है $PATH, तो आपको ./शेल को यह बताने की आवश्यकता है कि निष्पादन योग्य कहां है। तो, ./fooइसका मतलब है कि निष्पादन योग्य चलाएं जो fooइस निर्देशिका में है।

आप अपने में पाए जाने वाले किसी भी कमांड के पूर्ण पथ का उपयोग कर सकते हैं typeया कर सकते हैं ।which$PATH


5
वर्तमान निर्देशिका में कार्यक्रमों को निष्पादित करना बहुत आम है। शेल वहाँ भी क्यों नहीं खोज करता है? यह पहले $ PATH में, फिर में खोज करता है।
माइकल

वहाँ भी हैं aliasकि रास्ते में मिल सकता है, न कि बस $PATH
user2485710

18
@ मिचेल सुरक्षा और पवित्रता: यदि यह .पहली बार खोजा गया है तो यह एक सुरक्षा मुद्दा होगा, आप या कोई और lsउदाहरण के लिए प्रतिस्थापित कर सकता है (एक साधारण वायरस / ट्रोजन: इसमें एक निष्पादन योग्य नाम के साथ एक जिप फाइल बनाएं ls, जैसा कोई व्यक्ति खोज रहा है , वे इस निष्पादन योग्य, कि ...) चलाते हैं। यदि यह .अंतिम में खोजा गया है, तो आप लंबे समय तक यह जानने में पागल हो सकते हैं कि न जाने क्यों आपका कार्यक्रम काम नहीं कर रहा है (जैसे कि आप एक प्रोग्राम बनाते हैं जिसे टेस्ट कहा जाता है, आपके प्रोग्राम को चलाने के बजाय यह सिस्टम टेस्ट प्रोग्राम चलाता है। जो कोई आउटपुट नहीं पैदा करता है)।
ctrl-alt-delor

यह यह भी सुनिश्चित करता है कि यदि एप्लिकेशन या स्क्रिप्ट आपके पथ में कई बार दिखाई देती है, तो आप उस संस्करण को निष्पादित कर रहे हैं जिसे आप चलाने का इरादा रखते हैं (आपके "" निर्देशिका में यहां एक है)।
जिम

आप export PATH="$PATH:."मौजूदा निर्देशिका में कमांड निष्पादित करने के लिए निष्पादित कर सकते हैं यदि PATH में कहीं और नहीं मिला है, तो आप इसे अपनी .bashrc फ़ाइल में जोड़ सकते हैं
jcubic

99

शाब्दिक उत्तर अन्य लोगों द्वारा दिया गया है: क्योंकि वर्तमान निर्देशिका आपके में नहीं है $PATH

लेकिन क्यों? संक्षेप में, यह सुरक्षा के लिए है। यदि आप किसी और के घर निर्देशिका (या / tmp) में देख रहे हैं, और बस टाइप करें, gccया lsआप यह जानना चाहते हैं कि आप वास्तविक एक चला रहे हैं, न कि एक दुर्भावनापूर्ण संस्करण जिसे आपके प्रैंकस्टर मित्र ने लिखा है जो आपकी सभी फाइलों को मिटा देता है। एक अन्य उदाहरण होगा testया [, जो शेल स्क्रिप्ट्स में उन कमांड को ओवरराइड कर सकता है, अगर आपके शेल में बिल्ट-इन नहीं हैं।

बीत रहा है .के रूप में पिछले अपना रास्ता में प्रवेश थोड़ा सुरक्षित है, लेकिन वहाँ अन्य हमलों जो कि का उपयोग कर रहे हैं। एक आसान एक सामान्य टाइपो का शोषण करना है, जैसे slया ls-l। या, एक सामान्य कमांड को ढूंढें जो इस सिस्टम पर स्थापित नहीं किया जाता है - vimउदाहरण के लिए, चूंकि सिस्मैडिन्स टाइप करने के लिए ऊपर-औसत संभावना से हैं।


5
किसी के द्वारा बिट पाने का एक व्यावहारिक उदाहरण: unix.stackexchange.com/questions/7767
mattdm

बस PATHपर्यावरण चर में पूर्ण पथ है ।
एड हील

45

अगर आपका मतलब है, तो आपको इसकी आवश्यकता क्यों है। प्रारंभ में / - क्योंकि (विंडोज में) इसके विपरीत, वर्तमान निर्देशिका डिफ़ॉल्ट रूप से आपके पथ का हिस्सा नहीं है। यदि आप चलाते हैं:

$ ls

आपका शेल lsआपके PATH परिवेश चर ( echo $PATHइसे देखने के लिए) में निर्देशिकाओं की तलाश करता है, और पहली निष्पादन योग्य रन चलाता है जिसे lsयह पाता है। यदि आप टाइप करते हैं:

$ a.out

शेल इसी तरह करेगा - लेकिन यह संभवतः a निष्पादन योग्य नहीं होगा जिसे a.out कहा जाता है। आपको शेल को यह बताने की आवश्यकता है कि a.out कहां है - यह वर्तमान निर्देशिका (।) में है, फिर पथ है ./a.out

यदि आप पूछ रहे हैं कि इसे "a.out" क्यों कहा जाता है, तो यह केवल gcc के लिए डिफ़ॉल्ट आउटपुट फ़ाइल नाम है। -O कमांड लाइन आर्ग के साथ आप इसे बदल सकते हैं। उदाहरण के लिए:

$ gcc test.c -o test
$ ./test

धन्यवाद। मुझे संदेह है कि आपको इसकी आवश्यकता क्यों है। प्रारंभ में .... मुझे "" का उपयोग मिला। (वर्तमान निर्देशिका को लिखने के लिए) लेकिन उसके बाद "/" क्यों?
रेन्जिथ जी

8
/ Linux में पथ विभाजक है, इसलिए आप इसका उपयोग फ़ाइल नाम (a.out) से निर्देशिका (।) को अलग करने के लिए करते हैं। इसके बिना आपके पास .a.out जो कि अपने आप में एक वैध फ़ाइल नाम है। ( touch .a.out; ls -lAइसे देखने की कोशिश करें।)
साइमन व्हिटकेकर

5
यह है कि आप यूनिक्स में पथ कैसे निर्दिष्ट करते हैं, <dir>/<file>इसलिए आप मूल रूप से वर्तमान निर्देशिका में एक फ़ाइल निष्पादित करने के लिए कह रहे हैं, जो इंगित करता है./test
रोहन मोंगा 30'10

Red Hat Linux रिलीज़ 9 (श्रीके) कर्नेल 2.4.20-8 एक i686 पर [renjithg @ cvsserver renjithg] $ touch .a.out; ls -lA कुल 3 -rw-rw-r-- 1 renjithg renjithg 0 Nov 30 13 13 : 46 .a.out -rwxrwxr-एक्स 1 renjithg renjithg 11,669 नवंबर 30 13:46 a.out -rw-rw-r-- 1 renjithg renjithg 218 अगस्त 24 2009 aray.c [renjithg @ cvsserver renjithg] $
रंजीत जी

3
Red Hat Linux 9? उन्नयन का समय!
Mattdm

4

आप :.अपने $ PATH चर में जोड़ने का प्रयास कर सकते हैं ।

ALT + F2 आज़माएँ और टाइप करें: gksudo gedit /etc/environmentयदि लिनक्स / जीटीके चल रहा है (यह उबंटू का उपयोग करते समय आपके पास है)।

फिर भी, मैं दृढ़ता से आपको सलाह देता हूं कि ऐसा न करें। यह बुरा बुरा बुरा और बुरा है।

आप जानते हैं, 1970 के बाद से इस तरह की चीजें काम करती हैं। एक कारण है कि वर्तमान निर्देशिका $ PATH में शामिल नहीं है।

. वर्तमान निर्देशिका है

.somethingएक छुपी हुई फ़ाइल होगी (Nautilus में प्रकट होने के लिए "ALT +" टाइप करें, या " ls -la" आज़माएँ ।

./someProgram.sh क्या आप मौजूदा निर्देशिका में एक निष्पादन योग्य someProgram.sh चलाने के लिए टाइप करते हैं।

.somethingElse इसका मतलब होगा कि आपके पास वर्तमान निर्देशिका में एक छिपा हुआ निष्पादन योग्य है, जो एक बुरा विचार है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.