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, ...). bashcũng có thể được coi là một thực hiện sh(xem bên dưới).
Bởi vì shlà một đặc tả, không phải là một triển khai, /bin/shlà 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ì
bashbắt đầu như một shtriể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ó bashkhô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.
bashhỗ trợ một --posixcô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/bashhầ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/shkhông trỏ đến /bin/bash(và trên một số trong đó /bin/bashcó 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 ashthự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 shlà hậu duệ của vỏ UNIX Bourne ban đầu. Solaris có cái riêng shmà 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/shcó 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ế, -Lcờ bao trùm cả symlink và hardlink, 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ợ -samefiletùy chọn, mặc dù cả GNU find và FreeBSD đều hỗ trợ nó.
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».
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/bashnế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 shvì 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 bashlà 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 shlà một ngôn ngữ lập trình rất tối giản.