Các shell Bash, Bourne và Korn có được biên dịch thành một nhị phân trong OSX không?


7

Trên OSX 10.8, nếu bạn so sánh các nhị phân cho bash, sh và ksh, một vài tùy chọn shell khác nhau, chúng có cùng kích thước. Nếu bạn đưa nó đi xa hơn và cmpcác nhị phân, dường như chỉ có một sự khác biệt một byte giữa các nhị phân.

Bề ngoài này dường như chỉ ra rằng tất cả các mã để hỗ trợ tất cả các shell khác nhau đều có sẵn trong mỗi nhị phân, nhưng tập hợp con nào bạn có quyền truy cập tùy thuộc vào shell nào bạn kết thúc thực thi.

  1. Bất cứ ai cũng có thể xác nhận rằng các nhị phân trên thực tế được biên dịch theo cách này?
  2. Theo quan điểm của Apple, liệu có lợi ích gì trong việc kết hợp tất cả các vỏ theo cách này không?

Câu trả lời:


4

Tôi nghĩ rằng giả định cơ bản của bạn là sai. Kiểm tra ngày 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

Về mặt kỹ thuật, có một số điểm tương đồng giữa shbash(và sau này cũng có thể được thực hiện để hành xử như thế sh) nhưng chắc chắn kshđến từ một cơ sở nguồn khác nhau:


Ồ vâng, bạn chắc chắn đúng; nên nhìn vào cmp -l chứ không chỉ cmp. Cảm ơn.
NSG

2
Thật thú vị, / bin / sh thực sự bash (mặc dù nó sẽ chạy trong chế độ giả lập sh dựa trên tên). Trong một số phiên bản trước đây của OS X, nó là một liên kết cứng đến / bin / bash hoặc một bản sao giống hệt nhau, nhưng ít nhất là trong 10.8.3, nó hơi khác một chút. / bin / ksh, mặt khác, là một chương trình thực sự khác biệt chỉ có cùng kích thước.
Gordon Davisson

9

ksh và bash hoàn toàn khác nhau, nhưng nhị phân bash và sh hầu hết giống hệt nhau. OS X's sh là phiên bản bash:

  • Đã bật chế độ POSIX . bash không tuân thủ POSIX theo mặc định.
  • Có hành vi khởi động khác nhau. Ví dụ sh -lkhông đọc ~/.bash_profile/.
  • Có xpg_echo được bật theo mặc định. Vì vậy, echohành động như thế echo -evà nó không hỗ trợ bất kỳ tùy chọn.

FCEDIT mặc định là ed trong sh nhưng EDITOR hoặc ed in 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}}"

Nguồn có thể được tải xuống từ http://opensource.apple.com/tarballs/ .

Từ người đàn ông bash :

Nếu bash được gọi với tên sh, nó sẽ cố gắng bắt chước hành vi khởi động của các phiên bản lịch sử của sh càng gần càng tốt, đồng thời tuân thủ tiêu chuẩn POSIX.

Nó không mô phỏng các khía cạnh khác của vỏ Bourne ban đầu.

Các vỏ Bourne ban đầu không còn được duy trì và / bin / sh giờ đây có nghĩa là một số vỏ khác chỉ tuân thủ POSIX. Sh của OS X cho phép sử dụng bashism không nhất thiết phải hoạt động với / bin / sh trên các nền tảng khác (như dấu gạch ngang trên Ubuntu).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.