क्या बैश, बॉर्न और कोर्न के गोले OSX में एक बाइनरी में संकलित हैं?


7

OSX 10.8 पर, यदि आप बैश की तुलना bash, sh और ksh, कुछ अलग शेल विकल्पों के लिए करते हैं, तो वे समान आकार के होते हैं। यदि आप इसे और cmpबायनेरिज़ के रूप में लेते हैं , तो बायनेरिज़ के बीच केवल एक-बाइट अंतर प्रतीत होता है।

यह सतही संकेत देता है कि सभी अलग-अलग गोले का समर्थन करने के लिए सभी कोड प्रत्येक बाइनरी में उपलब्ध हैं, लेकिन आपके पास कौन सा उप-भाग है, यह निर्भर करता है कि आप किस शेल को निष्पादित कर रहे हैं।

  1. क्या कोई इस बात की पुष्टि कर सकता है कि बायनेरिज़ वास्तव में इस तरह संकलित हैं?
  2. एप्पल के दृष्टिकोण से, क्या इस तरह से सभी गोले के संयोजन में उनका कोई लाभ है?

जवाबों:


4

मुझे लगता है कि आपकी बुनियादी धारणा गलत है। 10.8.3 पर जाँच:

pse@Fourecks:~$ ls -l $(type -p sh bash ksh)
-r-xr-xr-x  1 root  wheel  1333920 Oct 16  2012 /bin/bash*
-r-xr-xr-x  1 root  wheel  1380304 Oct 16  2012 /bin/ksh*
-r-xr-xr-x  1 root  wheel  1334000 Oct 16  2012 /bin/sh*
pse@Fourecks:~$ cmp -l $(type -p sh bash) | wc -l
cmp: EOF on /bin/bash
 1138124
pse@Fourecks:~$ cmp -l $(type -p sh ksh) | wc -l
cmp: EOF on /bin/sh
 1238180

तकनीकी रूप से बोलने के बीच shऔर bash(और बाद में भी ऐसा व्यवहार करने के लिए बनाया जा सकता है sh) के बीच कुछ समानताएं हैं, लेकिन kshनिश्चित रूप से एक अलग स्रोत आधार से आ रहा है:


अरे हाँ, आप निश्चित रूप से सही हैं; सिर्फ cmp की बजाय cmp -l को देखना चाहिए था। धन्यवाद।
एनएसजी

2
दिलचस्प है, / बिन / श वास्तव में बैश है (हालांकि यह नाम के आधार पर श-एमुलेशन मोड में चलेगा)। OS X के कुछ पिछले संस्करणों में यह / बिन / बैश या एक समान प्रतिलिपि के लिए एक कड़ी है, लेकिन कम से कम 10.8.3 में यह थोड़ा अलग है। दूसरी ओर, बिन / ksh, वास्तव में एक अलग कार्यक्रम है जो बस उसी आकार के बारे में होता है।
गॉर्डन डेविसन

9

ksh और bash पूरी तरह से अलग हैं, लेकिन bash और sh binaries अधिकतर समान हैं। OS X का बाश का एक संस्करण है:

  • है POSIX मोड सक्षम होना चाहिए। bash डिफ़ॉल्ट रूप से POSIX का अनुपालन नहीं करता है।
  • अलग-अलग स्टार्टअप व्यवहार है। उदाहरण के लिए sh -lपढ़ता नहीं है ~/.bash_profile/
  • डिफ़ॉल्ट रूप से xpg_echo सक्षम है। इसलिए echoकाम करता है echo -eऔर यह किसी भी विकल्प का समर्थन नहीं करता है।

डिफ़ॉल्ट FCEDIT sh में EDITOR या ed में ed है:

$ diff -y --suppress-common-lines -W 80 <(strings /bin/bash) <(strings /bin/sh)
                                      > /bin/bash
${FCEDIT:-${EDITOR:-ed}}              | ${FCEDIT:-ed}
@(#)PROGRAM:bash  PROJECT:bash-86.1   | @(#)PROGRAM:sh  PROJECT:bash-86.1
$ grep -rF '${FCEDIT:-${EDITOR:-ed}}' ~/Code/Source/bash-86.1/
bash-86.1/bash-3.2/builtins/fc.c:#  define POSIX_FC_EDIT_COMMAND "${FCEDIT:-${EDITOR:-ed}}"
bash-86.1/bash-3.2/builtins/fc.def:#  define POSIX_FC_EDIT_COMMAND "${FCEDIT:-${EDITOR:-ed}}"

स्रोत http://opensource.apple.com/tarballs/ से डाउनलोड किया जा सकता है ।

से आदमी पार्टी :

यदि बैश को नाम श के साथ लगाया जाता है, तो यह पोस मानक के अनुरूप होने के साथ-साथ यथासंभव समीप के ऐतिहासिक संस्करणों के स्टार्टअप व्यवहार की नकल करने की कोशिश करता है।

हालांकि यह मूल बॉर्न गोले के अन्य पहलुओं का अनुकरण नहीं करता है।

मूल बॉर्न शेल अब बनाए नहीं हैं, और / बिन / श अब कुछ अन्य शेल होने का मतलब है जो सिर्फ पोसिक्स का अनुपालन करता है। ओएस एक्स की शश उन बशियों का उपयोग करने की अनुमति देता है जो जरूरी नहीं कि अन्य प्लेटफार्मों पर / बिन / श के साथ काम करें (जैसे उबंटू पर डैश)।

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