क्या शेल को बेकार समाप्ति आदेशों का अनुकूलन करने की अनुमति है?


27

यदि शेल को समाप्त करने के लिए ज्ञात एक बेकार ( या आंशिक रूप से बेकार ) कमांड करने के लिए कहा जाता है, जैसे कि cat hugeregularfile.txt > /dev/null, क्या यह उस कमांड के निष्पादन को छोड़ सकता है ( या एक सस्ता समकक्ष को निष्पादित कर सकता है, कह सकता है touch -a hugeregularfile.txt )?

आम तौर पर, सी कंपाइलर के समान शेल होता है, जो स्रोत कोड पर कोई भी परिवर्तन कर सकता है, इसलिए जब तक कि बाहरी रूप से अवलोकन योग्य व्यवहार नहीं होता है, अगर सार मशीन ने इसका मूल्यांकन किया है?

संपादित करें

नोटा नेने: मेरे प्रश्न के रूप में मूल रूप से पेश किए गए एक शीर्षक में पूछा गया था कि क्या शेल को इन अनुकूलन करने की अनुमति है, न कि यह कि क्या होना चाहिए या क्या कार्यान्वयन जो उन्हें कर सकते हैं। मुझे अभ्यास से अधिक सिद्धांत में दिलचस्पी है, हालांकि दोनों का स्वागत है।


नहीं, शेल आधुनिक संकलक जितना स्मार्ट नहीं है । वास्तव में, यह बल्कि गूंगा है। यह किसी भी बेकार कोड का अनुकूलन नहीं करेगा।
devnull

12
यह अनुमान लगाते हुए कि उपयोगकर्ता का इरादा कुछ ऐसा नहीं है जो शेल को करना चाहिए। उपयोगकर्ता उस आदेश के साथ लगभग कुछ भी करने की कोशिश कर सकता है, यह अनुकूलन करना गलत काम करना होगा, भले ही यह संभव था।
क्रिस डाउन

1
कोई बात नहीं कह रही है कि अगर फ़ाइल एक डिवाइस थी तो catइसे टिंग करने से बहुत फर्क पड़ता है। शेल यह जान सकता है कि फ़ाइल एक उपकरण है, लेकिन इसे विश्वसनीय होने की आवश्यकता नहीं है।
यो '

3
@StephaneChazelas C संकलक को अपने संकलित कार्यक्रमों को अनुकूलित करने के लिए "किसी से अनुमति माँगने" की आवश्यकता नहीं है; सी मानक में एक ऐसा -अगर नियम है जो उन्हें ऐसा करने की अनुमति देता है। POSIX मानक कम से कम एक शेल ( pubs.opengroup.org/onlinepubs/009695399/utilities/… ) के साथ-साथ कई अन्य उपयोगिताओं ( pubs.opengroup.org/onlinepubs/009604499/utilities/wc.html) के लिए मानकीकृत प्रतीत होता है wc, उदाहरण के लिए)। लेकिन मेरे ज्ञान का सबसे अच्छा करने के लिए POSIX शेल अनुकूलन पर एक स्थिति नहीं लेता है; या करता है?
इविलनोटिक्सिस्ट इडोनोटेक्सिस्ट

2
अनुकूलन कार्यक्षमता को प्रभावित किए बिना शॉर्टकट के साथ प्रदर्शन में सुधार कर रहा है। जब तक कार्यक्षमता की गारंटी होती है, मैं POSIX पर आपत्ति नहीं जता सकता। आपका प्रस्तावित अनुकूलन हालांकि बिल्ली की कल्पना को तोड़ देगा । POSIX कल्पना में विशिष्ट प्रकार के शब्द हैं जो किए गए अनुकूलन के प्रकार को समायोजित करने के लिए हैं ksh। जैसे वे फोर्क-सेविंग ऑप्टिमाइज़ेशन की अनुमति देने के लिए अलग-अलग प्रक्रिया नहीं बल्कि पर्यावरण को कम करते हैं।
स्टीफन चेज़लस

जवाबों:


26

नहीं, यह एक बुरा विचार होगा।

cat hugeregularfile.txt > /dev/nullऔर touch -a hugeregularfile.txtसमान नहीं हैं। catयदि आप आउटपुट को रीडायरेक्ट करते हैं, तो भी पूरी फ़ाइल पढ़ेगी /dev/null। और पूरी फाइल को पढ़ना ठीक वैसा ही हो सकता है जैसा आप चाहते हैं। उदाहरण के लिए इसे कैश करने के लिए ताकि बाद में पढ़ने में काफी तेजी आए। शेल आपके इरादे को नहीं जान सकता।

इसी तरह, एक सी कंपाइलर कभी भी फ़ाइल पढ़ने का अनुकूलन नहीं करेगा, भले ही आप पढ़े गए सामान को न देखें।


2
@Iwillnotexist: हर उपयोगी आदेश (यकीनन को छोड़कर trueऔर false) संभावित दुष्प्रभावों है, और दुष्प्रभाव लगभग हमेशा आदेश लागू की बात कर रहे हैं। शेल catहॉल्टिंग समस्या को हल किए बिना उन दुष्प्रभावों को पहले से नहीं जान सकता (जैसे बाहरी कार्यक्रमों के लिए )। तो यह सही कोशिश नहीं करता है, और आपको लगता है कि आपने क्या कहा था।
cHao

5
@IwillnotexistIdonotexist नहीं, शेल वह सब नहीं देख सकता है जो होने वाला है। इसका कोई पता नहीं है cat। वास्तव में, catइंटरनेट डाउनलोड करने के लिए अपनी हार्ड ड्राइव को प्रारूपित करने से कुछ भी कर सकता है।
स्काइ

5
"यूनिक्स को अपने उपयोगकर्ताओं को बेवकूफ चीजें करने से रोकने के लिए नहीं बनाया गया था, क्योंकि यह उन्हें चतुर चीजें करने से भी रोक देगा।" - डग ग्विन
एगी हैमरथिफ

7
@cHao और भी trueऔर falseसेट $?
काइल स्ट्रैंड

3
जैसा कि @scai ने ऊपर बताया, निष्पादनयोग्य भाषा के कीवर्ड की तरह नहीं हैं: catऔर /dev/nullउनके विशिष्ट अर्थ हैं, लेकिन वे इस तरह से व्यवहार करने की गारंटी नहीं देते हैं । अपेक्षित व्यवहार में कोई बदलाव की गारंटी नहीं देते हुए अनुकूलन करने के लिए, अनुकूलन को केवल शेल के भीतर कार्यान्वित किए गए निर्माणों को शामिल करने की अनुमति दी जा सकती है और निष्पादन वातावरण में पाए जाने वाली चीजें नहीं ... उनके नाम भले ही सहज हों।
andbuckley

20

नहीं, चूंकि /dev/nullकेवल एक नाम है, जिसका उपयोग किसी अन्य डिवाइस के लिए या "सामान्य रूप से" के अलावा किसी फ़ाइल के लिए किया जा सकता है जो डेटा सिंक है।

तो एक शेल (या किसी अन्य प्रोग्राम) का कोई पता नहीं है, नाम के आधार पर, चाहे वह फाइल जो लिख रहा है वह डेटा के साथ "वास्तविक के लिए" कुछ कर रहा है। AFAIK भी हैं कोई सिस्टम कॉल नहीं करता है शेल प्रोग्राम बना सकता है, यह निर्धारित करने के लिए कि उदाहरण के लिए फ़ाइल विवरणक वास्तव में कुछ भी नहीं कर रहा है।

C प्रोग्राम में कोड को दूर करने के साथ आपकी तुलना काम नहीं करती है, क्योंकि शेल में कुल ओवरव्यू नहीं होता है जो C कंपाइलर के स्रोत कोड के एक टुकड़े पर होता है। एक शेल /dev/nullआपके उदाहरण को दूर अनुकूलित करने के लिए पर्याप्त नहीं जानता है, जैसे कि एक सी कंपाइलर फ़ंक्शन के कोड के बारे में पर्याप्त नहीं जानता है जो इसे कॉल करने के लिए गतिशील रूप से लिंक करता है।


4
जैसा कि यह पता चला है, ksh93 /dev/nullविशेष रूप से, कभी-कभी इलाज करेगा । एक बिल्टिन जिसका स्टैडआउट करने के लिए निर्देशित है /dev/null, उदाहरण के लिए , echo foo >/dev/nullकिसी भी लेखन में परिणाम नहीं होगा /dev/null। यदि यह किसी गैर-निर्मित कमांड (जैसे cat file >/dev/null) को लागू कर रहा है तो यह कुछ खास नहीं करता है ।
मार्क प्लॉटनिक

तथ्य की बात, catकुछ और भी हो सकता है। वास्तव में कुछ और।
ओरियन

3
असल में /dev/nullबहुत कुछ में से एक है मानकीकृत पथ , के साथ-साथ /dev/tty, /dev/console, /tmp, /dev/और /
गिल्स एसओ- बुराई को रोकें '

2
@MarkPlotnick वास्तव cat में एक ksh93 बिल्टिन है (जब तक आप (या जहां भी उपलब्ध हो) /opt/ast/binसे पहले नहीं डाला जाता है )। और हां, हालांकि उस बिल्टइन की सामग्री के साथ , यह इसे / dev / null को नहीं लिखता है (हालांकि यह खुलता है और इसे fstats करता है)। /bincat$PATHcat file > /dev/nullreadfile
स्टीफन चेज़लस

14

यह रनिंग कमांड को ऑप्टिमाइज़ नहीं करेगा (और आपको पहले से ही कई बढ़िया जवाब मिल गए हैं, जो आपको बताएंगे कि ऐसा क्यों नहीं करना चाहिए), लेकिन यह फोर्क, पाइप / सॉकेटकेस को ऑप्टिमाइज़ कर सकता है, कुछ मामलों में पढ़ता है। इस प्रकार के अनुकूलन जो कर सकते हैं:

  • अधिकांश आधुनिक गोले के साथ, एक स्क्रिप्ट में अंतिम कमांड को आमतौर पर शेल की प्रक्रिया में निष्पादित किया जाएगा जब तक कि कुछ trapएस सेट नहीं किए गए हों। में उदाहरण के लिए sh -c ls, सबसे shकार्यान्वयन ( bash, mksh, ksh, zsh, yash, के कुछ संस्करणों ash) चलाने के लिए एक प्रक्रिया बांट नहीं होगा ls
  • में ksh93, कमांड प्रतिस्थापन एक पाइप या कांटा नहीं बनायेगा जब तक कि एक बाहरी कमांड नहीं कहा जाता है ( $(echo foo)उदाहरण के लिए fooबिना पाइप / सॉकेटपेयर या कांटा के विस्तार होगा )।
  • readकुछ गोले ( bash, एटी एंड टी ksh) के बिल्ट-इन में एकल-बाइट रीड्स नहीं होंगे यदि वे पता लगाते हैं कि स्टैडेन खोजी है (जिस स्थिति में वे बड़े रीड्स करेंगे और जो वे पढ़ने के लिए हैं, उसके अंत में वापस तलाश करेंगे)।

मुझे यह उत्तर पसंद है, लेकिन यह स्पष्ट नहीं है कि क्या यह मूल कारण है, या क्या जानकारी कुछ संदर्भ से ली गई है (जो कि मैं इसमें देना चाहूंगा)
yoniLavi

3
@yoniYalovitsky, यह मूल कारण हैksh93वह शेल है जो ऑप्टिमाइज़ेशन के मोर्चे पर आगे बढ़ रहा है क्योंकि इसका उद्देश्य प्रोग्रामिंग भाषाओं के बराबर है perl। तो आप kshआगे की जानकारी के लिए दस्तावेज़ीकरण, कोड (सौभाग्य) और मेलिंग सूची देख सकते हैं ।
स्टीफन चेजलस

1
@HenkLangeveld, हाँ, आप यह सत्यापित कर सकते हैं कि किसके साथ sh -c 'ps -p "$$"'आप देंगे psऔर shउन shकार्यान्वयनों के साथ नहीं , या स्ट्रेस / ट्रस / tusc के साथ ...
स्टीफन चेज़लस

1
बीच ksh -c 'ps; ps'और बैश -c 'ps; ps' का अंतर दिलचस्प है। Ksh93 इसके अनुकूलन में आगे बढ़ता है।
हेंक लैंगवेल्ड

1
@HenkLangeveld, निर्भर करता है कि kshहम किस कार्यान्वयन के बारे में यहां बात कर रहे हैं। mkshजैसा व्यवहार करता है bash। वह व्यवहार ज्यादातर चीजों को अनुकूलित करने के लिए होता है system("some command")। ध्यान दें कि जब एक सिग्नल (कुछ गोले में) द्वारा समाप्त प्रक्रियाओं की निकास स्थिति की बात आती है तो उस अनुकूलन का एक पक्ष प्रभाव होता है। ksh93में एक बग है कि यह जाल सेट किया गया था जब भी अनुकूलन कर रहा था।
स्टीफन चेजालस

7

देखते समय cat hugeregularfile.txt > /dev/null, शेल को यह विश्वास करने की अनुमति नहीं है कि कार्रवाई बेकार है - catशेल का हिस्सा नहीं है और सिद्धांत रूप में, और व्यवहार में भी कुछ भी कर सकता है।

उदाहरण के लिए, उपयोगकर्ता ने निष्पादन योग्य rmका नाम बदल दिया हो सकता है cat, और अचानक लाइन बाहरी रूप से देखने योग्य व्यवहार करता है, अर्थात, फ़ाइल को हटा रहा है।

हो सकता है कि उपयोगकर्ता ने एक संस्करण संकलित किया हो cat, जो अनंत लूप में जाता है, इस प्रकार शेल यह नहीं मान सकता है कि जैसा कि आप सुझाव देते हैं कि इसे 'समाप्त करने के लिए जाना जाता है'।

हो सकता है कि किसी ने catइरादा के रूप में काम करने का एक संस्करण स्थापित किया हो , लेकिन रूटकिट स्थापित करने के एक अतिरिक्त दुष्प्रभाव के साथ यदि यह कभी पर्याप्त विशेषाधिकार के साथ चलता है - फिर से, शेल को इसे विधिवत निष्पादित करना चाहिए।


2
असल में, वास्तव mkshमें V=$(cat file)यह एक बिलिन बनाकर अनुकूलन करता है । इसलिए शेल इसे बाहर अनुकूलित कर सकता है, लेकिन इसे केवल एक में रूपांतरित नहीं कर सकता है touch -a
स्टीव शानेप

1
@SteveSchnepp, एक बिल्टिन cat हैmksh , लेकिन यह बिलिन सिस्टम में रिसोर्ट में जाता है catयदि कोई विकल्प पास किया जाता है, जो कि GNU के साथ है cat, mksh -c 'cat /dev/null --help'तो वही परिणाम नहीं देता है bash -c 'cat /dev/null --help', लेकिन mksh -c 'cat --help /dev/null'आपको बिलकुल वैसा ही मिलता है bash -c 'cat --help /dev/null'(जैसा कि mkshकैट बिलिन नर्स विकल्प POSIX को देता है। जिस तरह से, ग्नू बिल्ली उन्हें ग्नू रास्ता देती है)।
स्टीफन चेज़लस

बैश और ksh93 में, के V=$(cat file)साथ अनुकूलित किया जा सकता है V=$(< file)। यह बिना बिल्टिन के भी चीजों को गति देता है cat
हेन्क लैंगवेल्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.