यश शेल में प्रिंटफ एक अंतर्निहित कमांड है या नहीं, इस बारे में थोड़ा उलझन में है


14

yashखोल एक है printfमें निर्मित, अपनी पुस्तिका के अनुसार

हालाँकि, यह वह है जो मैं yashडिफ़ॉल्ट कॉन्फ़िगरेशन वाले शेल में देखता हूं :

kk@eeyore ~ $ command -v printf
/usr/bin/printf
kk@eeyore ~ $ type printf
printf: a regular built-in at /usr/bin/printf

है printfएक इस खोल में है या नहीं में निर्मित? परिणाम कई अन्य अंतर्निहित उपयोगिताओं के लिए समान है जो बाहरी आदेशों के रूप में भी उपलब्ध हैं।

एक तुलना, के रूप में pdksh( kshOpenBSD, जहां पर printfहै नहीं एक अंतर्निहित):

$ command -v printf
/usr/bin/printf
$ type printf
printf is /usr/bin/printf

और में bash(जहां printf है एक अंतर्निहित):

$ command -v printf
printf
$ type printf
printf is a shell builtin

1
यह बिल्ट-इन - रेगुलर है , स्पेशल बिल्ट-इन नहीं है। यदि आप विशेष और नियमित रूप से निर्मित, या मानक द्वारा अनिवार्य व्यवहार के बीच के अंतर के बारे में उलझन में हैं (देखें कमान खोज और निष्पादन 1.eia) - जिसके लिए आवश्यक है कि PATHएक नियमित रूप से निर्मित के लिए एक बाइनरी मौजूद होना चाहिए निष्पादित करने के लिए - तो कृपया उस बारे में अपना प्रश्न करें।
मॉसवी

1
@mosvy यह उस मानक का एक विवरण था जो मेरे लिए अज्ञात था। यदि आप इसे उत्तर में बदलना चाहते हैं, तो मुझे खुशी होगी। मुझे नहीं लगता कि इसके लिए मुझे एक उपयुक्त उत्तर होने के लिए प्रश्न को अपडेट करने की आवश्यकता होगी, क्योंकि मैं इस विशेष विवरण से अनजान था। या मैं इसे बाद में खुद लिखूंगा।
Kusalananda

जवाबों:


14

yashखोल करता है, और उपयोग करते हैं, की एक अंतर्निहित संस्करण करता है printf(और अन्य उपयोगिताओं)। यह बहुत ही पांडित्य के रूप में होता है जिस तरह से यह command -vऔर typeआदेशों के परिणाम को तैयार करता है ।

मस्‍वीक टिप्‍पणियों के अनुसार , POSIX मानक के लिए आवश्यक है कि एक नियमित अंतर्निहित कमांड को कमांड $PATHके अंतर्निहित संस्करण के लिए बाहरी कमांड के रूप में उपलब्ध किया जाए।

यह मानक से प्रासंगिक पाठ है :

कमांड खोज और निष्पादन

यदि एक साधारण आदेश में कमांड नाम और तर्कों की एक वैकल्पिक सूची होती है, तो निम्नलिखित क्रियाएं की जाएंगी:

  1. यदि कमांड नाम में कोई <स्लैश> अक्षर नहीं हैं, तो निम्न अनुक्रम में पहला सफल कदम होगा:

    • ए। यदि कमांड नाम एक विशेष अंतर्निहित उपयोगिता के नाम से मेल खाता है, तो उस विशेष अंतर्निहित उपयोगिता को लागू किया जाएगा।

      [...]

    • इ। अन्यथा, XBD पर्यावरण चर में वर्णित PATH पर्यावरण चर का उपयोग करने के लिए कमांड की खोज की जाएगी:
      • मैं। यदि खोज सफल है:
        • ए। यदि सिस्टम ने उपयोगिता को एक अंतर्निहित बिल्ट या शेल फ़ंक्शन के रूप में लागू किया है, तो इसे पथ खोज में इस बिंदु पर लागू किया जाएगा।
        • ख। अन्यथा, शेल एक अलग उपयोगिता वातावरण में उपयोगिता को निष्पादित करता है [...]
          [...]
      • ii। यदि खोज असफल है, तो कमांड 127 की निकास स्थिति के साथ विफल हो जाएगी और शेल एक त्रुटि संदेश लिखेगा।
  2. यदि कमांड नाम में कम से कम एक <स्लैश>, [...] है

इसका मतलब है कि यह command -v printfदर्शाता है कि printfकमांड सर्च पथ में पाया गया था , जबकि आउटपुट में type printfयह जोड़ा गया है कि कमांड एक रेगुलर बिल्ट-इन है।

चूंकि printfकमांड खोज पथ में पाया गया था, और चूंकि यह एक नियमित रूप से अंतर्निहित शेल है, yashइसलिए कमांड के इसके अंतर्निहित संस्करण को कॉल करेगा । यदि पथ में नहीं मिला printfथा , और यदि शेल POSIX-ly सही मोड में चल रहा था, तो इसके बजाय एक त्रुटि उत्पन्न हुई होगी।yash

yashएक बहुत ही पोसक आज्ञाकारी खोल होने पर गर्व करता है, और यह भी सच है कि अगर हम देखें कि पोसिक्स क्या कहता हैcommand -v :

-v

मानक आउटपुट के लिए एक स्ट्रिंग लिखें, जो शेल द्वारा उपयोग किए जाने वाले पथनाम या कमांड को इंगित करता है, वर्तमान शेल निष्पादन वातावरण में ( शेल एक्ज़ेक्यूशन एनवायरनमेंट देखें ), इनवोक करने के लिए command_name, लेकिन इनवोक न करें command_name

  • उपयोगिताएँ, एक चरित्र सहित नियमित रूप से निर्मित उपयोगिताओं , और चर का उपयोग करके पाए जाने वाले किसी भी कार्यान्वयन-परिभाषित कार्य (जैसा कि कमांड सर्च एंड एक्ज़ेक्यूशन में वर्णित है ), निरपेक्ष मार्ग के रूप में लिखा जाएगाcommand_names<slash>PATH

3
क्या किसी को पता है कि अंतर्निहित कमांड को चलाने से पहले POSIX को बाहरी कमांड की आवश्यकता क्यों है?

@studog आप यह पूछना चाहते हैं कि एक अलग नए प्रश्न के रूप में, संभवतः इस उत्तर और / या प्रश्न का जिक्र है।
Kusalananda


6

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

printfएक ऐसा "नियमित" अंतर्निहित है। मूल मोड में यह हमेशा लागू होता है, भले ही उस नाम से कोई बाहरी कमांड मिली हो।

$ पैठ = / usr / बिन 
$ प्रिंटफ
प्रिंटफ: इस कमांड के लिए एक ऑपरेंड की आवश्यकता होती है
$ प्रकार प्रिंट
प्रिंटफ: एक नियमित निर्मित में / यूएसआर / बिन / प्रिंटफ
$
$ पेट = / 
$ प्रिंटफ
प्रिंटफ: इस कमांड के लिए एक ऑपरेंड की आवश्यकता होती है
$ प्रकार प्रिंट
प्रिंटफ: एक नियमित रूप से निर्मित ($ पेट में नहीं पाया गया)
$

लेकिन जब posixly-correctशेल विकल्प सेट किया जाता है तो यह केवल एक अंतर्निर्मित होता है यदि बाहरी कमांड को शेल पर पाया जा सकता है PATH

$ सेट - संगोष्ठी-सही
$
$ पैठ = / usr / बिन 
$ प्रिंटफ
प्रिंटफ: इस कमांड के लिए एक ऑपरेंड की आवश्यकता होती है
$
$ पेट = / 
$ प्रिंटफ
यश: ऐसा कोई आदेश नहीं 'प्रिंटफ'
$

यह वास्तव में एकल यूनिक्स विशिष्टता के अनुरूप है, और कम से कम 1997 के बाद से कहा है।

यह जेड शेल, 93 कोर्न शेल, बॉर्न अगेन शेल और डेबियन अल्मक्विस्ट शेल से अलग है, जिनमें से कोई भी नियमित रूप से निर्मित इंस के लिए इस तरह के व्यवहार को लागू या दस्तावेज नहीं करता है। Z शेल, उदाहरण के लिए, दस्तावेज़ जो नियमित रूप से निर्मित होते हैं , वे हमेशा खोजे जाने वाले चरण से पहले पाए जाते हैं PATH। तो भी डेबियन अल्मक्विस्ट शेल करता है। और यही वे सभी गोले हैं, भले ही shवे अपने टर्न-ऑन-पॉसिक्स विकल्पों के साथ लागू किए गए हों ।

% / बिन / निष्पादित -a श zsh -c "पथ = /; प्रकार प्रिंट; प्रिंटफ"
प्रिंटफ एक शेल बिलिन है
zsh: printf: 1: पर्याप्त तर्क नहीं
% / बिन / निष्पादित -a श ksh93 -c "पथ = /; प्रकार प्रिंट; प्रिंटफ"
प्रिंटफ एक शेल बिलिन है
उपयोग: प्रिंटफ [विकल्प] प्रारूप [स्ट्रिंग ...]
% / बिन / निष्पादन-ए श bash --posix -c "पथ = / प्रकार प्रिंटफ; प्रिंटफ"
प्रिंटफ एक शेल बिलिन है
Printf: उपयोग: printf [-v var] प्रारूप [तर्क]
% / बिन / निष्पादन-ए श डैश -c "पथ = /; टाइप प्रिंट; प्रिंटफ"
प्रिंटफ एक शेल बिलिन है
sh: 1: printf: उपयोग: printf प्रारूप [arg ...]
% 

हालाँकि, यह नहीं चल रहा है printfजब यह PATHपीडी कोर्न शेल, हिरलूम बॉर्न शेल और मीरबीडी कोर्न शेल का व्यवहार नहीं है; क्योंकि उनके पास printfपहले से बिल्ट-इन नहीं है । ☺

% / बिन / निष्पादन-ए श `आदेश -v ksh` -c" पथ = /; प्रकार प्रिंट; प्रिंट; "
प्रिंटफ नहीं मिला
श: प्रिंटफ: नहीं मिला
% / बिन / निष्पादन-ए श `आदेश -v oksh` -c" पथ = /; प्रकार प्रिंट; प्रिंट; "
प्रिंटफ नहीं मिला
श: प्रिंटफ: नहीं मिला
% / बिन / निष्पादन-ए श `आदेश -v jsh` -c" पथ = /; प्रकार प्रिंट; प्रिंट; "
प्रिंटफ नहीं मिला
श: प्रिंटफ: नहीं मिला
% / बिन / निष्पादित -a श mksh -c "PATH = /; type printf; printf"
प्रिंटफ नहीं मिला
श: प्रिंटफ: नहीं मिला
% ksh -c "टाइप करें प्रिंट; प्रिंटफ"
Printf / usr / bin / printf के लिए एक ट्रैक किया गया उपनाम है
उपयोग: प्रिंटफ प्रारूप [तर्क ...]
% oksh -c "टाइप प्रिंटफ़; प्रिंटफ़"
Printf / usr / bin / printf के लिए एक ट्रैक किया गया उपनाम है
उपयोग: प्रिंटफ प्रारूप [तर्क ...]
% jsh -c "टाइप प्रिंटफ़; प्रिंटफ़"
प्रिंटफ हैशेड (/ usr / बिन / प्रिंटफ)
उपयोग: प्रिंटफ प्रारूप [तर्क ...]
% mksh -c "टाइप करें प्रिंट; प्रिंटफ"
Printf / usr / bin / printf के लिए एक ट्रैक किया गया उपनाम है
उपयोग: प्रिंटफ प्रारूप [तर्क ...]
$

अच्छा! मेरी जानकारी के लिए शेल-विशिष्ट बिट्स को जोड़ने और पुष्टि करने के लिए धन्यवाद! मुझे यह शेल पहले से ही पसंद है।
Kusalananda

-1

शब्दांकन में सुधार किया जा सकता था।

यदि शेल पॉज़िक्स मोड में है set --posixly-correct:

PATH में मौजूद नियमित अंतर्निहित इन्स के लिए यह मुद्रित है:

pushd: a regular built-in (not found in $PATH)

जो एक स्पष्ट विवरण है: यह एक बिलिन है लेकिन PATH में एक ही नाम के साथ कोई निष्पादन योग्य नहीं है।

हालाँकि, नियमित रूप से निर्मित इन्स के लिए जो PATH में भी मौजूद है, यह मुद्रित है:

echo: a regular built-in at /bin/echo

जो, लगता है कि निष्पादन योग्य / बिन / प्रतिध्वनि निष्पादित किया जाएगा (जो नहीं होगा)। मेरा सुझाव है कि एक परिवर्तन atकरने के लिए also found in PATH at:

echo: a regular built-in also found in PATH at /bin/echo

बेहतर वर्णन करेगा। हो सकता है कि कोष्ठक में संलग्न करना (जैसा कि अन्य उत्तर में किया गया) बेहतर बना सकता है।


POSIX मोड में, कोई नियमित builtin काम करेंगे जब तक यह है भी पथ में पाया।

हालाँकि, दोनों (POSIX) विशेष:

break colon continue dot eval exec exit export
readonly return set shift times trap unset

और यश का सेमी-स्पेशल (POSIX के लिए विशेष नहीं):

alias bg cd command false fc fg getopts jobs
kill pwd read true umask unalias wait

अभी भी काम करते हैं।

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