क्या है / बिन / डैश?


27

मुझे लगा कि /bin/shमेरी पसंद का खोल है। मैंने हमेशा उपयोग किया है bash, इसलिए मैंने मान लिया कि /bin/shयह इंगित करेगा /bin/bash। हालांकि, यह पता चलता है कि यह इंगित करता है /bin/dash

यह मजेदार हो जाता है। मैं शुरू करता हूं dashऔर करता हूं echo $SHELLऔर यह प्रिंट करता है /bin/bash(इसलिए वे मूल रूप से एक ही हैं?)। हालाँकि, का आदमी पृष्ठ, के पुरुष पृष्ठ से dashपूरी तरह से अलग है bash(इसलिए वे समान नहीं हैं !)।


1
@wzzrd, क्या यह प्रश्न linux-specific है?
.ओबोबेक्ट

1
उच्छ्वास, मैं इन सभी अच्छे उत्तरों को नहीं बढ़ा सकता, क्योंकि मुझे 15 प्रतिनिधि चाहिए। मैं विकलांग महसूस करता हूं क्योंकि मेरे पास
स्टैकओवरफ्लो

4
mmm डैश .. क्या / बिन / दुर्घटना (gdb प्रशंसकों के लिए), / बिन / स्लैश (तपस्या कार्यक्रम), / बिन / मैश (कोरिया में कठिन समय), / बिन / सैश (चीयरलीडर्स के लिए), / बिन / थ्रैश (अपने HDD पर कठोर), / बिन / फ्लैश (लेकिन केवल अगर आप अपने डेटा को एन्क्रिप्ट करते हैं), / बिन / स्लैश (बाद में इसे पाने का सौभाग्य), / बिन / नकद (आप हमेशा-में-पैसा हैं), / बिन / पाश (पीसी रोमांस करना), / बिन / गश (अनगरग!)।
पीपी।

2
@PP - मैं धातु संगीत प्रशंसकों के लिए / बिन / थ्रैश पढ़ूंगा, और 80 के रॉक बैंड लीड गिटारवादकों के प्रशंसकों के लिए बिन / स्लेश ... :-P
gWaldo

1
कारण echo $SHELLप्रिंट /bin/bashक्योंकि उस चर जब आप वर्तमान खोल आप चला रहे हैं के बजाय के लिए लॉग इन डिफ़ॉल्ट खोल कि शुरू होता है के लिए सेट कर दिया जाता है। बैश प्रॉम्प्ट से ksh या zsh शुरू करें और echo $SHELLफिर भी कहेंगे /bin/bashpsवर्तमान में क्या चल रहा है, यह देखने के लिए उपयोग करें ।
अगली सूचना तक रोक दिया गया।

जवाबों:


43

डेबियन और उबंटू कुछ चीजों की वजह से डैश (iirc) में चले गए। सबसे पहले, बैश वर्षों में बड़ा हो गया है। वास्तव में, /bin/bashमेरे उबंटू 8.04 सिस्टम पर बाइनरी लगभग दस गुना (!) जितना बड़ा है /bin/dash। अब, यह दिन-प्रतिदिन शेल के उपयोग के लिए ज्यादा मायने नहीं रखता है, लेकिन यह निम्न स्थितियों में मायने रखता है:

  • डैश बहुत छोटा है और इस तरह यह तेजी से लोड होता है, जो init- स्क्रिप्ट के लिए एक वरदान है। यदि आपको उनमें से कई को शुरू करना है, तो हर बार बैश के बजाय डैश लोड करना, चीजों को काफी गति देना।
  • डैश के छोटे आकार के कारण, डेबियन और उबंटू अपने initrd के आकार का एक बहुत बड़ा हिस्सा निकालने में सक्षम हैं, अन्य सामान के लिए अधिक जगह छोड़ते हैं (और फिर से, चीजों को तेज करते हुए)।

स्क्रीप्टिंग के लिए बैश के बजाय डैश का उपयोग करने का नकारात्मक पक्ष यह है कि बहुत से लोग केवल बैश है, तथाकथित बशीज़ के लिए सिंटैक्टिकल निकेट्स का उपयोग करते हैं । बश्मि के उदाहरण इस प्रकार हैं:

echo $SHELL
/bin/bash
a=1234567890
echo ${a}
1234567890
echo ${a:3}
4567890
echo ${a:3:1}
4

और इस:

echo ${a#123}
4567890

दूसरी ओर, डैश का मुख्य रूप से उद्देश्य POSIX आज्ञाकारी होना चाहिए (और इससे अधिक नहीं), यदि आप यह कोशिश करते हैं तो आपको एक खराब सबस्टेशन त्रुटि देगा:

echo $SHELL
/bin/dash 
# actually, it will read /bin/bash above, because if you just run dash
# it will not set the $SHELL variable :)
a=1234567890
echo ${a}
1234567890
echo ${a:3}
dash: Bad substitution

यह तब होगा जब आप अपने गोले के लिए दुभाषिया के रूप में /bin/sh(और इसलिए dash) उपयोग करते हैं और उनमें बश्मि का उपयोग करते हैं। डेबियन और उबंटू के पास बशीज़ के बारे में अच्छे विकी पृष्ठ हैं और वे सामान्य रूप से गोले में खराब क्यों हैं और विशेष रूप से इनिट-स्क्रिप्ट। इसलिए, आपको सचेत रूप से यह चुनना चाहिए कि आपको अपनी स्क्रिप्ट के लिए इंटरप्रेटर की आवश्यकता है /bin/shया नहीं /bin/bash

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


1
यदि आप बशीज़ के साथ स्क्रिप्ट लिखते हैं, तो कृपया निर्दिष्ट करें /bin/bash; कई गैर-लिनक्स प्रणालियों में वास्तविक shगोले होते हैं जो संगत के करीब भी नहीं होते हैं bash
क्रिस एस

echo ${a#123}बशीवाद नहीं है, यह POSIX पैरामीटर विस्तार युक्ति का हिस्सा है। pubs.opengroup.org/onlinepubs/009695399/utilities/… आपको बस अधिक उन्नत सेड शैली वाले बैश नहीं मिलते हैं, पॉज़िक्स वाले स्टाइल + सरल विस्तार वर्णों को प्रतिस्थापित कर रहे हैं। मतलब, POSIX भी अनुमति देता हैecho ${a#*6}
JM बेकर


1

डैश एक हल्का बैश रिप्लेसमेंट है, मान लीजिए कि आप उबंटु का उपयोग करते हैं जो कुछ साल पहले बदल गया था।

यह बहुत अच्छा नहीं है, हालांकि,। http://forums.debian.net/viewtopic.php?f=20&t=45116


0

चूँकि सभी गोले सेट $SHELLहोने पर नहीं चलते हैं, आप अपने वर्तमान शेल का पता लगाते हैं:

echo $0

यदि यह एक त्रुटि देता है, तो यह csh है, अन्यथा यह argv[0]आप के साथ लागू किया गया था, जो आमतौर पर शेल है, शायद एक अग्रणी -हाइफ़न के साथ, यह इंगित करने के लिए कि यह एक लॉगिन शेल है।

इसकी गारंटी नहीं है , क्योंकि argv[0]यह इनवोकेशन प्रक्रिया के नियंत्रण में है, लेकिन यह सबसे विश्वसनीय दृष्टिकोण है।

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