क्या अंतर है: और सच?


15

इन bash:

$ type :
: is a shell builtin
$ type true
true is a shell builtin

ऐसा लगता है कि वे समान हैं, लेकिन वे समान सिस्टम ट्रेस नहीं देते हैं:

$ strace :
strace: :: command not found
$ strace true
execve("/bin/true", ["true"], [/* 82 vars */]) = 0
[snip]
exit_group(0)                           = ?

मैंने अलग करने की कोशिश की strace bash -c : 2>:.txtऔर strace bash -c true 2>true.txt, लेकिन स्मृति स्थानों को छोड़कर उनके बीच कोई अंतर नहीं पाया।

इन dash:

$ type :
: is a special shell builtin
$ type true
true is a shell builtin

ठीक है, इसलिए वे समान नहीं हैं। help :और help trueबहुत उपयोगी नहीं हैं, और वे में एक ही लौटने bashऔर dash। क्या उन सभी के बीच कोई व्यावहारिक अंतर है, सिवाय इसके कि :तीन बाइट्स बचाता है और स्क्रिप्ट को कम पठनीय बनाता है?


जवाबों:


27

व्यवहार में कोई वास्तविक अंतर नहीं है। दोनों आदेश कुछ भी नहीं करते हैं और एक सफल स्थिति के साथ बाहर निकलते हैं। :कुछ न करने पर जोर देता है; trueसफल स्थिति पर जोर देता है।

strace trueकाम करता है क्योंकि trueदोनों शेल बिलिन और एक बाहरी कमांड ( /bin/true) है; :केवल एक शेल बिल्डिन है ( /bin/:हालांकि कोई - हालांकि वहाँ नहीं हो सकता है, और शायद बहुत पुरानी यूनिक्स प्रणालियों पर था)। बैश में, प्रयास करें

type -a :
type -a true

दोनों के अस्तित्व के कारण ऐतिहासिक हैं। यदि मुझे सही ढंग से याद है, तो कुछ बहुत ही शुरुआती गोले में एक टिप्पणी वाक्यविन्यास नहीं था, इसलिए :इसके बजाय डू-कुछ कमांड का उपयोग नहीं किया गया था।

में कुछ आंतरिक अंतर है dash। स्रोत के माध्यम से देख रहे हैं, git: //git.kernel.org/pub/scm/utils/dash/dash.git पर उपलब्ध है, कुछ अलग कोड पथ दिखाता है eval.c, लेकिन मैं किसी भी अलग तरह का व्यवहार करने में सक्षम नहीं हूं specialके आउटपुट में शब्द से type :


8
इसके अतिरिक्त, UNIX के शुरुआती संस्करणों में /bin/trueया नहीं था /bin/false। इसके अलावा :आदेश कभी कभी तर्क प्रसंस्करण साइड इफेक्ट के लिए प्रयोग किया जाता है: : ${num_times:=10}
Arcege

5
:था मूल रूप से एक लेबल सूचक , बॉर्न शैल था कि के एक पूर्वज में वापस आ गया goto। स्पष्ट :रूप से एक टिप्पणी संकेतक के रूप में दुर्व्यवहार किया गया था और अटक गया था।
गिलेस एसओ- बुराई को रोकना '

1
:गोटो के लिए एक लेबल संकेतक के रूप में व्यवहार माइक्रोसॉफ्ट के छद्म-यूनिक्स कमांड लाइन क्लोन में संरक्षित किया गया था command.com, और इसके उत्तराधिकारी में रहता है cmd.exe, जैसा कि ::एक लाइन टिप्पणी के लिए दुर्व्यवहार करने का अभ्यास करता है ।
सोरपीगल

8

वे बैश में समान हैं। को देखो builtins/colon.defबैश-4.2 स्रोत कोड में।

आपकी आज्ञा में strace trueआप वास्तव /bin/trueमें बिल्ट-इन ट्रू के बजाय बाइनरी चला रहे हैं ।

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