केवल नाम से और इसके पहले एक डॉट / स्लैश को जोड़कर एक निष्पादन योग्य चलाने के बीच क्या अंतर है?


13

यह ls -allकमांड से आउटपुट है :

-rwxr----- 1 subhrcho dba  3600 Nov 13 17:26 jdev
-rw-r----- 1 subhrcho dba  1566 Nov 13 17:26 jdev-Darwin.conf
-rw-r----- 1 subhrcho dba   347 Mar  6  2009 jdev-debug.boot
-rw-r----- 1 subhrcho dba   821 Nov 13 17:26 jdev-logging-debug.conf
-rw-r----- 1 subhrcho dba   584 Nov 13 17:26 jdev-logging.conf
-rw-r----- 1 subhrcho dba  4717 Jul 31 16:09 jdev.boot
-rw-r----- 1 subhrcho dba 12877 Nov 13 17:26 jdev.common
-rw-r----- 1 subhrcho dba  5047 Dec  6 01:43 jdev.conf
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdev.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64W.exe
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdevW.exe

अब जब मैं jdevइसे चलाता हूं तो यह Oracle JDveloper का एक अलग संस्करण चलाता है जब मैं इसे चलाता हूं ./jdev.. तो ऐसा क्यों है?

जवाबों:


20

जब आप एक निष्पादन योग्य फ़ाइल चलाते हैं (या यूनिक्स / लिनक्स दुनिया में - निष्पादन योग्य अधिकारों / ध्वज के साथ एक फ़ाइल) जैसे:

$ ./jdev

उसके बाद आप यह चिन्हित करते हैं .कि आप अपनी वर्किंग डायरेक्टरी (निर्देशिका जो आप वर्तमान में हैं) के अंदर एक फाइल चलाना चाहते हैं, जिसे नाम दिया गया है jdevऔर इसे लॉन्च करने वाले उपयोगकर्ता के लिए निष्पादन योग्य अधिकार हैं (आपको ध्यान रखना होगा कि यह अभी भी एक लिंक हो सकता है अन्य फ़ाइल, आप देख सकते हैं कि ls -l jdevटर्मिनल में टाइप करके )

( लिनक्स / यूनिक्स में फ़ाइल अनुमति देखें )

जब आप इसे चलाने के रूप में

$ jdev

तो सबसे अधिक संभावना है वहाँ है jdevसिस्टम पर कहीं स्थापित किया है और आप में यह है $PATH(उदाहरण के लिए /usr/bin/या /bin/या /usr/local/bin/)

जैसा कि पीटरफ ने कहा: आप whichनिष्पादन योग्य को इंगित करने के लिए उपयोग कर सकते हैं जो विशेष कमांड के साथ लॉन्च किया जा रहा है, जैसे:

$ which find
/usr/bin/find

1
यह भी नहीं कि whichउपयोगिता आपको बता सकती है कि यदि कोई रास्ता नहीं दिया गया है तो निष्पादन योग्य का क्या उपयोग किया जाएगा।
पेट्रफ

@peterph ने मेरे उत्तर को संपादित किया।
पैट्रीक

7
यह typeदेखने के लिए उपयोग करना बेहतर है कि विशेष कमांड द्वारा क्या लॉन्च किया गया है। कारण whichआपको $ PATH में कहीं न कहीं केवल एक बाइनरी दिखाएगा, हालांकि इसे पूरी तरह से एक अन्य बाइनरी के रूप में उतारा जा सकता है।
भीड़

@rush मैंने अभी-अभी कोशिश की है और आपके कहने पर यह काम नहीं करेगा [~] $which zsoelim /usr/bin/zsoelim [~] $ type zsoelim zsoelim is /usr/bin/zsoelim:। जबकिzsoelim -> soelim
पेट्रीक

2
@Patryk मुझे लगता है कि भीड़ का मतलब शेल उपनामों / कार्यों से है, जिसे whichखोजने का कोई मौका नहीं है, क्योंकि यह एक स्टैंडअलोन बाइनरी है, जिसमें रनिंग शेल वातावरण तक पहुंच नहीं है (जिससे मेरा मतलब उपनाम और कार्य है, न कि केवल पर्यावरण चर (जिनमें से कुछ विरासत में मिले हैं)।
पीटरफ

8

यदि आप शेल में इसके नाम में कोई स्लैश नहीं के साथ एक कमांड कहते हैं, तो यह शेल उपनामों, कार्यों और $PATHपर्यावरण चर में प्रदान किए गए रास्तों की सूची में दिखाई देता है। (ध्यान दें कि आपके पास वर्तमान कार्यशील निर्देशिका (जैसा कि .या रिक्त स्ट्रिंग निर्दिष्ट किया जा सकता है ) या किसी भी रिश्तेदार निर्देशिका में है $PATH, लेकिन सुरक्षा कारणों से इसकी अनुशंसा नहीं की जाती है)।

यदि नाम में कोई स्लैश है, तो ऐसा नहीं होता है, नाम कमांड को निष्पादित करने के लिए एक पथ के रूप में लिया जाता है (हालांकि कुछ गोले जैसे zshउपनाम या फ़ंक्शंस उनके नाम में स्लैश रखने की अनुमति देते हैं जो बाद में पूर्वता लेंगे)।

इसलिए, यदि आप एक कमांड चलाना चाहते हैं, fooजो कि वर्तमान कार्य निर्देशिका में है, तो आपको एक नाम के साथ आना होगा जिसमें एक स्लैश होता है। ./fooसबसे स्पष्ट है। आप भी पूर्ण पथ का उपयोग कर सकते हैं, या ../dir/foo...

यह जानने के लिए कि शेल क्या चलेगा, typeकमांड का उपयोग करें । कमांड का उपयोग न करेंwhich जो आम तौर पर वह नहीं करता है जो आप सोचते हैं कि यह करता है और एक विरासत है cshजिसमें से बेहतर अकेले छोड़ दिया जाता है।


क्यों नहीं "जो" लेकिन "प्रकार"?
गीक

@ गीक, यह एक अक्सर पूछे जाने वाले प्रश्न है, यहाँ देखें unix.stackexchange.com/search?q=Iwhichiding+type
स्टीफन चेज़लस

क्या आपने सही लिंक प्रदान किया?
गीक

यह इस साइट पर एक खोज परिणाम है यह साबित करने के लिए कि यह अक्सर पूछे जाने वाला प्रश्न है। उन सवालों के कई जवाब आपको बताएंगे कि क्यों नहीं उपयोग करना है which। उदाहरण के लिए देखें unix.stackexchange.com/questions/16693/…
Stéphane Chazelas

2

मैं Zsh के 'इन' ('से बेहतर') का उपयोग करने की सलाह देता हूं, यह देखने के लिए कि कैसे और किस क्रम में उपनाम, शेल बिल्ट-इन या कुछ और $ PATH ;-) के क्रम में मिलेगा

यहां चीजों को बेहतर तरीके से समझने के लिए एक उदाहरण दिया गया है कि इसे कैसे चुना जाता है:

[ 0:04:08 ] afsin@s15426859:~ % pwd
/home/afsin
[ 0:04:30 ] afsin@s15426859:~ % which who
/usr/bin/who
[ 0:04:47 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
[ 0:05:27 ] afsin@s15426859:~ % echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/home/afsin/bin
[ 0:05:31 ] afsin@s15426859:~ % touch who
[ 0:05:40 ] afsin@s15426859:~ % chmod +x who
[ 0:05:47 ] afsin@s15426859:~ % ls -al who
-rwxr-xr-x 1 afsin afsin 0 23. Jan 00:05 who
[ 0:05:50 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
[ 0:05:55 ] afsin@s15426859:~ % export PATH=$PATH:.
[ 0:06:09 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
./who
[ 0:06:14 ] afsin@s15426859:~ % alias who=who
[ 0:06:19 ] afsin@s15426859:~ % where who
who: aliased to who
/usr/bin/who
/usr/bin/X11/who
./who
[ 0:06:22 ] afsin@s15426859:~ % which who
who: aliased to who
[ 0:06:27 ] afsin@s15426859:~ %

1

यद्यपि यह संभवतः आपके शेल पर निर्भर करता है, नियम आमतौर पर है:

  • यदि आप कोई पथ प्रदान करते हैं, तो सापेक्ष या निरपेक्ष, उस पथ का उपयोग किया जाता है। ./jdevएक सापेक्ष पथ है, क्योंकि .वर्तमान निर्देशिका के लिए खड़ा है (वास्तव में, ls -all .आप के रूप में ही देना होगा ls -all)। यदि आप करते हैं /usr/bin/tool/, तो आप एक निरपेक्ष मार्ग का उपयोग कर रहे हैं। इन मामलों में, फ़ाइल को निष्पादित करने के लिए कहा गया है।

  • यदि आप एक मार्ग प्रदान नहीं करते हैं, लेकिन सिर्फ एक नाम है, तो जिन निर्देशिकाओं को $PATHआप चलाने का प्रयास कर रहे हैं उनके लिए खोज की जाती है।

यदि आपके पास कुछ निर्देशिकाओं में एक फ़ाइल के समान नाम वाली वर्तमान निर्देशिका में एक फ़ाइल है $PATH, और आप इसे ./उसके नाम के साथ जोड़कर चलाते हैं , तो आप प्रभावी रूप से एक अलग फ़ाइल चलाएंगे।

शायद एक और मुद्दा यह है कि आप वास्तव jdevमें मौजूदा निर्देशिका में निष्पादन योग्य चलाने की उम्मीद कर रहे थे । जब तक आप $PATHइसमें शामिल नहीं हुए ., यह ऐसी चीज नहीं है जिसकी आपको उम्मीद करनी चाहिए ...

... और यह अभी भी .वहाँ शामिल करने के लिए एक अच्छा विचार नहीं है , अगर आप ऐसा करते हैं तो कृपया कम से कम इसे अंत में डाल दें, ताकि बाकी $PATHको हमेशा पहले खोजा जाए - बस कल्पना करें कि आप एक साझा नेटवर्क निर्देशिका पर हैं और किसी ने वहाँ एक बुराई बाइनरी लगाने का फैसला किया ls, जैसे कि अगर $PATHशुरू होता है , तो .एक सरल ls -lahआपके सिस्टम पर हमला करने के लिए पर्याप्त होगा।


आपकी शब्दावली भ्रामक है। jdevअकेले भी एक सापेक्ष पथ है। नियम यह है: यदि इसमें कोई स्लैश नहीं है, तो यह उपनाम, फ़ंक्शंस में दिखाई देता है $PATH, अन्यथा, यह सीधे फाइल सिस्टम पर देखा जाता है (हालांकि कुछ गोले उपनाम या उनके नाम के साथ कार्य करने की अनुमति देते हैं) जो तब ले जाएगा precendence)।
स्टीफन चेजलस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.