Sh là gì
sh
(hoặc Ngôn ngữ lệnh Shell) là ngôn ngữ lập trình được mô tả theo tiêu chuẩn POSIX . Nó có nhiều triển khai ( ksh88
, dash
, ...). bash
cũng có thể được coi là một thực hiện sh
(xem bên dưới).
Bởi vì sh
là một đặc tả, không phải là một triển khai, /bin/sh
là một liên kết tượng trưng (hoặc một liên kết cứng) với một triển khai thực tế trên hầu hết các hệ thống POSIX.
Bash là gì
bash
bắt đầu như một sh
triển khai tương thích (mặc dù nó có trước tiêu chuẩn POSIX vài năm), nhưng khi thời gian trôi qua, nó đã có được nhiều phần mở rộng. Nhiều tiện ích mở rộng này có thể thay đổi hành vi của tập lệnh shell POSIX hợp lệ, do đó, bản thân nó bash
không phải là trình bao POSIX hợp lệ. Thay vào đó, nó là một phương ngữ của ngôn ngữ shell POSIX.
bash
hỗ trợ một --posix
công tắc, làm cho nó phù hợp hơn với POSIX. Nó cũng cố gắng bắt chước POSIX nếu được gọi là sh
.
sh = bash?
Trong một thời gian dài, /bin/sh
được sử dụng để trỏ đến /bin/bash
hầu hết các hệ thống GNU / Linux. Kết quả là, nó gần như trở nên an toàn khi bỏ qua sự khác biệt giữa hai người. Nhưng điều đó đã bắt đầu thay đổi gần đây.
Một số ví dụ phổ biến về các hệ thống /bin/sh
không trỏ đến /bin/bash
(và trên một số trong đó /bin/bash
có thể không tồn tại) là:
- Các hệ thống Debian và Ubuntu hiện đại, theo mặc định symlink
sh
đến dash
;
- Busybox , thường được chạy trong thời gian khởi động hệ thống Linux như là một phần của
initramfs
. Nó sử dụng ash
thực hiện shell.
- BSD và nói chung bất kỳ hệ thống không phải Linux nào. OpenBSD sử dụng
pdksh
, hậu duệ của vỏ Korn. FreeBSD sh
là hậu duệ của vỏ UNIX Bourne ban đầu. Solaris có cái riêng sh
mà trong một thời gian dài không tuân thủ POSIX; một triển khai miễn phí có sẵn từ dự án Gia truyền .
Làm thế nào bạn có thể tìm ra những /bin/sh
điểm trên hệ thống của bạn?
Sự phức tạp là đó /bin/sh
có thể là một liên kết tượng trưng hoặc một liên kết cứng. Nếu đó là một liên kết tượng trưng, một cách di động để giải quyết nó là:
% file -h /bin/sh
/bin/sh: symbolic link to bash
Nếu đó là một liên kết cứng, hãy thử
% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash
Trên thực tế, -L
cờ bao gồm cả liên kết tượng trưng và liên kết cứng, nhưng nhược điểm của phương pháp này là nó không khả dụng - POSIX không yêu cầu find
hỗ trợ -samefile
tùy chọn, mặc dù cả GNU find và FreeBSD đều hỗ trợ.
Dòng Shebang
Cuối cùng, tùy bạn quyết định sử dụng cái nào, bằng cách viết dòng «shebang» là dòng đầu tiên của tập lệnh.
Ví dụ
#!/bin/sh
sẽ sử dụng sh
(và bất cứ điều gì xảy ra để chỉ đến),
#!/bin/bash
sẽ sử dụng /bin/bash
nếu nó khả dụng (và không thành công với thông báo lỗi nếu không có). Tất nhiên, bạn cũng có thể chỉ định thực hiện khác, ví dụ:
#!/bin/dash
Cái nào dùng
Đối với các tập lệnh của riêng tôi, tôi thích sh
vì những lý do sau:
- nó được chuẩn hóa
- nó đơn giản và dễ học hơn nhiều
- nó có thể di động trên các hệ thống POSIX - ngay cả khi chúng không có
bash
, chúng bắt buộc phải cósh
Có những lợi thế để sử dụng bash
là tốt. Các tính năng của nó làm cho lập trình thuận tiện hơn và tương tự như lập trình trong các ngôn ngữ lập trình hiện đại khác. Chúng bao gồm những thứ như các biến cục bộ và mảng. Plain sh
là một ngôn ngữ lập trình rất tối giản.