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 -l
không đọc ~/.bash_profile/
.
- Có xpg_echo được bật theo mặc định. Vì vậy,
echo
hành động như thế echo -e
và 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).