`\ Time`,` t \ ime` और `\ cd` वास्तव में क्या करता है? (गोले में बैकस्लैश के साथ मज़ा)


9

/usr/bin/timeअंतर्निर्मित शेल (बैश और ज़श) के अंतर के बारे में चर्चा करते हुए time, किसी ने उल्लेख किया कि व्यक्ति \timeप्राप्त करने के लिए शॉर्टहैंड के रूप में उपयोग कर सकता है /usr/bin/time

पहले यह एक अच्छा निर्दोष शॉर्टकट की तरह लग रहा था, लेकिन फिर कुछ सवाल सामने आए:

  • t\imeकाम भी क्यों करता है?
  • \cdनिर्देशिका क्यों बदलती है, भले ही Why नहीं /usr/bin/cdकरता है?

तो जाहिर है, के \fooबराबर नहीं है $(which foo)। अब सवाल यह है:

क्या \fooकिसी गोले के पोसिक्स की परिभाषा में किसी भी तरह से बैश और ज़ीश दोनों में देखा गया व्यवहार है , और यदि ऐसा है, तो यह ऐसा क्यों करता है?


फुटनोट 1: /usr/bin/cdमेरे सिस्टम पर है,

#!/bin/sh
builtin cd "$@"

यह भी देखें unix.stackexchange.com/questions/12762/… ध्यान दें कि \ कमांड विशेष रूप से tcsh कार्यक्षमता का दस्तावेज है जो कमांड के लिए उपनामों को अनदेखा करने के लिए कहता है।
सिंपलसर

जवाबों:


14

t\imeया \cd(या "tim"eया 'cd'या ${-##*}timeया ${-+time}और के हवाले से और विस्तार आपको लगता है कि के बारे में सोच सकता है अंत में करने के लिए हल होगा की हर दूसरे संयोजन timeया cdलिखने के लिए एक और तरीका है:), वह यह है कि cdऔर time

हालाँकि, वह अंततः शेल सिंटैक्स पार्सिंग और व्याख्या के बाद cdया उसके बाद हल हो जाएगा time। विशेष रूप से, शेल कीवर्ड की मान्यता और उपनाम प्रतिस्थापन के लंबे समय बाद होता है।

इसलिए, जिस समय शेल अपनी भाषा में कीवर्ड खोज रहा है, वह शेल कीवर्ड के ti\meरूप में पहचान नहीं कर रहा है time। तो एक:

ti\me echo test

एक साधारण कमांड के बाद एक साधारण कमांड के रूप में शेल द्वारा पहचाना जाएगा time

फिर उद्धृत करने की ti\meप्रक्रिया की जाएगी (यहाँ कि बैकस्लैश उस mपात्र को उद्धृत कर रहा है, जिसे वैसे भी उद्धृत करने की आवश्यकता नहीं है, उद्धृत वर्ण हटा दिया गया है, आपको मिल जाएगा time) और एक time कमांड को किसी अन्य कमांड की तरह देखा जाएगा (बिलिन की सूची में) , कार्यों और निष्पादन योग्य फ़ाइलों में $PATH। सबसे अधिक संभावना है कि /bin/timeयहाँ होगा )

इसके लिए cd, cdशेल भाषा में कोई कीवर्ड नहीं है , बस एक cdअंतर्निहित कमांड (जो आपके ऊपर पूर्वता लेता है /usr/bin/cd)। हालांकि, यदि आप cd(जैसे alias cd=pushd) के लिए एक उपनाम को परिभाषित करते हैं, तो फिर से। जैसा कि उपनाम हटाने का काम बहुत पहले किया जाता है, उद्धरण हटाने से पहले, यदि आपके पास एक के लिए एक उपनाम है cdऔर नहीं के लिए \cd(ध्यान दें कि कई गोले उन में बैकस्लैश के साथ उपनाम की अनुमति नहीं देते हैं), तो लिखकर:

\cd dir

आप यह सुनिश्चित कर रहे हैं कि आपका cdउपनाम प्रतिस्थापित नहीं किया गया है।

संक्षेप में, एक आदेश का नाम या उसके किसी भी हिस्से के हवाले से एक खोल कीवर्ड के रूप में देखा जा रहा से रोकता है (कीवर्ड्स जा रहा है चीजों की तरह while, for, if, {... timeमें एक कीवर्ड है कुछ ही गोले), और नजरअंदाज एक उपनाम आप इसके लिए हो सकता है ।

हालांकि यह उस कमांड को एक निष्पादन योग्य फ़ाइल में हल करने के लिए मजबूर नहीं करता है $PATH, कमांड को अभी भी फ़ंक्शंस के बीच पहले खोजा जाता है (जो आप कर के आसपास काम कर सकते हैं command time cmd...) और बिल्डिंस (जो आप कर के आसपास काम कर सकते हैं env time cmd..., हालांकि मुझे नहीं पता है एक शेल जिसमें बिलिन timeकमांड होता है)।

ध्यान दें कि हवाले से भी की विशेष builtins के व्यवहार पर एक प्रभाव हो सकता है typeset/ declare/ export/ local... कुछ गोले में परिवार। देखें स्थानीय चर असाइनमेंट के लिए उद्धरण आवश्यक हैं? ब्योरा हेतु।


तो, मनाया व्यवहार में अंतर के बीच timeऔर cdजो अंतर होता है timeवह एक कीवर्ड है और cdएक अंतर्निहित कमांड है ?
जोनास शफर

1
@JonasWielicki, यह timeएक कीवर्ड है और cdयह नहीं है। (और यदि आपके पास इसके लिए एक उपनाम था cdया time, यह एक और मामला होगा)। यह cdबिल्टिन है या नहीं इस बिंदु पर कोई घटना नहीं है (जहाँ तक उद्धरण के प्रभाव का संबंध है)। कुछ गोले हालांकि कुछ बिल्टइन होते हैं जो कि खोजशब्दों और बिल्डिंग्स के बीच आधे होते हैं क्योंकि उनके पार्सिंग को अन्य बिल्डरों से अलग तरीके से किया जाता है। यही हाल है export/ typeset/ का declare। मुझे शायद इस उत्तर में इसके बारे में कुछ नोट जोड़ना चाहिए।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.