^ का उपयोग एक शेल मेटाचैकर के रूप में


19

मैंने आज एक छोटी स्क्रिप्ट लिखी थी जिसमें निहित था

grep -q ^local0 /etc/syslog.conf

समीक्षा के दौरान, एक सहकर्मी ने सुझाव दिया कि ^local0उद्धृत किया जाए क्योंकि ^बोर्न शेल में "पाइप" है। इस दावे से आश्चर्यचकित, मैंने इसका उल्लेख करने वाले किसी भी संदर्भ को ट्रैक करने का प्रयास किया। इंटरनेट पर मुझे कुछ भी नहीं मिला यह सुझाव एक समस्या थी।

हालांकि, यह पता चला है कि bshAIX 7 पर (जो बोर्न शेल होने का दावा करता है) का कार्यान्वयन वास्तव में यह व्यवहार है:

> bsh
$ ls ^ wc
      23      23     183
$ ls | wc
      23      23     183

अन्य "बॉर्न शेल" कार्यान्वयनों में से कोई भी मैंने इस तरह से व्यवहार करने की कोशिश की (जो कि, ^शेल मेटाचैकर को बिल्कुल नहीं माना जाता है)। मैंने shCentOS (जो वास्तव में बैश है), और shFreeBSD (जो बैश नहीं है) पर कोशिश की। मेरे पास कोशिश करने के लिए कई अन्य प्रणालियाँ नहीं हैं।

क्या यह व्यवहार अपेक्षित है? कौन से गोले ^को पाइप मेटाचैकर मानते हैं ?


1
मुझे पता है कि ^zsh और regex अंतरिक्ष में भी एक नकारात्मक चरित्र है। एक अलग टिप्पणी के रूप में, आमतौर पर गोले में पोर्टेबिलिटी के लिए grep अभिव्यक्ति में एकल उद्धरण का उपयोग करने की सलाह दी जाती है।
एमकेसी

बोर्न शेल में बहुत ही अजीब व्यवहार था जिसे हम अभी भी आधुनिक शेल कोड जैसे उदाहरण के लिए काम के आसपास देखते हैं [ x"$foo" = x"bar" ]
जोर्डनम

bshयह बॉर्न शेल नहीं है। केवल AIX पर बॉर्न शेल के लिए नाम का दुरुपयोग किया जाता है। bshबल्कि 1984 में मेरे द्वारा HOSBerhold AG पर UNOS (पहला UNIX क्लोन) में पेश किया गया एक खोल है। ध्यान दें कि AIX 1984 में अस्तित्व में नहीं था।
विद्वान

जवाबों:


21

^के पर्याय के रूप में चरित्र |तारीख से वापस थॉम्पसन खोल । उन्हें यूनिक्स v4 में एक ही समय में पेश किया गया था और मैन पेज में एक साथ उल्लेख किया गया है । स्वेन मस्किट का उल्लेख है कि ^"अपर-केस-ओनली टर्मिनलों" पर सुविधा के कारणों के लिए "संभवतः [शुरू किया गया था" जहां टाइपिंग |"कुछ हद तक दर्द" था

थॉम्पसन शेल लंबे समय से चला गया है, लेकिन इसके उत्तराधिकारी बॉर्न शेल ने एक ही वाक्य रचना (भले ही इसके मैन पेज का केवल उल्लेख किया हो |) को बरकरार रखा ।

राख, बाश और क्ष जैसे उत्तराधिकारी कवच ​​केवल |पाइप चरित्र के रूप में समझते हैं । आप ओपन सोर्स यूनिक्स वेरिएंट पर एक वास्तविक बॉर्न शेल नहीं खोज रहे हैं क्योंकि लंबे समय से बॉर्न शेल का कोई ओपन सोर्स रिलीज़ नहीं था। (मुझे लगता है कि ओपनसोलारिस में एक को शामिल किया गया था, लेकिन इसे उस समय तक कहीं और नहीं अपनाया गया था जब तक कि इसे नए कार्यान्वयनों से लंबा नहीं किया गया था)।

एकल यूनिक्स विशिष्टता का उल्लेख नहीं है ^विशेष वर्ण, जो प्रभावी रूप से इसका मतलब है कि POSIX के गोले से समझना चाहिए यह literally¹ के रूप में। मुझे नहीं लगता कि बॉर्न शेल (केवल स्वतंत्र कार्यान्वयन) का एक पूरी तरह से POSIX- अनुरूप संस्करण रहा है।

^विकल्प extendedglobसक्षम होने पर zsh में विशेष है , लेकिन इसके श अनुकूलता मोड में नहीं है। अपने डिफ़ॉल्ट मोड में, यह कई तरह से POSIX से भटकता है।

मैं ^स्पष्टता के लिए वैसे भी एक नियमित अभिव्यक्ति में उद्धृत करने की सलाह देता हूं । एक स्क्रिप्ट में नियमित अभिव्यक्ति को उद्धृत करें, चाहे उसमें कोई भी चरित्र दिखाई दे।

Card वाइल्डकार्ड पैटर्न में ब्रैकेट अभिव्यक्ति के पहले चरित्र को छोड़कर, जहां !मानक नकारात्मक चरित्र है, लेकिन कार्यान्वयन भी ^उसी तरह व्याख्या कर सकते हैं ।


धन्यवाद, 2003 से पूरा TUHS धागा ज्ञानवर्धक था।
ग्रेग हेविल

पूर्णता के लिए, आप यह उल्लेख करना चाह सकते हैं कि जहां यह पुनर्निर्देशन ऑपरेटर है, वहां ^विशेष है fish, rc/ esजहां यह एक संघटन ऑपरेटर , या इतिहास विस्तार के लिए csh / tsh / bash / zsh है, जब यह कमांड लाइन का पहला वर्ण है।
स्टीफन चेजलस


3

हां, ओपनसोलारिस में बॉर्न शेल स्रोत शामिल है लेकिन वह स्रोत पोर्टेबल नहीं है।

अभिलेखागार में बॉर्न शैल स्रोत का एक अनुरक्षित और अत्यधिक पोर्टेबल संस्करण यहां पाया जा सकता है schily-*.tar.bz2

यहाँ स्रोत का संबंधित हिस्सा है cmd.c:

/* 
* ^ is a relic from the days of UPPER CASE ONLY tty model 33s 
*/ 
if ((t = item(TRUE)) != 0 && (wdval == '^' || wdval == '|')) 

आप देखते हैं, यह एक विशिष्ट शेल (उदाहरण के लिए थॉम्पसन शेल) से संबंधित नहीं है, लेकिन इस तथ्य के लिए कि 1970 के दशक में अभी भी ऊपरी मामला केवल टर्मिनलों के आसपास है।

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