เชลล์ Bash, Bourne และ Korn รวบรวมเป็นไบนารีเดียวใน OSX หรือไม่


7

บน OSX 10.8 หากคุณเปรียบเทียบไบนารีสำหรับ bash, sh และ ksh ตัวเลือกเชลล์ที่แตกต่างกันสองสามตัวพวกเขามีขนาดเท่ากัน หากคุณนำมันมาเพิ่มเติมและcmpไบนารีดูเหมือนว่าจะมีความแตกต่างเพียงไบต์เดียวระหว่างไบนารี

ดูเหมือนว่าเผินๆแล้วจะระบุว่ารหัสทั้งหมดเพื่อสนับสนุนเชลล์ที่แตกต่างกันทั้งหมดนั้นมีอยู่ในไบนารีแต่ละตัว แต่เซตย่อยใดที่คุณสามารถเข้าถึงได้ขึ้นอยู่กับว่าเชลล์ใดที่คุณจบการทำงาน

  1. ทุกคนสามารถยืนยันได้ว่าในความเป็นจริงการรวบรวมไบนารีด้วยวิธีนี้หรือไม่?
  2. จากมุมมองของ Apple ประโยชน์ของการรวมเปลือกหอยทั้งหมดในลักษณะนี้หรือไม่?

คำตอบ:


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 -l ไม่ใช่แค่ cmp ขอบคุณ
nsg

2
ที่น่าสนใจคือ / bin / sh คือทุบตี (แม้ว่ามันจะทำงานในโหมด sh-emulation ตามชื่อ) ใน OS X เวอร์ชั่นที่ผ่านมาอาจเป็นฮาร์ดลิงก์ไปยัง / bin / bash หรือสำเนาที่เหมือนกัน แต่อย่างน้อยใน 10.8.3 จะแตกต่างกันเล็กน้อย ในทางกลับกัน / bin / ksh เป็นโปรแกรมที่แตกต่างกันอย่างแท้จริงที่เพิ่งจะมีขนาดใกล้เคียงกัน
Gordon Davisson

9

ksh และ bash นั้นแตกต่างกันอย่างสิ้นเชิง แต่ไบนารี bash และ sh นั้นส่วนใหญ่จะเหมือนกัน sh ของ OS X เป็นเวอร์ชันของ bash ที่:

  • ได้โหมด POSIXเปิดใช้งาน bash ไม่สอดคล้องกับ POSIX โดยค่าเริ่มต้น
  • มีพฤติกรรมการเริ่มต้นที่แตกต่างกัน ยกตัวอย่างเช่นไม่ได้อ่านsh -l~/.bash_profile/
  • เปิดใช้งาน xpg_echo เป็นค่าเริ่มต้น ดังนั้นechoทำหน้าที่เหมือนecho -eและไม่สนับสนุนตัวเลือกใด ๆ

FCEDIT เริ่มต้นคือ ed ใน sh แต่ EDITOR หรือ ed ใน bash:

$ 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/

จากคนทุบตี :

หากมีการเรียกใช้ bash ด้วยชื่อ sh มันจะพยายามเลียนแบบพฤติกรรมการเริ่มต้นของเวอร์ชันประวัติของ sh อย่างใกล้ที่สุดเท่าที่จะทำได้ในขณะที่สอดคล้องกับมาตรฐาน POSIX เช่นกัน

มันไม่ได้จำลองลักษณะอื่น ๆ ของกระสุน Bourne ดั้งเดิม

เชลล์ Bourne ดั้งเดิมไม่ได้รับการดูแลรักษาอีกต่อไปและตอนนี้ / bin / sh ได้ถูกกำหนดให้เป็นเชลล์อื่นที่ตรงกับ POSIX sh ของ OS X อนุญาตให้ใช้bashismsที่ไม่จำเป็นต้องทำงานกับ / bin / sh บนแพลตฟอร์มอื่น ๆ (เช่น dash บน Ubuntu)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.