यूनिक्स में एक स्टैंडअलोन कमांड के रूप में तारांकन का कार्य क्या है?


21

मैं Red Hat Linux पर टर्मिनल में गड़बड़ कर रहा था, और जब मैंने *वापसी के बाद तारांकन चिह्न ( ) टाइप किया, और इसने मेरी निर्देशिका में एक प्रोग्राम निष्पादित किया। क्यूं कर?

मेरा सबसे अच्छा अनुमान है कि यूनिक्स ने इसे वाइल्डकार्ड के रूप में माना है इसलिए इसने पहले अल्फ़ाबेटिक प्रोग्राम को अंजाम दिया। चूंकि my_program.exeऔर one_of_my_programs.programकेवल फ़ाइल का नाम टाइप करके निष्पादित किया जा सकता है, वाइल्डकार्ड ऑपरेटर सभी संभावित फ़ाइलों का प्रतिनिधित्व करता है। चूंकि कोई प्रोग्राम पहली बार वर्णानुक्रम में है, यूनिक्स इसे निष्पादित करता है। क्या यह एक सही निर्णय है?


मुझे लगता है कि सभी गोले *वर्णानुक्रम के विस्तार को क्रमबद्ध नहीं करते हैं , लेकिन बैश वह है जो करता है।
22

1
@aschepler: सभी पोसिक्स-अनुरूप गोले; pubs.opengroup.org/onlinepubs/9699919799/utilities/… para 3. देखें
dave_thompson_085

जवाबों:


20

आपकी व्याख्या सही है। शेष फाइलों को इसकी पैरामीटर सूची के रूप में प्रस्तुत किया जाएगा।

ध्यान दें कि यह केवल यह करेगा यदि प्रोग्राम में निष्पादन योग्य बिट सेट है, और वर्तमान निर्देशिका PATHसूची में है।

नोटों की एक जोड़ी जो समझने में मदद कर सकती है: -

  • यदि आप टाइप करते हैं ./*तो PATHप्रवेश एक आवश्यकता नहीं है।
  • यदि आप टाइप करते हैं . *या . ./*पहली मिलान फ़ाइल एक स्क्रिप्ट है, तो इसे निष्पादित करने की आवश्यकता नहीं है, और न ही वर्तमान निर्देशिका की आवश्यकता है PATH(इसके अलावा अन्य गोले के लिए सच नहीं हो सकता है bash)।

10
"यह केवल यही करेगा ..." - यह अधिक दिलचस्प हो सकता है। यदि PATHपहले फ़ाइल के रूप में एक ही नाम के साथ एक शेल फ़ंक्शन, बिलिन या एक निष्पादन योग्य है, तो इस अन्य कमांड को निष्पादित किया जाएगा। mkdir foo; cd foo; touch rm xyz; ls; *; ls
कामिल मैकियोरोवस्की

@KamilMaciorowski - उचित बिंदु: मेरा कथन "यह केवल यह करेगा ..." आवश्यक शर्तें निर्दिष्ट करें , लेकिन पर्याप्त नहीं हैं। यदि *उपनाम अन्य है तो कमांड भी अलग तरह से व्यवहार करेगा ।
AFH

1
निष्कर्ष: यह मत करो! यहां तक ​​कि अगर आपको लगता है कि आप ग्लोब विस्तार अल्फाबेटिक ऑर्डर पर भरोसा कर सकते हैं, तो ध्यान दें कि यह ऑर्डर लोकेल पर निर्भर करता है।
आरोन

के अलावा . *या . ./*एक कर सकते हैं bash *(या किसी अन्य शेल)।
ओलिवियर दुलैक

11

यह सुझाव देता है कि .आपके PATHचर का हिस्सा है । यह सुरक्षा कारणों से एक बहुत बुरा विचार है (स्वाभाविक रूप से, विंडोज को इसे एक असम्बद्ध डिफ़ॉल्ट बनाना था)।

हालाँकि, यह "सुझाव" केवल मामूली रूप से मान्य है: यदि आपके पास rmअपनी वर्तमान निर्देशिका में एक फ़ाइल है , *तो डिफ़ॉल्ट रूप से ठीक होगा rm:

/tmp$ mkdir ohno
/tmp$ cd ohno
/tmp/ohno$ 
/tmp/ohno$ ls
/tmp/ohno$ touch rm what
/tmp/ohno$ ls
rm  what
/tmp/ohno$ *
/tmp/ohno$ ls
rm
/tmp/ohno$ 

जैसा कि आप देख सकते हैं, यह rmवर्तमान निर्देशिका (एक खाली और गैर-निष्पादन योग्य फ़ाइल) में नहीं था जिसे निष्पादित किया गया था, बल्कि सिस्टम डिफ़ॉल्ट है /bin/rm

वाइल्डकार्ड्स शामिल होने पर हमेशा अपने आदेशों की दोबारा जांच करें। यहाँ सबसे भयानक संदेशों में से एक को कभी पढ़ा है:

rm: cannot remove '.o': No such file or directory

यह कॉलिंग का परिणाम है

rm * .o

, अधिक या कम एक स्थान के सबसे खराब स्थान के साथ आ सकता है।


1
यह एक फ़ंक्शन बनाने के लिए चोट नहीं करता है rm()जो या तो -iमापदंडों में जोड़ता है या मापदंडों की जांच करता है और एक निश्चित संख्या से अधिक होने पर पुष्टि के लिए पूछता है।
AFH

3
+1 के लिए "यहां पर पढ़ने के लिए सबसे भयानक संदेशों में से एक है"।
मेहरदाद

+1 के लिए "सुरक्षा कारणों से यह वास्तव में बुरा विचार है (स्वाभाविक रूप से, विंडोज को इसे एक असम्बद्ध डिफ़ॉल्ट बनाना था)।"
डंकन एक्स सिम्पसन


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